我想匹配一个给定节点的所有路径。
-->(c: {name:"*Tom*"})
/
(a)-->(b)-->(d: {name:"*Tom*"})
\
-->(e: {name:"*Tom*"})
这些路径指定了以下结构: - 倒数第二个节点(b)的所有子节点的名称应包含" Tom"串。
如何正确编写Cypher?
答案 0 :(得分:3)
让我们重新创建数据集:
CREATE
(a:Person {name: 'Start'}),
(b:Person),
(c:Person {name: 'Tommy Lee Jones'}),
(d:Person {name: 'Tom Hanks'}),
(e:Person {name: 'Tom the Cat'}),
(a)-[:FRIEND]->(b),
(b)-[:FRIEND]->(c),
(b)-[:FRIEND]->(d),
(b)-[:FRIEND]->(e)
正如您在评论中所说,all
需要一个列表。要获取列表,您应该在b
:
collect
函数
MATCH (:Person)-[:FRIEND]->(b:Person)-[:FRIEND]->(bn:Person)
WITH b, collect(bn) AS bns
WHERE all(bn in bns where bn.name =~ '.*Tom.*')
RETURN b, bns
我们将b
的邻居称为bn
,并将其收集到bns
列表。