Neo4j跳过节点并检查节点属性

时间:2019-05-10 11:29:01

标签: neo4j cypher

我是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个节点也是如此。

1 个答案:

答案 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;