我在玩狗的血统图时正在学习Neo4j。以下查询为我提供了与多个节点具有:PARENT_OF关系的所有节点。
match (n)-[r:PARENT_OF]->() with n, count(r) as rel_cnt where rel_cnt > 1 return n;
对于示例图,这会产生两个节点。现在我想将它与下一个查询结合起来,以获得固定子节点(A)和变量父节点之间的路径(来自第一个查询的结果):
match p =(child:Dog {name: "A"})<-[:PARENT_OF*0..]-(parent:Dog {name: "X"}) return p
我已经查看了WITH子句,但无法绕过它。关于如何将第一个查询的结果提供给第二个查询的任何建议都非常感谢!
请参阅此Neo4j控制台以获取示例图http://console.neo4j.org/?id=6nm2e3
答案 0 :(得分:1)
首先让所有超过1个孩子的父母获得从特定孩子到拥有1个以上孩子的父母的路径是不必要的(并且效率低下)。
相反,你可以得到特定的孩子,看看每个孩子有多少孩子。例如:
MATCH p = (child:Dog {name: "A"})<-[:PARENT_OF]-(n)
WHERE SIZE((n)-[:PARENT_OF]->()) > 1
RETURN p;
答案 1 :(得分:0)
一个快速的建议,你可以使用一个技巧来获得一个节点的关系类型的程度,这比扩展关系和计算它的效率要高得多。
此外,在这种特殊情况下,您不必使用WITH,您可以立即重复使用n
变量。
MATCH (n)
WHERE size((n)-[r:PARENT_OF]->()) > 1
MATCH p =(child:Dog {name: "A"})<-[:PARENT_OF*0..]-(n) return p
对于WITH,它用于重新定义哪些变量在查询的下一部分的范围内,并且它通常是您可以更改结果记录的位置,例如通过从节点和关系中投影属性,进行函数调用等等。