我有一个索引的neo4j数据库,有200,000个节点和接近400万个关系(两种类型的关系)。使用C#API,我正在尝试做一个" Baconator"查询类型,不仅给我最短的路径,但给了我一些其他较短的路径。 (例如,如果最短路径有3个节点,我还希望看到长度为4,5等的其他亚军结果。)
这是我首先使用的查询(在C#调用中):
string whereClause = "a.Id='" + userId.ToUpper() + "' and b.Id='" + targetId.ToUpper() + "'";
var query = graphClient.Cypher
.Match("p=allShortestPaths((a:Person)-[*..6]-(b:Person))")
.Where(whereClause)
.ReturnDistinct<List<Person>>("nodes(p)").Limit(5);
这只给出了最短长度的路径。为了获得其他不那么短的路径,我使用以下内容:
//nextDegree starts at the degree of the shortest path
while (nextDegree <= 6)
{
var auxiliaryQuery = graphClient.Cypher
.Match("p=(a:Person)-[*" + (nextDegree) + ".." + (nextDegree) + "]-(b:Person)")
.Where(whereClause)
.ReturnDistinct<List<Person>>("nodes(p)").Limit(limit);
}
这很有效,但是性能受到很大影响,因为当达到5的长度时查询需要30秒,而到达6时则需要几分钟。
我的问题是:有没有办法可以优化这个? (通过使用Cypher中的简单路径算法或其他方法)
答案 0 :(得分:1)
看一下为此用例准确编写的plugin to the GraphAware Framework。它发现越来越长的最短路径。它尚未正确发布,但它已经准备好进行全面测试,您只需自己构建它(如果需要帮助,请联系)。
一旦构建完成,就可以将jar文件放入plugins目录并调用REST API。