Neo4J 使用关系属性以加快查找速度?



我还没有尝试利用neo4j来执行复杂的查询(类似于最短路径搜索,除了我对此搜索应用了非常奇怪的条件,例如最小路径长度在遍历的节点数方面(。

我的数据集包含大约 2.5M 个单一类型的节点和大约 15 亿条边(也包含单一类型(。每个给定节点与"下一个"节点平均有 1000 个方向关系。

然而,我有一个查询,允许我在给定所有条件的情况下检索这个最短路径,但我发现响应时间不错(不到一秒(的唯一方法是实际限制添加到路径的每个新节点后的结果数量,过滤它,排序它,然后继续下一个节点(我想这是一种贪婪的算法(。

我想比我少限制它们,以便产生更多的路径,但问题是这种搜索的指数级复杂性,这使得从LIMIT 40LIMIT 60通常是x10~x100处理时间的问题。

话虽如此,我仍在评估几种解决方案来提高请求速度,但我不确定它们会产生的结果,因为我不确定 neo4j 如何在内部真正存储我的数据。

我考虑的解决方案是实际向我的关系添加一个属性,该属性将是介于 1 和 15 之间的整数,因为我通常只会查询此属性具有一个或两个最大不同值的关系。(例如,仅将此属性设置为 8 或 9 的关系(。

正如我所能猜到的,对于每个关系,neo4j 然后必须收集原始节点属性并使用它来应用我的进一步过滤器,当跨越 4 个节点长路径时,每个节点需要很长时间 1000 个关系(我猜 O(1000^4((。我说的对吗?

使用关系属性,它是否可以直接访问它而无需进一步获取数据?它有可能让我的查询更快吗?neo4j边缘属性是如何存储的?

更新

按照@logisima的建议,我直接用neo4j的Java遍历API编写了一个过程。然后,我切换到 Neo4J 的原始 Java 过程 API,以便在我的用例需要时利用更多的功能和灵活性。

结果非常好:下限复杂度总体上比以前低一点,但上限快了十倍,当至少一些将用于遍历的节点在 Neo4j 的缓存中时,性能变得惊人(当我通常只需要深度 4 时,我的一个测试在不到一秒的时间内深度 20(。

但这还不是全部。这些程序使其非常非常容易地可定制,同时保持最佳性能并优化每个操作的最佳状态。结果是,我可以在更短的计算时间内使用更强大的过滤器,并且可以轻松更新我的程序以添加新功能。最后但并非最不重要的一点是,Procedure很容易被neo4j的spring-data插入(我用它来将neo4j连接到我的HTTP API(。与密码一样,我必须自动生成查询(因为非常复杂,大约有 30 个 java 类可以正确完成这个技巧(,我应该使用 jdbc for neo4j,同时处理单独的连接池只为此请求。不能推荐更多使用很棒的neo4j java API。

再次感谢@logisima

如果您尝试执行自定义短路径算法,则应使用遍历 API编写密码过程。

Cypher的原则是制作pattern matching,并且您希望以特定的方式遍历图以找到您的良好解决方案。

对于您的用例,响应时间应该非常快!

最新更新