首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Neo4j中无超节点的最短路径

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

Stack Overflow用户
提问于 2017-03-27 16:48:25
回答 2查看 485关注 0票数 5

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

下面的查询对于较小的图很好,但对于我所处理的大小的图则从未完成:

代码语言:javascript
运行
复制
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子句的shortestPath查询中使用它们呢?还有其他建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-03 16:05:12

据我所知,当WHERE全部只包含关系(而不是节点)时,Neo4j最短路径实现会修剪路径。如果它不能修剪查询,它就会找到所有的路径,然后过滤它们(缓慢)。

正如Martin说的,您可以添加一个标签:

代码语言:javascript
运行
复制
MATCH (x:Node)
WHERE size((x)--())>1000
SET n:Supernode

然后通过边缘询问节点的标签:

代码语言:javascript
运行
复制
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使用优化的、双向的、宽度优先(快速)的查询。

更多的阅读:https://neo4j.com/docs/developer-manual/current/cypher/execution-plans/shortestpath-planning/

票数 2
EN

Stack Overflow用户

发布于 2017-03-30 14:26:26

您还可以尝试为超级节点添加一个标签:

代码语言:javascript
运行
复制
MATCH (x:Node)
WHERE size((x)--())>1000
SET n:Supernode

这是运行并完成您的数据吗?你有多少个超级节点和普通节点?

然后试着:

代码语言:javascript
运行
复制
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

我想标签检查更快些。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43052119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档