Database 带圈的Neo4j最短路径
我已经评估Neo4j 1.9.M03有一段时间了,并且达到了我没有预料到的程度 我有一个约140000个顶点的图。我还有三类边缘,我们称之为父亲、母亲和丈夫。每个类大约有80000条边。没有属性,也没有索引。顶点存储大小约为1.3 MB,边存储大小约为8 MB 数据源于SQL Server,从SQL迁移到Neo4j的质量是正确的。SQL最短路径存储过程已针对几十个顶点对运行,因此最短路径距离和路径是已知的 最短路径查询是Cypher:Database 带圈的Neo4j最短路径,database,graph,path,neo4j,shortest,Database,Graph,Path,Neo4j,Shortest,我已经评估Neo4j 1.9.M03有一段时间了,并且达到了我没有预料到的程度 我有一个约140000个顶点的图。我还有三类边缘,我们称之为父亲、母亲和丈夫。每个类大约有80000条边。没有属性,也没有索引。顶点存储大小约为1.3 MB,边存储大小约为8 MB 数据源于SQL Server,从SQL迁移到Neo4j的质量是正确的。SQL最短路径存储过程已针对几十个顶点对运行,因此最短路径距离和路径是已知的 最短路径查询是Cypher:START one=node(0),two=node(1234
START one=node(0),two=node(1234)MATCH p=shortestPath(one-[*..1000]-two)返回p代码>
部分测试用例一:我只使用丈夫和父亲的关系,周期的发生率(例如v[0]->v[1]->v[2]->v[0])
很低。如果我对特定的已知长路径(例如已知约450跳)执行最短路径计算,它将在50毫秒内返回(非缓存),路径约550跳。预计长度会增加,因为我们排除了部分边缘
部分测试用例二:同样,如果我只使用丈夫和母亲的关系,周期的发生率(例如v[0]->v[1]->v[2]->v[0])
。如果我执行相同的最短路径,我得到的结果与之前相同:大约50ms(非缓存),路径长度的增加类似
完整测试用例:我使用所有(父亲、母亲和丈夫)关系。循环的发生率现在可以预见地很高,因为常见的情况是v[0]母亲->v[1]丈夫->v[2],使用neo4j遍历框架,您可以选择在遍历中使用哪种唯一性,例如RELATIONSHIP\u GLOBAL,这样它在遍历期间只遍历一次关系。这可能会解决您的问题:
// single directional
Traversal.traversal( Uniqueness.RELATIONSHIP_GLOBAL )
.evaluator( Evaluators.returnWhereEndNodeIs( myEndNode )
.traverse( myStartNode );
// bi-directional
Traversal.bidirectionalTraversal()
.mirroredSides( Traversal.traversal( Uniqueness.RELATIONSHIP_GLOBAL ) )
.traverse( myStartNode, myEndNode );
//单向
遍历.遍历(唯一性.RELATIONSHIP\u全局)
.evaluator(Evaluators.returnWhereEndNodeIs(myEndNode)
.遍历(myStartNode);
//双向
Traversal.bidirectionalTraversal()的遍历
.mirroredSides(遍历.遍历(唯一性.关系\全局))
.遍历(myStartNode、myEndNode);
上面的示例基本上是这样的,可能需要修改才能使用您的查询。如果试图获得节点44715和17173之间的最短路径,已知其最短路径为112跳,则可以观察到该问题
如果我们将最短路径计算限制为111个跃点,则查询很快完成,但没有路径。START one=node(44715),two=node(17173)MATCH p=shortestPath(one-[*..111]-two)返回p;
但是,如果我们随后将最短路径计算限制为112跳,我们会观察到查询无法完成,JVM会快速分配高达4G字节的内存。START one=node(44715),two=node(17173)MATCH p=shortestPath(one-[*…112]-two)返回p;
Neo已经确认这是一个边缘案例错误,与要返回的Path对象的组装有关。它在他们的错误积压中
换句话说,周期与问题无关。大家好,有没有机会在github上与一个假的数据集生成器共享此设置?我很想分析一下,以了解此设置缓慢的原因。可能是最短路径中的一个错误。完成了。很酷!我已经尝试过了,但没有完全得到我想要的--知道如何指定吗最短路径算法的唯一性?您知道此错误是否已修复(以及在哪个版本的neo4j中)?谢谢。
https://github.com/squirrelsama/neo4j-shortestpath-issue
// single directional
Traversal.traversal( Uniqueness.RELATIONSHIP_GLOBAL )
.evaluator( Evaluators.returnWhereEndNodeIs( myEndNode )
.traverse( myStartNode );
// bi-directional
Traversal.bidirectionalTraversal()
.mirroredSides( Traversal.traversal( Uniqueness.RELATIONSHIP_GLOBAL ) )
.traverse( myStartNode, myEndNode );