我正在尝试为以下域模型找到层次结构 - 向上和向下。作为neo4j的新手,我在使用密码查询获得正确的层次结构时遇到了一些障碍。
任何帮助或样本对我都有很大的帮助......
(:Person{id=1})-[HAS_CHILD]->(:Person{id=2})-[HAS_CHILD]->(:Person{id=3})-[HAS_CHILD]->(:Person{id=4})-[HAS_CHILD]->(:Person{id=5})
....就像这样一个非常深层次的&一个人可以有多个孩子。
我正在尝试构建一些查询来查找
一个人及其所有孩子的等级
一个人及其父级层次结构
两个人之间的关系 - 如果有的话
一个人及其所有孩子的等级 - 达到特定的深度
答案 0 :(得分:4)
这些应该有用。
WHERE
子句用于消除子路径。 #4的答案不能使用相同的WHERE
子句,因此结果将包含子路径。
1
MATCH p=(:Person{id:1})-[:HAS_CHILD*]->(c)
WHERE NOT (c)-[:HAS_CHILD]->()
RETURN NODES(p);
2
MATCH p=(:Person { id:5 })<-[:HAS_CHILD*]-(ancestor)
WHERE NOT (ancestor)<-[:HAS_CHILD]-()
RETURN NODES(p);
3
MATCH p=(p5:Person { id:5 })-[:HAS_CHILD*]-(p1:Person { id:1 })
RETURN NODES(p);
4。使用深度达5:
MATCH p=(:Person{id:1})-[:HAS_CHILD*1..5]->(c)
RETURN NODES(p);
答案 1 :(得分:2)
使用由(:Person)-[:HAS_CHILD]->(:Person)
这些查询组成的数据模型应该返回您要查找的数据(让我们假设您在每个name
节点上都有一个唯一的Person
属性便于按名称查找,但您也可以使用任何唯一的ID /属性):
一个人及其所有孩子
我们可以在此处使用可变长度路径模式来匹配包含多个HAS_CHILD
关系的模式。
MATCH (p:Person)-[:HAS_CHILD*]->(child:Person)
WHERE p.name = "Bob Loblaw"
RETURN child;
一个人及其父级层次结构
与上述查询非常相似,但我们只是颠倒关系方向。
MATCH (p:Person)<-[:HAS_CHILD*]-(ancestor:Person)
WHERE p.name = "Bob Loblaw"
RETURN ancestor;
两个人之间的关系 - 如果有的话
我们可以使用shortestPath
函数来查找图中两个节点之间的最短路径。如果没有找到路径,此查询将不返回任何行。
MATCH path=shortestPath((p:Person {name: "Bob Loblaw"})-[*]-(o:Person {name: "Louise Bluth"}))
RETURN path
一个人及其子级 - 直到特定深度
这个查询非常类似于以前的人和他所有的孩子查询&#34;但是我们可以在可变长度路径上指定边界。 注意:应始终使用可变长度路径指定上限,以避免长时间运行的查询。
MATCH (p:Person)-[:HAS_CHILD*1..5]->(child:Person)
WHERE p.name = "Bob Loblaw"
RETURN child;