问题描述
我的愿望是从选定的节点开始检索通过r
关系连接的所有节点。例如
如果我选择a
,则希望有两行作为响应:
a,b,c
a,d
如果我选择b
,那么我期望一行:
b,c
我尝试了match p=(:a)-[:r*..]->() return p
,但返回了这个
在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)
返回了我所需的内容:
,但它仍复制a,c
和a,b
中的路径a,c
。如何删除第一行?
解决方法
关于重复路径的问题,一个技巧是排除末端节点不是叶子的路径,即存在从其开始的关系。例如:
MATCH p=(parent {name: "a"})-[:r*1..10]->(child)
WHERE NOT (child)-[:r]->()
RETURN p
对于第二个关于返回格式的问题,可以使用UNWIND
和collect
的组合,如下所示:
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"] │
└─────────────┘