我对neo4j中的shortestPath算法有疑问。
如果我有一个包含10 ^ 6个节点的图表,并且每个节点有1000个关系,搜索最多4个级别的最短路径,则必须搜索高于总数的1000 * 1000 * 1000 * 1000 = 10 ^ 12个节点节点。原因是在搜索期间重复了一些节点。我的问题是,在neo4j shortestPath算法中,这种搜索需要花费一些时间来触摸10 ^ 6个节点或10 ^ 12个节点。换句话说,它是否标记已搜索的节点不再搜索它们?
由于
答案 0 :(得分:1)
我不相信会使用那种修剪方法。在Cypher中,遍历的默认唯一性是RELATIONSHIP_PATH:在每个路径中,关系必须是唯一的,它们不能被重用。
您可以尝试使用Graph Algorithms project中的shortestPath proc或APOC Procedures' path expander procs中的shortestPath proc。
使用APOC路径扩展器,您可以将自己的唯一性设置为NODE_GLOBAL(这可以防止在所有扩展期间多次处理相同的节点),或者使用其中一个已经完成此操作的过程({{1} },subgraphNodes()
或subgraphAll()
)。
APOC的陷阱(目前)是您目前无法提供扩展的终端节点(您必须扩展到具有某些已定义标签的节点并在之后过滤您的结果一个WHERE子句,并且扩展只在一个方向(从开始节点输出)而不是双向(例如来自cypher的shortestPath()),所以你不会实现任何可以提高的效率发生在从另一个方向扩展。
我目前在APOC上有PR来提供扩展的已知终端节点,因此应该进入下一个APOC版本(在接下来的一周左右)。