[英]Neo4j: hierarchy finding cypher query
我正在尝试查找层次结构-对于以下领域模型,它既向上又向下。 作为neo4j的新手,我遇到了一些障碍,无法通过密码查询获得正确的层次结构。
任何帮助或样品都会对我有很大帮助。
(:Person{id=1})-[HAS_CHILD]->(:Person{id=2})-[HAS_CHILD]->(:Person{id=3})-[HAS_CHILD]->(:Person{id=4})-[HAS_CHILD]->(:Person{id=5})
....就像是一个非常深的层次,一个人可以有多个孩子。
我正在尝试建立一些查询来查找
一个人及其所有子级
一个人及其父级
两人之间的关系-如果有的话
一个人及其所有子级-达到特定深度
这些应该工作。
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);
使用由(:Person)-[:HAS_CHILD]->(:Person)
组成的数据模型,这些查询应返回您要查找的数据(我们还假设您在每个Person
节点上都有一个唯一的name
属性,以方便按名称查找,但您也可以使用任何唯一的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
一个人及其子级-达到特定深度
该查询与先前的“人及其所有子查询”非常相似,但是我们可以在可变长度路径上指定范围。 注意 :应始终使用可变长度路径指定上限,以避免运行时间很长的查询。
MATCH (p:Person)-[:HAS_CHILD*1..5]->(child:Person)
WHERE p.name = "Bob Loblaw"
RETURN child;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.