如何匹配以Neo4j中具有公共属性的节点结尾的所有路径?

时间:2017-09-28 06:38:47

标签: neo4j cypher

我想匹配一个给定节点的所有路径。

         -->(c: {name:"*Tom*"})
        /
(a)-->(b)-->(d: {name:"*Tom*"})
        \           
         -->(e: {name:"*Tom*"})

这些路径指定了以下结构: - 倒数第二个节点(b)的所有子节点的名称应包含" Tom"串。

如何正确编写Cypher?

1 个答案:

答案 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列表。