Neo4j 使用cypher获取非重复子路径

Neo4j 使用cypher获取非重复子路径,neo4j,cypher,Neo4j,Cypher,我想获得所有到Child的唯一路径,而不将子路径作为集合的一部分 假设我的图表看起来像 (A :GrandParent)-[RELATED_TO]->(B :Parent)-[RELATED_TO]->(C :Child) (X :GrandParent)-[RELATED_TO]->(Y :Child) (L :Child) 询问 MATCH path=(n)-[RELATED_TO*0..3]->(:Child) WHERE n:GrandParent OR

我想获得所有到Child的唯一路径,而不将子路径作为集合的一部分

假设我的图表看起来像

 (A :GrandParent)-[RELATED_TO]->(B :Parent)-[RELATED_TO]->(C :Child)
 (X :GrandParent)-[RELATED_TO]->(Y :Child)
 (L :Child)
询问

MATCH path=(n)-[RELATED_TO*0..3]->(:Child)
WHERE n:GrandParent OR n:Parent
RETURN nodes(path)
会回来吗

A->B->C
B->C
C
X->Y
Y
有没有办法确保

  • B->C
    不会返回,因为它已经是
    a->B->C
    路径的一部分
  • C
    不会返回,因为它已经包含在
    A->B->C
    路径中
  • L
    返回,因为它尚未覆盖

根据提供的数据,您可以重新表述问题以使其更简单-您似乎只需要以“根”节点开始的路径,该节点没有与相关的入站
。在您的数据集中,将产生A、X和L,这也是我们要进行的遍历

给出一些示例数据:

MERGE (A: GrandParent { name: 'A' })
MERGE (B: Parent { name: 'B' })
MERGE (C: Child { name: 'C' })
MERGE (X: Grandparent { name: 'X' })
MERGE (Y: Child { name: 'Y' })
MERGE (L: Child { name: 'L' })
MERGE (A)-[:RELATED_TO]->(B)
MERGE (B)-[:RELATED_TO]->(C)
MERGE (X)-[:RELATED_TO]->(Y)
以下查询将删除以具有传入的
相关\u TO
关系的节点开始的路径:

MATCH path=(p)-[RELATED_TO*0..]->(:Child)
WHERE NOT (()-[:RELATED_TO]->(p))
RETURN nodes(path)
产生您描述的结果:

╒════════════════════════════════════════╕
│"nodes(path)"                           │
╞════════════════════════════════════════╡
│[{"name":"A"},{"name":"B"},{"name":"C"}]│
├────────────────────────────────────────┤
│[{"name":"X"},{"name":"Y"}]             │
├────────────────────────────────────────┤
│[{"name":"L"}]                          │
└────────────────────────────────────────┘

虽然还不清楚如果一个节点有多个子节点,会发生什么情况。

嘿,Pablissimo,谢谢你的回复。这确实得到了正确的图表,我同意我应该更好地表述这个问题。我当时很匆忙,忘记了问题中的一个重要方面,那就是,即使是
根节点
节点也可能有其他与它相关的节点,具有相同的
[:related\u to]
relationship是否也有办法处理这个问题?