【发布时间】: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 唯一性会好一点,因为节点不能在每个单独的路径中重复使用,所以不会考虑第二条路径。