Java 如何提高变长Neo4j密码查询的性能?
我正在Java Spring引导应用程序中查询Neo4j,使用连接到bolt端口,但我的查询大约需要30分钟才能返回结果 查询:Java 如何提高变长Neo4j密码查询的性能?,java,neo4j,cypher,Java,Neo4j,Cypher,我正在Java Spring引导应用程序中查询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是一个独
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类型的节点
- 61K从JAVA类型的节点传出的直接关系
- dbms.memory.heap.initial_size=3G
- dbms.memory.heap.max_size=4G
- dbms.memory.pagecache.size=1G
try(最终会话=getDriver().Session()){
session.run(新语句(“”).stream()
.map(record->Long.valueOf(record.get(0).asLong())
.collect(Collectors.toList());
...
编辑、跟进评论中的问题,并提供更多数据。
具有JAVA标签的节点的不同依赖项
MATCH (:JAVA {snapshot: 3})-[*]->(n) RETURN count(DISTINCT n)
返回182749
查询计划概要
我们当然可以测试这种分析 请记住,在这里展开路径节点的使用肯定是无效的,即使路径的所有结束节点都不同,也会有大量重复,因为子路径中的任何节点都会出现在从该子路径延伸的路径中 查询的更好版本是:
MATCH path=(:JAVA {snapshot: 3})-[*]->(n)
WITH DISTINCT n
SET n.scope = 'JAVA'
RETURN n.ID
但是如果有多条路径指向同一个节点(如果您检查了该查询的概要文件计划,发现在执行不同操作后与之前的行之间存在相当大的差距)那么这似乎是一个使用的好例子,因为我们可以将它们配置为使用遍历唯一性行为,该行为在所有扩展中只应访问任何不同的节点一次
如果您的查询由于反复访问相同的节点和路径而挂起,那么这应该是一个帮助
试试这个:
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
我们当然可以检验这种分析 请记住,在这里展开路径节点的使用肯定是无效的,即使路径的所有结束节点都不同,也会有大量重复,因为子路径中的任何节点都会出现在从该子路径延伸的路径中 查询的更好版本是:
MATCH path=(:JAVA {snapshot: 3})-[*]->(n)
WITH DISTINCT n
SET n.scope = 'JAVA'
RETURN n.ID
但是如果有多条路径指向同一个节点(如果您检查了该查询的概要文件计划,发现在执行不同操作后与之前的行之间存在相当大的差距)那么这似乎是一个使用的好例子,因为我们可以将它们配置为使用遍历唯一性行为,该行为在所有扩展中只应访问任何不同的节点一次
如果您的查询由于反复访问相同的节点和路径而挂起,那么这应该是一个帮助
试试这个:
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
根据您的第一个建议删除“放松”似乎可以将时间缩短到约11分钟。仍然不理想,但效果要好得多。我尝试了apoc子图函数,但35分钟后我结束了查询,不确定问题是什么。这很有趣。
n
有多少个匹配项?匹配(:JAVA{snapshot:3})-[*]->(n)RETURN count(DISTINCT n)
我们可以看到成功查询的配置文件计划吗?这可能会提供线索。我用查询的计数和配置文件更新了我的问题。这非常奇怪,行(节点)和DISTINCT节点之间的差异非常大…大约4.39亿对18.2万。子图()是调用应该已经产生了显著的改进,因为它应该在遍历过程中显著地修剪它需要访问的路径。您有空闲的内存吗?如果有,您可以将pagecache大小增加到4或5 gb,并查看是否有类似的时间安排吗?我想知道是否要更改它(或者堆)稍微有点帮助。根据您的第一个建议删除“放松”似乎可以将时间缩短到约11分钟。仍然不理想,但效果要好得多。我尝试了apoc子图函数,但35分钟后我结束了查询,不确定问题是什么。这很有趣。您获得了多少个匹配项?匹配(:JAVA{snapshot:3})-[*]->(n) RETURN count(DISTINCT n)
我们可以看到成功查询的配置文件计划吗?这可能会提供线索。我用查询的计数和配置文件更新了我的问题。这非常奇怪,行(节点)和DISTINCT节点之间的差异非常大…大约4.39亿对18.2万。子图()是调用应该已经产生了显著的改进,因为它应该在遍历过程中显著地修剪它需要访问的路径。您有空闲的内存吗?如果有,您可以将pagecache大小增加到4或5 gb,看看是否看到类似的计时?我想知道稍微更改一下这个(或者堆)是否有帮助。