gpt4 book ai didi

java - 如何提高变长 Neo4j Cypher 查询的性能?

转载 作者:行者123 更新时间:2023-12-02 01:22:16 25 4
gpt4 key购买 nike

我正在使用 neo4j-java-driver 在 Java Spring Boot 应用程序中查询 Neo4j连接到 bolt 端口,但我的查询大约需要 30 分钟才能返回结果。

查询:

MATCH path=(:JAVA {snapshot: 3})-[*]->()
UNWIND nodes(path) as n
WITH DISTINCT n
SET n.scope = 'JAVA'
RETURN n.ID

我尝试过在线搜索优化技术以及 APOC 函数,但到目前为止我所做的尝试都没有提高性能。标签已编入索引。快照是所有节点上都存在的属性,ID 是出于不相关原因需要的单独标识。

图表信息

  • 20 万个节点
  • 355,000 个关系
  • 9073 个 JAVA 类型节点
  • 从 JAVA 类型的节点传出的 61K 直接关系
  • dbms.memory.heap.initial_size=3G
  • dbms.memory.heap.max_size=4G
  • dbms.memory.pagecache.size=1G

我本质上是在尝试遍历程序调用链,其中链的开头是 JAVA 类型的节点。如果可以从 JAVA 类型的节点访问任何其他节点,那么我想设置其范围并返回其 ID。我认为正在发生的情况是,该图非常密集,包含常见的路径遍历,并且查询多次遍历同一路径。我不确定我可以阻止这个问题,或者 Neo4j 是否在内部处理这个问题。

我从 Java 访问驱动程序(驱动程序在应用程序启动时实例化)并执行查询并从结果中收集 ID。

try (final Session session = getDriver().session()) {
session.run(new Statement("<The query>")).stream()
.map(record -> Long.valueOf(record.get(0).asLong()))
.collect(Collectors.toList());
...

编辑,用更多数据跟进评论中的问题。带有JAVA标签的节点有明显的依赖关系。

MATCH (:JAVA {snapshot: 3})-[*]->(n) RETURN count(DISTINCT n)

返回 182,749

查询计划简介

Profile of query plan

最佳答案

我们当然可以测试该分析。

请记住,您使用 UNWINDing 路径节点在这里肯定效率不高,即使路径的所有结束节点都是不同的,也会有大量的重复,因为子路径中存在的任何节点都会存在在从该子路径延伸的路径中。

您的查询的更好版本是:

MATCH path=(:JAVA {snapshot: 3})-[*]->(n)
WITH DISTINCT n
SET n.scope = 'JAVA'
RETURN n.ID

但是如果有多个路径到达同一节点(如果您检查该查询的 PROFILE 计划并发现 DISTINCT 操作之后的行与之前的行之间存在相当大的差距),那么这似乎是使用 APOC path expanders 的好例子,因为我们可以将它们配置为使用遍历唯一性行为,该行为在所有扩展中只应访问任何不同的节点一次。

如果您的查询因为一遍又一遍地重新访问相同的节点和路径而挂起,那么这应该会有所帮助。

试试这个:

MATCH (start:JAVA {snapshot: 3})
CALL apoc.path.subgraphNodes(start, {relationshipFilter:'>'}) YIELD node as n
WITH n
SKIP 1 // so we don't apply this to the start node
SET n.scope = 'JAVA'
RETURN n.ID

关于java - 如何提高变长 Neo4j Cypher 查询的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57482525/

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