gpt4 book ai didi

neo4j - 从neo4j图中的路径中删除循环的更好方法

转载 作者:行者123 更新时间:2023-12-01 02:10:18 24 4
gpt4 key购买 nike

我使用的是 neo4j 图形数据库版本 2.1.7。数据的简要细节:
200 万个节点有 6 种不同类型的节点,500 万个关系只有 5 种不同类型的关系,主要是连接图但包含一些孤立的子图。

在解析路径时,我在路径中得到循环。为了限制这一点,我使用了下面共享的解决方案:
Returning only simple paths in Neo4j Cypher query

这是查询,我正在使用:

MATCH (n:nodeA{key:905728}) 
MATCH path = n-[:rel1|rel2|rel3|rel4*0..]->(c:nodeA)-[:rel5*0..1]->(b:nodeA)
WHERE ALL(a in nodes(path) where 1=length (filter (m in nodes(path) where m=a)))
and (length(EXTRACT (p in NODES(path)| p.key)) > 1)
and ((exists ((c)-[:rel5]->(b)) and (not exists((b)-[:rel1|rel2|rel3|rel4]->(:nodeA)) OR ANY (x in nodes(path) where (b)-[]->(x))))
OR (not exists ((c)-[:rel5]->()) and (not exists ((c)-[:rel1|rel2|rel3|rel4]->(:nodeA)) OR ANY (x in nodes(path) where (c)-[]->(x)))))
RETURN distinct EXTRACT (rp in Rels(path)| type(rp)), EXTRACT (p in NODES(path)| p.key);

上述查询解决了我的需求,但不符合成本效益,如果为巨大的子图运行,则继续运行。我已经使用“配置文件”命令来提高我开始使用的查询性能。但是,现在卡在了这一点上。性能有所提高,但不是我对 neo4j 的预期:(

最佳答案

我不知道我有解决方案,但我有一些建议。有些可能会加快速度,有些可能只是使查询更易于阅读。

首先,而不是把exists ((c)-[:rel5]->(b))在您的 WHERE ,我相信你可以把它放在你的MATCH像这样:

MATCH path = n-[:rel1|rel2|rel3|rel4*0..]->(c:nodeA)-[:rel5*0..1]->(b:nodeA), (c)-[:rel5]->(b)

我认为您不需要 exists关键词。我想你可以说,例如, (NOT (b)-[:rel1|rel2|rel3|rel4]->(:nodeA))
我还建议考虑 WITH clause用于潜在的性能改进。

关于变量路径的一些注意事项:在 *0..0意味着您可能正在寻找自我引用。这可能是也可能不是您想要的。此外,将可变路径保持开放通常会导致性能问题(正如我认为您所看到的)。如果你可以限制它可能会有所帮助。

此外,如果您升级到 2.2.1,2.2.x 系列有许多内置的性能改进,但您也可以获得可视化 PROFILE在控制台和一个新的 EXPLAIN命令,它既分析又告诉您运行后查询的实际性能。

还需要考虑的一件事是,我认为您没有达到 Neo4j 的性能界限,而是可能达到了 Cypher 的某些界限。如果是这样,我可能建议您使用 Neo4j 提供的 Java API 进行查询,以获得更好的性能和更多的控制。如果您使用的是与 JVM 兼容的语言,这可以通过嵌入您的数据库或通过编写 unmanaged extension 来实现。它允许您在 java 中进行自己的查询,但从服务器提供自定义 REST API

关于neo4j - 从neo4j图中的路径中删除循环的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29965084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com