【问题标题】:Neo4j - apply match to each result of previous matchNeo4j - 将匹配应用于先前匹配的每个结果
【发布时间】:2014-12-13 09:00:48
【问题描述】:

情况:具有多个端点的图,每个端点都与主图有一个连接。在加入主图之前,此连接可能会遍历几个中间的 node->relationship->node。每个连接的最后一个节点都有一个特定的属性。

我有一个查询沿着这条路径走,并找到最终连接到主图的节点。我有另一个返回端点节点列表的查询。如何使用查询 2 中的节点列表来输入查询 1,以便我可以为查询 2 的每个成员获取查询 1 的结果?

理想情况下,我想要类似 FOREACH 之类的东西,但由于查询 1 以 match 语句开头,所以就不行了。它不做任何改变。类似于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 并获得正确的结果。我想创建一个所有端节点及其连接节点的列表。

【问题讨论】:

  • 你有没有想过如何做到这一点?我也有类似的需求。
  • 已经有一段时间了,但 IIRC 我是用代码完成的。我不记得找到纯密码方法。
  • 好的,谢谢。我在想我可能不得不这样做:/

标签: neo4j cypher


【解决方案1】:

Cypher 的WITH 子句对于将一个查询输入另一个查询非常有用。也许这会有用?

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

【讨论】:

  • 使用 with 我当然可以传递 2->1 的结果,但它会阻止对每个辅助匹配使用“限制 1”。如果我“限制 1”,我只会得到一行。没有“限制 1”,我得到每一个组合。我想要一个结果。
  • 不确定我是否理解,但也许您需要 WITH 中的聚合函数,以便您只从每个集合中返回一个结果?
【解决方案2】:

Shortest Path 每个只返回一个路径。

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))

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

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

【讨论】:

  • 在每种情况下只有一条路径,所以这不是找到最短的的问题 - 更多的是找到最近的或者下一个.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2021-10-21
  • 2020-03-30
  • 2012-08-27
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多