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

时间:2015-11-25 19:28:03

标签: neo4j cypher

我正在尝试为以下域模型找到层次结构 - 向上和向下。作为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. 一个人及其所有孩子的等级 - 达到特定的深度

2 个答案:

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