使所有节点连接到Neo4j浏览器中的给定节点导致Neo4j崩溃
我有一个有无数个节点的图。其中,有一个特定的感兴趣节点。我想让所有节点以任何关系和任何关系深度连接到该节点(也就是说,它可能通过其他几个节点连接到原始节点)。我使用其使所有节点连接到Neo4j浏览器中的给定节点导致Neo4j崩溃,neo4j,cypher,Neo4j,Cypher,我有一个有无数个节点的图。其中,有一个特定的感兴趣节点。我想让所有节点以任何关系和任何关系深度连接到该节点(也就是说,它可能通过其他几个节点连接到原始节点)。我使用其id属性查询节点,并扩展其所有相邻节点。该图如下所示,其中突出显示/单击了感兴趣的节点: 我尝试了以下查询以获取所有这些节点: MATCH (a {id :"8e5b90c5242f4382bd8e71ae901b0433"}) CALL apoc.path.expandConfig(a, { uniqueness: 'NO
id
属性查询节点,并扩展其所有相邻节点。该图如下所示,其中突出显示/单击了感兴趣的节点:
我尝试了以下查询以获取所有这些节点:
MATCH (a {id :"8e5b90c5242f4382bd8e71ae901b0433"})
CALL apoc.path.expandConfig(a,
{
uniqueness: 'NODE_PATH'
}) yield path
return path
但这使得neo4j占用了RAM的千兆位,而我只有4GB。查询将挂起pc,并且永远不会完成。cypher有什么问题?您可能需要使用
apoc.path.subgraphNodes()
,它“扩展到子图的节点”,这正是您想要的
请参见,此功能已添加。是的,似乎可以使用。一个问题:为什么
收益节点返回节点
有效,而收益节点返回节点
无效。在关系
和关系
的情况下也是如此。是节点
和关系
关键字吗?@Mahesha999否,此处不涉及关键字。大多数APOC的命名约定是在生成列表时使用复数变量名,在生成单数实体时使用单数变量名,尽管这是基于每行的apoc.path.subgraphNodes()
生成一个节点流,它变成行,但每行只有一个节点。如果我们决定返回一个节点列表,那么我们将使用YIELD nodes
@InverseFalcon,我的同事今天面临着完全相同的问题。告诉他使用子图形节点
。他问到底有什么区别。但我说不出来。expandConfig()
和子图形节点()
在实现上的确切区别是什么。为什么expandConfig()
会导致(接近)无限图遍历,而子图节点()
会按预期终止?@Mahesha999区别在于配置参数中的唯一性
属性,特别是节点_全局
唯一性,这将确保在扩展处理期间只能访问一次节点(始终是与起始节点的最小距离)。您可以使用expandConfig()
显式设置,但这不是默认设置。默认情况下,我们在subgraphNodes()
、subgraphhall()
、和spanningTree()
中使用NODE>。基本上,这种唯一性模式大大减少了可能的扩展,当您只需要连接的节点,而不是所有可能的路径时,这是非常好的。了解这种特定扩展的实际功能非常重要。因为您使用的是节点路径唯一性,这里唯一的限制是同一节点在给定路径中不能出现多次。但此扩展仍将尝试扩展到图形中所有可能的唯一路径。不是所有可能的关系,所有可能的路径,任何长度。即使在这样一个简单的图中,路径的数量也是惊人的,您甚至不需要这些路径,因为您只需要节点。这些路径将在很长一段时间内反复遍历相同的节点和关系。路径(a)-[]->(b)
是否被视为不同于(a)-[]->(b)-[]->(a)
?如果是,这是否意味着任何带有循环的图都会导致无限多条路径?是的,这是两条不同的路径。Cypher扩展中的默认唯一性将找到耗尽所有关系的所有可能路径(受模式中关系的类型和方向限制)。由于默认情况下每个关系只遍历一次,因此当存在循环时,不会得到无限循环或无限数量的路径。节点路径唯一性会更好一些,因为节点不能在每个单独的路径中重用,所以不会考虑第二条路径。