【发布时间】:2017-08-20 11:56:55
【问题描述】:
我在 Neo 中有一个包含 5 亿个节点和边的图。我想找到避免超级节点的 2 个节点之间的最短路径(即使它比上面有超级节点的路径长)。
以下查询适用于较小的图表,但对于我正在处理的大小的图表永远不会完成:
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 子句,它会非常快。通常是亚秒级。
如何加快速度?预先计算节点度数和索引它们有帮助吗?我是否应该求助于复制除了与超级节点相邻的边缘之外的所有边缘,给它们一个新标签并将它们用于我的 shortestPath 查询而不使用 WHERE 子句?还有其他建议吗?
【问题讨论】:
-
去掉标签会怎样? WHERE NONE(x IN NODES(p) WHERE size((x)--()) > 1000)
-
好点。抱歉,我实际上是在 WHERE 子句中没有标签的情况下测试它。对于第一个标签,它会出错。第二个标签似乎没有任何区别。让我更新我的问题以删除标签。作为参考,它最初看起来像这样: WHERE NONE(x:Node IN NODES(p) WHERE size((x:Node)--())>1000)
标签: graph neo4j cypher shortest-path