neo4j如何从选定的起始节点返回所有路径

问题描述

你好,我有一个这样的图形数据库

enter image description here

我的愿望是从选定的节点开始检索通过r关系连接的所有节点。例如

如果我选择a,则希望有两行作为响应:

a,b,c
a,d

如果我选择b,那么我期望一行:

b,c

我尝试了match p=(:a)-[:r*..]->() return p,但返回了这个

enter image description here

在python中,我得到了我不知道如何解析的信息:

<Path start=<Node id=93 labels=frozenset({'a'}) properties={'name': 'A'}> end=<Node id=94 labels=frozenset({'b'}) properties={'name': 'B'}> size=1>
<Path start=<Node id=93 labels=frozenset({'a'}) properties={'name': 'A'}> end=<Node id=95 labels=frozenset({'c'}) properties={'name': 'C'}> size=2>
<Path start=<Node id=93 labels=frozenset({'a'}) properties={'name': 'A'}> end=<Node id=96 labels=frozenset({'d'}) properties={'name': 'D'}> size=1>

编辑:我发现了功能nodes(),所以我尝试使用match p=(:a)-[:r*..]->() return nodes(p)返回了我所需的内容

enter image description here

,但它仍复制a,ca,b中的路径a,c。如何删除第一行?

解决方法

关于重复路径的问题,一个技巧是排除末端节点不是叶子的路径,即存在从其开始的关系。例如:

MATCH p=(parent {name: "a"})-[:r*1..10]->(child)
WHERE NOT (child)-[:r]->()
RETURN p

对于第二个关于返回格式的问题,可以使用UNWINDcollect的组合,如下所示:

MATCH p=(parent {name: "a"})-[:r*1..10]->(child)
WHERE NOT (child)-[:r]->()
UNWIND nodes(p) as node
WITH p,collect(node.name) as names
RETURN names

结果是:

╒═════════════╕
│"names"      │
╞═════════════╡
│["a","b","c"]│
├─────────────┤
│["a","d"]    │
└─────────────┘