Graph Neo4j中无超节点的最短路径

Graph Neo4j中无超节点的最短路径,graph,neo4j,cypher,shortest-path,Graph,Neo4j,Cypher,Shortest Path,我有一个Neo中有5亿个节点和边的图。我想在两个节点之间找到避免超级节点的最短路径(即使它比有超级节点的路径长) 下面的查询适用于较小的图形,但对于我正在处理的大小的图形,永远不会结束: MATCH (n:Node { id:'123'}),(m:Node { id:'234' }), p = shortestPath((n)-[*..6]-(m)) WHERE NONE(x IN NODES(p) WHERE size((x)--())>1000) RETURN p 如果我删除WHE

我有一个Neo中有5亿个节点和边的图。我想在两个节点之间找到避免超级节点的最短路径(即使它比有超级节点的路径长)

下面的查询适用于较小的图形,但对于我正在处理的大小的图形,永远不会结束:

MATCH (n:Node { id:'123'}),(m:Node { id:'234' }), p = shortestPath((n)-[*..6]-(m)) 
WHERE NONE(x IN NODES(p) WHERE size((x)--())>1000)
RETURN p
如果我删除WHERE子句,它会非常快。通常为亚秒


我怎样才能加快速度?预先计算节点度并为其编制索引是否有帮助?我是否应该复制所有与超级节点相邻的边之外的边,给它们一个新标签,并在没有WHERE子句的情况下将它们用于最短路径查询?还有其他建议吗?

您也可以尝试为超级节点添加标签:

MATCH (x:Node)
WHERE size((x)--())>1000
SET n:Supernode
这是否在您的数据上运行并完成?您有多少个超级节点和普通节点

然后尝试:

MATCH (n:Node { id:'123'}),(m:Node { id:'234' })
WITH n, m
MATCH p = shortestPath((n)-[*..6]-(m))
WHERE NONE(x IN NODES(p) WHERE (x:Supernode))
RETURN p

我想标签检查更快

据我所知,Neo4j最短路径实现会在WHERE ALL仅包含关系(而不是节点)时修剪路径。当它不能删减查询时,它会找到所有路径,然后过滤它们(慢)

正如Martin所说,您可以添加标签:

MATCH (x:Node)
WHERE size((x)--())>1000
SET n:Supernode
然后通过边缘查询节点的标签:

MATCH p = shortestPath((n:Node { id:'1'})-[*..6]-(m:Node { id:'2' })) 
WHERE ALL( rel IN relationships(p) WHERE not (startNode(rel):Supernode or endNode(rel):Supernode))
RETURN p
这将允许Neo4j使用优化的双向广度优先(fast)查询

这里有更多的阅读:

如果移除标签会发生什么?其中无(x在节点(p)中,其中大小((x)-())>1000)为良好点。抱歉,我实际上是在WHERE子句中没有标签的情况下测试它的。使用第一个标签时,它会出错。第二个标签似乎没有任何区别。让我更新我的问题以删除标签。作为参考,它最初看起来是这样的:WHERE NONE(x:Node在NODES(p)中)WHERE size((x:Node)--())>1000)谢谢。这并不能解决问题,但很有用。因此,我几乎有0.5G节点。我能够运行您9 m内的第一个查询来标记超级节点。其中有525个(即学位>1k)。不幸的是,如果在节点n和m之间有一个超节点,那么第二个查询仍然需要很长时间。在我看来,如果在这些节点附近没有超节点,速度会非常快。