繁体   English   中英

Neo4j:层次结构查找密码查询

[英]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})

....就像是一个非常深的层次,一个人可以有多个孩子。

我正在尝试建立一些查询来查找

  1. 一个人及其所有子级

  2. 一个人及其父级

  3. 两人之间的关系-如果有的话

  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);

使用由(: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM