注意 - Stackoverflow上的其他地方有类似的问题,但它与Spring Data有关,我不是使用Spring Data。
我有一个基于Twitter数据构建的简单社交图。到目前为止,大约有120,000个节点和~200,000个关系。
Neo4J的表现似乎有点昙花一现,像这样的查询偶尔需要200秒:
MATCH p=(:User {twId: 838853137247141888})-[:FOLLOWS*0..3]->(:User {twId: 40002648})
RETURN SUM(REDUCE(s = 1.0, n IN NODES(p)[0..-1] | s / SIZE((n)-->()))) AS connectedness
我已查看logs/debug.log
并注意以下常规信息流,即使图表上没有查询:
2017-05-27 18:50:40.041+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 2436ms.
2017-05-27 18:50:46.831+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 5705ms.
2017-05-27 18:50:55.631+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 8699ms.
2017-05-27 18:50:56.450+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 719ms.
我的.neo4j-community.vmoptions
仅包含以下内容
-Xmx6G
(我尝试了一大堆,看看这是否可以解决问题 - 它没有'
我在MacOS Sierra 10.12.4上运行Neo4J Community v3.1.3
说实话,我不知道在分析Neo或计算出服务器的功能时从哪里开始,文档对我的特定问题并没有多大帮助。
提示非常感谢。
更新
我在启动debug.log
时也看到了以下内容
2017-05-27 19:23:06.439+0000 ERROR [o.n.k.a.i.s.LuceneSchemaIndexProvider] Failed to open index:3, requesting re-population. Lock held by this virtual machine: /Users/chris/social-graph/schema/index/lucene/3/1/write.lock
org.apache.lucene.store.LockObtainFailedException: Lock held by this virtual machine: /Users/chris/social-graph/schema/index/lucene/3/1/write.lock
at org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:127)
at org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41)
at org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45)
更新
答案 0 :(得分:1)
提示:jvisualvm将为您提供有关正在运行的jvms的大量信息,例如使用哪个GC(在概述选项卡中,也许您将拥有-XX:+ UseG1GC)。
答案 1 :(得分:1)
就调优查询本身而言,您可能希望在运行扩展之前使用索引提示强制计划在两个节点上匹配,而不是从一个节点扩展然后过滤结束节点的默认行为。 / p>
在速度和简档方面,了解这对您有何帮助:
MATCH (start:User {twId: 838853137247141888}), (end:User {twId: 40002648})
USING INDEX start:User(twId)
USING INDEX end:User(twId)
MATCH p=(start)-[:FOLLOWS*0..3]->(end)
RETURN SUM(REDUCE(s = 1.0, n IN NODES(p)[0..-1] | s / SIZE((n)-->()))) AS connectedness
请注意,这可能不适用于Neo4j 3.2,我认为他们已经删除了RULE规划器,这是利用索引提示所必需的。
修改
有一种绕过上述3.2限制的方法...它不会像3.1.x上面的查询一样高效(根据profiled db命中),但它应该比原始查询更高效。 / p>
MATCH (start:User {twId: 838853137247141888}), (end:User {twId: 40002648})
MATCH p=(start)-[:FOLLOWS*0..3]->(x)
WHERE x = end
RETURN SUM(REDUCE(s = 1.0, n IN NODES(p)[0..-1] | s / SIZE((n)-->()))) AS connectedness