Neo4j - 将匹配应用于上一场比赛的每个结果

时间:2014-12-12 14:13:54

标签: neo4j cypher

情况:具有多个端点的图形,每个端点都与主图形有一个连接。在连接主图之前,该连接可以遍历几个插入的节点 - >关系 - >节点。每个连接的最终节点都有一个特定的属性。

我有一个查询沿着这条路走下去,找到最终加入主图的节点。我有另一个查询返回端点节点列表。如何使用查询2中的节点列表输入查询1,这样我就可以获得查询2的每个成员的查询1的结果?

理想情况下,我想要 FOREACH 之类的东西,但是因为查询1以匹配语句开头。它没有做任何改变。类似于create outer_list -> each outer_list_member -> run next query and return single result -> repeat with next list_member

的东西
  • 查询1:match p=(n {individual end node property})-[r: JOINS*1..5]-(m { joining node property }) return n.name, length(p) as len, m.name order by len limit 1
    - 这给了我终端节点和加入节点(通过最短路径)
  • 查询2:match node_list = (n {property of all end nodes})

如果我手动指定给定端节点的唯一属性(“id”),我可以运行查询1 并获得正确的结果。我想创建一个包含所有终端节点及其连接节点的列表。

2 个答案:

答案 0 :(得分:2)

Cypher的WITH子句对于将一个查询提供给另一个查询非常有用。也许那会有用吗?

http://neo4j.com/docs/stable/query-with.html

答案 1 :(得分:0)

最短路径每个只返回一条路径。

match (n:Label {prop:value})
match p=shortestPath( (n)-[: JOINS*1..5]-(m:Label2 {prop2:value2}) 
return n.name, length(p) as len, m.name 

否则你也可以使用路径作为集合表达式并返回 head((n1)-[*..5]-(n2))

昂贵的操作,但您可以按路径长度进行操作,然后按起始节点聚合并获取collect的第一个元素(最短路径是列表中的第一个)。

...
with n, p
order by length(p)
return n.name, head(collect(p))