慢速neo4j Cypher查询,使用Baconator查询比最短路径更短的路径

时间:2014-08-12 18:34:11

标签: c# neo4j cypher

我有一个索引的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中的简单路径算法或其他方法)

1 个答案:

答案 0 :(得分:1)

看一下为此用例准确编写的plugin to the GraphAware Framework。它发现越来越长的最短路径。它尚未正确发布,但它已经准备好进行全面测试,您只需自己构建它(如果需要帮助,请联系)。

一旦构建完成,就可以将jar文件放入plugins目录并调用REST API。