【问题标题】:Getting all nodes connected to the given node in Neo4j browser causing neo4j crash让所有节点连接到 Neo4j 浏览器中的给定节点导致 Neo4j 崩溃
【发布时间】:2017-12-11 11:39:45
【问题描述】:

我有一个包含数十万个节点的图表。在那里,有一个特定的感兴趣的节点。我想让所有节点以任何关系和任何关系深度连接到该节点(即它可能通过其他几个节点连接到原始节点)。我使用其id 属性查询节点并展开其所有相邻节点。该图如下所示,感兴趣的节点突出显示/单击:

我尝试了以下查询来获取所有这些节点:

MATCH (a {id :"8e5b90c5242f4382bd8e71ae901b0433"})
CALL apoc.path.expandConfig(a, 
{
  uniqueness: 'NODE_PATH'
}) yield path
return path

但这使得 neo4j 占用大量 RAM,而我只有 4GB。查询挂起 pc 并且永远不会完成。密码有什么问题?

【问题讨论】:

  • 了解这个特定扩展的实际作用很重要。因为您使用的是 NODE_PATH 唯一性,所以这里唯一的限制是同一节点不能在给定路径中多次出现。但是这种扩展仍然会尝试扩展到图表中所有可能的唯一路径。不是所有可能的关系,所有可能的路径,任何长度。即使在像这样的简单图表中,这也是数量惊人的路径,您甚至不需要这些路径,因为您只需要节点。这些路径将在很长一段时间内一遍又一遍地遍历相同的节点和关系。
  • 路径(a)-[]->(b) 是否被认为与(a)-[]->(b)-[]->(a) 不同?如果是,这是否意味着任何带有循环的图都会导致无限数量的路径?
  • 是的,这是两条不同的路径。 Cypher 扩展中的默认唯一性将找到耗尽所有关系的所有可能路径(受模式中关系的类型和方向的限制)。由于默认情况下每个关系只遍历一次,因此当存在循环时,您不会得到无限循环或无限数量的路径。 NODE_PATH 唯一性会好一点,因为节点不能在每个单独的路径中重复使用,所以不会考虑第二条路径。

标签: neo4j cypher


【解决方案1】:

您可能想改用apoc.path.subgraphNodes(),它“扩展到子图的节点”,这正是您想要的。

APOC User Guide,这个功能是在March中添加的。

【讨论】:

  • 是的,这似乎有效。一个问题:为什么YIELD node RETURN node 有效但YIELD nodes RETURN nodes 无效。 relationshiprelationships 的情况相同。 noderelationship 是关键字吗?
  • @Mahesha999 不,这里不涉及关键字。大多数 APOC 中的命名约定是在 YIELDING 列表时使用复数变量名,在 YIELDING 单数实体时使用单数,尽管这是基于每行的。 apoc.path.subgraphNodes() 产生一个节点流,它变成行,但每行只有一个节点。如果我们决定返回一个节点列表,那么我们将使用YIELD nodes
  • @InverseFalcon 我的同事今天面临完全相同的问题。告诉他使用subgraphNodes。他问具体有什么区别。但我说不出来。 expandConfig()subgraphNodes() 之间的确切实现区别是什么。为什么expandConfig() 会导致(接近)图的无限遍历,而subgraphNodes() 会按预期终止?
  • @Mahesha999 区别在于配置参数中的uniqueness属性,特别是NODE_GLOBAL的唯一性,它保证了一个节点在扩展处理过程中只能被访问一次(总是最小距离从您的起始节点)。您可以使用expandConfig() 显式设置它,但这不是默认设置。我们在subgraphNodes()subgraphAll()spanningTree() 中默认使用NODE_GLOBAL 唯一性。基本上,这种唯一性模式大大减少了可能的扩展,这在您只需要连接节点而不是所有可能的路径时非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多