在具有 165k 节点和 266k 关系的图中,我想运行以下 Cypher 查询:
START n=node:NodeIds('id:firstId'), t=node:NodeIds('id:secondId')
MATCH (n)-[:RELATIONSHIP_TYPE*1..3]-(t)
RETURN count(*)
其中firstId
和secondId
是 NodeIds Lucene 索引的有效条目。
从 Neo4j 控制台执行查询大约需要 4 秒,我想了解它为什么这么慢以及如何使它更快。
从此索引查找大约需要 40 毫秒(即只返回两个节点的查询需要这么多),所以这不是问题。
我从 Neo4j.bat 开始使用默认设置在 Windows 8 机器上运行 Neo4j。我不认为硬件可能是一个问题,因为查询只会导致短暂的 10% CPU 峰值和几乎不可见的磁盘使用峰值。
顺便说一句,第一个节点的度数为 40,第二个为 2,结果为 1。
任何帮助,将不胜感激。
编辑1,内存配置:
我从 Neo4j.bat 开始使用 OOTB 配置运行 Neo4j,并使用以下有关内存的默认值(如果我没记错的话,这些是唯一与内存相关的配置):
wrapper.java.initmemory=16
wrapper.java.maxmemory=64
neostore.nodestore.db.mapped_memory=25M
neostore.relationshipstore.db.mapped_memory=50M
neostore.propertystore.db.mapped_memory=90M
neostore.propertystore.db.strings.mapped_memory=130M
neostore.propertystore.db.arrays.mapped_memory=130M
在黑暗中拍摄一个我将这些值提高到以下值:
wrapper.java.initmemory=128
wrapper.java.maxmemory=1024
neostore.nodestore.db.mapped_memory=225M
neostore.relationshipstore.db.mapped_memory=250M
neostore.propertystore.db.mapped_memory=290M
neostore.propertystore.db.strings.mapped_memory=330M
neostore.propertystore.db.arrays.mapped_memory=330M
这确实增加了 Neo4j 的内存使用量(我的意思是运行 Neo4j 的 java.exe 实例的内存使用量)而没有很好地提高性能(查询花费的时间大致相同,偶尔可能增加 2-300 毫秒)。有 GB 的 RAM 可用,因此没有硬件限制。
编辑 2,分析器数据: 为相关查询运行分析器会产生以下结果:
neo4j-sh (0)$ profile START n=node:NodeIds('id:4000'), t=node:NodeIds('id:64599') MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t) RETURN count(*);
==> +----------+
==> | count(*) |
==> +----------+
==> | 1 |
==> +----------+
==> 1 row
==> 0 ms
==>
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATE-939275295"], returnItemNames=["count(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATE-939275295,CountStar)"], _rows=1, _db_hits=0)
==> ExtractPath(name="path", patterns=[" UNNAMED3=n-[:ASSOCIATIVY_CONNECTION*1..3]-t"], _rows=1, _db_hits=0)
==> PatternMatch(g="(n)-[' UNNAMED3']-(t)", _rows=1, _db_hits=0)
==> Nodes(name="t", _rows=1, _db_hits=1)
==> Nodes(name="n", _rows=1, _db_hits=1)
==> ParameterPipe(_rows=1, _db_hits=0)
它说 0ms 但我不知道这应该是什么意思:结果在几秒钟后返回,并且在数据浏览器的控制台中执行的相同查询大约需要 3.5 秒(这是它显示的)并且大致相同的数量通过 RESTful 端点获取的时间。
编辑3,真实数据集: 理论已经够了:-),这是我真正在谈论的数据集:http: //associativy.com/Media/Default/Associativy/Wiki.zip这是一个生成的图表通过使用从维基百科转储文件创建的维基百科文章之间的链接。这仅仅是个开始。
我试图运行的真正查询实际上是以下查询,返回构建两个节点之间路径的节点:
START n=node:NodeIds('id:4000'), t=node:NodeIds('id:64599') MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t) RETURN nodes(path) AS Nodes
我展示了 count 查询,因为我想要显示症状的最简单查询。
编辑4:
我专门针对路径返回查询打开了另一个问题。