我是neo4j
的新手。因此,我在neo4j上制作了家谱,并有一个“人”节点,该节点具有与人相关的属性,例如姓名,出生日期,出生地等。它还具有称为医学史的数组属性,一系列疾病。
现在,我想检查是否有任何疾病传染给了家人。 所以我有一个查询,
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个节点也是如此。
答案 0 :(得分:0)
此查询将返回以“ kristy frank”为根的树中最长为7的所有路径,其中路径中的任何人患有糖尿病:
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;