Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 带圈的Neo4j最短路径_Database_Graph_Path_Neo4j_Shortest - Fatal编程技术网

Database 带圈的Neo4j最短路径

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

我已经评估Neo4j 1.9.M03有一段时间了,并且达到了我没有预料到的程度

我有一个约140000个顶点的图。我还有三类边缘,我们称之为父亲、母亲和丈夫。每个类大约有80000条边。没有属性,也没有索引。顶点存储大小约为1.3 MB,边存储大小约为8 MB

数据源于SQL Server,从SQL迁移到Neo4j的质量是正确的。SQL最短路径存储过程已针对几十个顶点对运行,因此最短路径距离和路径是已知的

最短路径查询是Cypher:
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 );