【发布时间】:2019-08-13 17:18:45
【问题描述】:
我正在使用neo4j-java-driver 连接到螺栓端口的 Java Spring Boot 应用程序中查询 Neo4j,但我的查询大约需要 30 分钟才能返回结果。
查询:
MATCH path=(:JAVA {snapshot: 3})-[*]->()
UNWIND nodes(path) as n
WITH DISTINCT n
SET n.scope = 'JAVA'
RETURN n.ID
我尝试过在线搜索优化技术和 APOC 函数,但到目前为止我没有尝试过任何改进性能的尝试。标签已编入索引。快照是存在于所有节点上的属性,ID 是出于不相关原因需要的单独标识。
图表信息
- 200K 节点
- 355K 关系
- 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());
...
编辑,用更多数据跟进 cmets 中的问题。 带有 JAVA 标签的节点的不同依赖关系。
MATCH (:JAVA {snapshot: 3})-[*]->(n) RETURN count(DISTINCT n)
返回 182,749
查询计划简介
【问题讨论】: