Neo4j пропустить узел и проверить свойство узла - PullRequest
1 голос
/ 10 мая 2019

Я новичок в neo4j.Итак, я делал семейное дерево на neo4j и у меня есть узел «Person», который имеет свойства, связанные с человеком, такие как имя, дата рождения, место рождения и т. Д. Он также имеет свойство массива под названием история болезни, которое будет иметьмножество болезней.

Теперь я хочу проверить, была ли какая-либо болезнь передана человеку из его семьи.Итак, у меня есть запрос,

MATCH p=(k:Person{name :"kristy frank"})-[r:FATHER_OF | MOTHER_OF *1..7 ]-(l:Person)
where SINGLE(x IN l.diseases WHERE x = "diabetes")  
RETURN k,r,l

Это возвращает все узлы в моей семье, которые имеют диабет.Но есть вероятность, что один или два узла между ними могут не иметь диабета.Поэтому я хочу, чтобы запрос был общим для поиска по семейному древу и поиска узлов, которые могут иметь диабет как свойство, даже если пропущено 2-3 узла между ними.

1 Ответ

0 голосов
/ 13 мая 2019

Этот запрос вернет все пути длиной до 7 в дереве с корнем в «kristy frank», где любой человек на пути имеет диабет:

MATCH p=(:Person{name :"kristy frank"})-[:FATHER_OF|MOTHER_OF*..7]->(:Person)
WHERE ANY(p IN NODES(p) WHERE "diabetes" IN p.diseases)
RETURN p;

Тем не менее, обратите внимание, что результирующие пути вышеупомянутого запроса могут включать пути, которые полностью перекрываются более длинными путями.

Чтобы избежать этого, вы можете вместо этого вернуть все пути дерева, которые либо заканчиваются на листовом узле, либо имеют длину 7:

MATCH p=(:Person{name :"kristy frank"})-[:FATHER_OF|MOTHER_OF*..7]->(l:Person)
WHERE
  (LENGTH(p) = 7 OR NOT (l)-[:FATHER_OF|MOTHER_OF]->()) AND
  ANY(p IN NODES(p) WHERE "diabetes" IN p.diseases)
RETURN p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...