Java neo4j中的图回归检测
我有一张这样尺寸的图Java neo4j中的图回归检测,java,neo4j,Java,Neo4j,我有一张这样尺寸的图 75 millions of nodes 238 millions of relationships 好几年了 我定期从外部数据重新生成它(通过导入csv) 然后我对所有最短路径进行批量搜索,单个搜索需要几毫秒。但整批10万次搜索通常需要5-10分钟 前一段时间,批量搜索速度慢了好几倍——总是30+分钟 有什么工具可以调查这个问题吗?我使用cypher和java驱动程序,当时没有neo4j更新(现在是4.0.11) 我尝试了使用Oracle linux而不是Debian的
75 millions of nodes
238 millions of relationships
好几年了
我定期从外部数据重新生成它(通过导入csv)
然后我对所有最短路径进行批量搜索,单个搜索需要几毫秒。但整批10万次搜索通常需要5-10分钟
前一段时间,批量搜索速度慢了好几倍——总是30+分钟
有什么工具可以调查这个问题吗?我使用cypher和java驱动程序,当时没有neo4j更新(现在是4.0.11)
我尝试了使用Oracle linux而不是Debian的beefier服务器,以及使用neo4j 4.2.4而不是4.0.11,但都没有用。所以,问题可能在图中
我已经为慢速搜索设置了日志记录,但没有任何搜索速度低于几十毫秒。不幸的是,我不能回到旧的(更快的)图表来测量平均时间
更新:
旧搜索
MATCH (one:Obj{oid:'id1'}) with one MATCH (two:Obj{oid:'anyOf100kId'}), path=allshortestPaths((one) -[*0..4]-(two)) WHERE ALL (x IN RELATIONSHIPS(path) WHERE x.val<130) return path limit 100;
+----------------------------------------------------------------------------------------------------------+
| Plan | Statement | Version | Planner | Runtime | Time | DbHits | Rows | Memory (Bytes) |
+----------------------------------------------------------------------------------------------------------+
| "PROFILE" | "READ_ONLY" | "CYPHER 4.2" | "COST" | "INTERPRETED" | 44 | 82495 | 7 | 7707104 |
+----------------------------------------------------------------------------------------------------------+
+----------------------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses |
+----------------------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +ProduceResults@graph.db | path | 1 | 7 | 224 | | 0/0 |
| | +-------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +Limit@graph.db | 100 | 1 | 7 | 0 | | 0/0 |
| | +-------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +ShortestPath@graph.db | path = (one)-[anon_112*0..4]-(two) WHERE all(x IN RELATIONSHIPS(path) WHERE x.val < $autoint_2) | 1 | 7 | 82267 | 7707104 | 0/0 |
| | +-------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +CartesianProduct@graph.db | | 1 | 1 | 0 | | 0/0 |
| |\ +-------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| | +NodeIndexSeek@graph.db | two:Obj(oid) WHERE oid = $autostring_1 | 1 | 1 | 2 | | 0/0 |
| | +-------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +NodeIndexSeek@graph.db | one:Obj(oid) WHERE oid = $autostring_0 | 1 | 1 | 2 | | 0/0 |
+----------------------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+
7 rows available after 0 ms, consumed after another 44 ms
MATCH(one:Obj{oid:'id1'})与一个匹配(two:Obj{oid:'anyOf100kId'}),path=allshortestpath((one)-[*0..4]-(two)),其中ALL(x在关系(path)中,其中x.val不是一个真正的答案:我没有找到/创建一个检测大型节点集群的工具。通过添加更多的RAM来适应所有64GB的数据,问题得到了解决
此外,他们花了几天时间试图进一步提高性能,但都失败了。
不同的JVM设置几乎不起任何作用(大堆、大页面缓存)。
Community edition似乎很难限制为10个核心,但有效限制甚至更低,因为4和10-20个核心模式之间的差异只有几个百分点。因为它能够完成,所以可以分析查询,并将扩展的查询计划添加到您的问题中。(发布的个人资料)感谢您的时间。不幸的是,我无法对old(fast)进行基准测试图表。可能这些对从一开始就“慢”。现在在每个“慢”批中,我只有0-4个慢检查,但它们仍然在相当令人印象深刻的5-40毫秒内完成。我担心所有查询的平均速度都会出现问题,但不会出现两个慢检查。计划是针对单个对。您是如何在所有(或子集)上运行这些检查的成对的?您是否在Cypher中完成了所有这些(两个匹配或一个匹配模式来捕获2的所有组合)或者您是在从客户端按配对调用查询吗?我从java应用程序运行100k请求,以查找node1和任何100k节点之间的所有路径。这些100k节点没有连接。像这样的100k查询不会很好地执行。相反,尝试用一个查询处理所有查询,尝试传入100k节点(或查找它们)通过参数作为列表。展开列表,然后执行匹配。请阅读本文以供参考:
final String qu = "MATCH (one:Obj {oid: 'id1' }) WITH one UNWIND $batch AS row MATCH (two:Obj {oid:row}), path=allshortestPaths((one) -[*0..4]-(two)) WHERE ALL (x IN RELATIONSHIPS(path) WHERE x.val<130) return path limit 10000";
Result r = session.run(qu, parameters("batch", orgs));