Возврат двоюродных братьев в Neo4j проблема с WHERE

#neo4j #cypher

#neo4j #cypher

Вопрос:

Я должен сделать запрос Cypher, который должен возвращать двоюродных братьев человека (братьев, сестер, детей братьев / сестер). Это работает почти нормально, но проблема в том, что, когда я хочу отфильтровать детей человека (27003) (precious) , WHERE p2.personId<>27003 он также удаляет мать человека (missing) .

Что я здесь сделал не так?

Мой запрос cypher:

 MATCH (p: Person_kol)<-[]-(parent: Person_kol) WHERE p.idPerson=27003
WITH p,parent
MATCH (p3: Person_kol)<-[]-(p2: Person_kol)<-[]-(parent: Person_kol)
WHERE p2.idPerson<>27003
RETURN p,parent,p3,p2
 

Мое первое совпадение просто возвращает человека с заданным идентификатором с его / ее родителем.

Второе совпадение просто ищет братьев / сестер и его / ее детей (я знаю, что p2 также включает человека с id = 27003 и его / ее детей, поэтому я хочу их отфильтровать, но мое «ГДЕ» также удаляет мать человека (2-я картинка)

Фотографии:

  1. (без предложения WHERE)

текст

  1. (с WHERE)

текст

Ответ №1:

Ваше второе предложение match требует, чтобы parent у него был внук p3 , чей родитель не precious является. Поскольку missing на первом изображении у нее нет внуков, соответствующих этому критерию, она отфильтровывается из результатов.

Если вы хотите включить родителей независимо от того, есть ли у них внуки, которые соответствуют критериям, вы могли бы сделать optional match .

 MATCH (p: Person_kol)<--(parent: Person_kol) WHERE p.idPerson=27003
OPTIONAL MATCH (p3: Person_kol)<--(p2: Person_kol)<--(parent: Person_kol)
WHERE p2.idPerson<>27003
RETURN p,parent,p3,p2

 

Комментарии:

1. Спасибо. Я немного в замешательстве, потому что, если я не напишу WHERE idPerson<>27003, он вернет мать, ДАЖЕ ЕСЛИ я сделаю свое недопустимое СОВПАДЕНИЕ, о котором вы упомянули. Поэтому, если я выполняю свое недопустимое совпадение, которое требует, чтобы у родителя были дочерние элементы, но я НЕ пишу «ГДЕ», он возвращает мать.

2. Документация для НЕОБЯЗАТЕЛЬНОГО СОПОСТАВЛЕНИЯ помогает разобраться в этом. neo4j.com/docs/cypher-manual/current/clauses/optional-match С идентификатором WHERE idPerson<>27003 в НЕОБЯЗАТЕЛЬНОМ СОВПАДЕНИИ мать все равно возвращается, потому что она соответствует первому предложению MATCH. Однако p3 и p2 равны нулю, потому что шаблон, в котором участвует материнская, не соответствует необязательным критериям соответствия. Без WHERE idPerson<>27003 вы получите шаблоны для missing-precious-delicious и pregnant-precious-delicious, которых не было бы, если бы вы включили предложение where . Используйте табличное представление в результатах, чтобы увидеть это.

3. О, я понимаю, так что, если я сделаю WHERE, мой precious будет «перезаписан» как «родительский», но если я не сделаю WHERE, мой «precious» будет правильным p2, и именно поэтому мать не возвращается? У меня есть еще один вопрос — что мне делать, если я не хочу возвращать «драгоценных» (idPerson = 27003) детей? (delcious, линейный)?

4. Отсутствующие и беременные — это два узла, которые сопоставляются как «родительские» в первом шаблоне. Перед фильтрацией второго запроса пять узлов (включая precious) сопоставляются как p2 для беременных, а precious сопоставляется как p2 для отсутствующих. Если вы включаете WHERE p2.idPerson <> 27003 в НЕОБЯЗАТЕЛЬНОЕ предложение match, применяется фильтр, который удаляет любые шаблоны, где p2 является ценным. Если вы не возвращаете precious как p2, вы не должны возвращать дочерние элементы precious как p3.