【问题标题】:How to take a subgraph of a certain depth starting from a certain vertex in Neo4j如何在 Neo4j 中从某个顶点开始获取某个深度的子图
【发布时间】:2021-09-21 18:32:56
【问题描述】:

我需要使用 bfs 从某个顶点获取给定深度的子图。我尝试过类似于以下的代码

MATCH (p:Node {id: '1'}) CALL apoc.path.subgraphAll(p, {minLevel: 0, maxLevel: 1}) YIELD nodes, relationships RETURN nodes, relationships;

但与密码查询(neo4j 4.3.3)相比,它似乎非常慢。在 neo4j 中使用 bfs 获取子图的最佳方法是什么?

【问题讨论】:

  • 你能分享你与之比较的密码查询吗?
  • 查询返回所有直接邻居可能看起来像 MATCH q=(:Node {id: '1'})-[:Edge*0..1]-(:Node) return nodes(q ), 关系 (q)。对于深度 2 [:Edge*0..2]。它会返回比 bfs 更多的数据,因为它会返回所有路径,而不仅仅是图形,但即便如此它的运行速度也更快。

标签: neo4j cypher subgraph


【解决方案1】:

我用我们自己的测试商店做了一些测试,深度为 4

使用 apoc

//subgraph apoc 4
MATCH (n) WHERE id(n)=30341
CALL apoc.path.subgraphAll(n, {
    minLevel: 0,
    maxLevel: 4
})
YIELD nodes, relationships
RETURN size(nodes),size(relationships)

在密码中获得相同的结果需要此查询

// subgraph cypher 4
MATCH path=(n)-[*0..4]-(m) WHERE id(n)=30341
UNWIND nodes(path) AS node
UNWIND relationships(path) AS rel
WITH COLLECT ( DISTINCT node) AS pathNodes,
     COLLECT ( DISTINCT rel ) AS pathRels
MATCH (n1)-[r]-(n2)
WHERE n1 IN pathNodes AND n2 IN pathNodes 
      AND id(n1) >= id(n2)
      AND NOT r IN pathRels
WITH pathNodes,pathRels, COLLECT(r) AS rels
RETURN size(pathNodes),size(pathRels+rels)

这需要更长的时间。

【讨论】:

  • 在大图上它可能会变慢,因为它会返回图中的所有路径。但无论如何 subgraphAll 中存在一个错误,这使得它的计算复杂度与结果成二次方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多