Neo4j Cypher路径在无向图中发现缓慢

时间:2013-03-17 00:27:46

标签: performance neo4j cypher

在具有165k节点和266k关系的图表中,我想运行以下Cypher查询:

START n=node:NodeIds('id:firstId'), t=node:NodeIds('id:secondId')   
MATCH (n)-[:RELATIONSHIP_TYPE*1..3]-(t)   
RETURN count(*)

其中firstIdsecondId是NodeIds Lucene索引的有效条目。

从Neo4j控制台执行查询大约需要4秒钟,我想了解它为什么这么慢以及如何加快速度。

从这个索引查找需要大约40毫秒(即只返回两个节点的查询需要那么多),所以这不是问题。

我从Neo4j.bat开始使用默认设置在Windows 8计算机上运行Neo4j。我不认为硬件可能是一个问题,因为查询只会造成短暂的10%CPU峰值和磁盘使用率几乎不可见的峰值。

BTW第一个节点的度数为40,第二个节点的度数为1,结果为1。

任何帮助都将不胜感激。

编辑1,内存配置:

我使用OOTB配置运行Neo4j,从Neo4j.bat开始,使用以下关于内存的默认值(如果我没有弄错,那些是与内存相关的唯一配置):

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-300ms)。有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,5s(这是它显示的内容)和粗略通过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

我展示了计数查询,因为我想要最简单的查询来显示症状。

编辑4:

opened another question专门针对路径返回查询。

2 个答案:

答案 0 :(得分:1)

我同意Wes,这应该马上回来。

你提到配置是有意义的,这是2个不同的配置文件,对吗?

当你在Windows上运行时,MMIO在java堆中,所以我想把它改为:

wrapper.java.initmemory = 4096 wrapper.java.maxmemory = 4096

返回的路径有多长?在您的域中指定方向是否有意义?

可以请运行以下内容(使其适应返回的路径长度)

START n=node:NodeIds('id:4000'), 
      t=node:NodeIds('id:64599') 
MATCH path = (n)-[:ASSOCIATIVY_CONNECTION]-(a)
             (a)-[:ASSOCIATIVY_CONNECTION]-(b)-[:ASSOCIATIVY_CONNECTION]-(t) 
RETURN count(*), count(distinct a), count(a), count(distinct b), count(b);

答案 1 :(得分:0)

您是否正在运行1.9里程碑版本? 1.9中的双向匹配器可能比1.8.x好得多。