提问者:小点点

在无向图中使用有限路径优化Neo4j Cypher路径查找


作为问题“Neo4j Cypher路径在无向图中查找缓慢”的后续。Michael Hunger和Wes Freeman提供了帮助,但我未能将学到的技术应用于应该返回路径的路径查找查询。

问题:

下面的查询大约需要3秒,从数据库中返回13行(找到的路径)。我发现它很慢,希望它执行得更快,但不知道如何优化它。(这当然是一个例子,但我发现类似的其他查询也很慢。)

START n=node:NodeIds('id:4000'), t=node:NodeIds('id:10778')   
MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t)   
RETURN nodes(path) AS Nodes

配置文件数据也是如此:

neo4j-sh (0)$ profile START n=node:NodeIds('id:4000'), t=node:NodeIds('id:10778')    MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t)    RETURN nodes(path) AS Nodes;
==> +-------------------------------------------------------------------------------------------+
==> | Nodes                                                                                     |
==> +-------------------------------------------------------------------------------------------+
==> | [Node[3984]{Id:4000},Node[986]{Id:1001},Node[18536]{Id:18552},Node[10763]{Id:10778}]      |
==> | [Node[3984]{Id:4000},Node[1085]{Id:1100},Node[9955]{Id:9970},Node[10763]{Id:10778}]       |
==> | [Node[3984]{Id:4000},Node[133348]{Id:133364},Node[9955]{Id:9970},Node[10763]{Id:10778}]   |
==> | [Node[3984]{Id:4000},Node[111409]{Id:111425},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[64464]{Id:64480},Node[18536]{Id:18552},Node[10763]{Id:10778}]   |
==> | [Node[3984]{Id:4000},Node[64464]{Id:64480},Node[9955]{Id:9970},Node[10763]{Id:10778}]     |
==> | [Node[3984]{Id:4000},Node[64464]{Id:64480},Node[10763]{Id:10778}]                         |
==> | [Node[3984]{Id:4000},Node[64464]{Id:64480},Node[64455]{Id:64471},Node[10763]{Id:10778}]   |
==> | [Node[3984]{Id:4000},Node[79152]{Id:79168},Node[18536]{Id:18552},Node[10763]{Id:10778}]   |
==> | [Node[3984]{Id:4000},Node[69190]{Id:69206},Node[18536]{Id:18552},Node[10763]{Id:10778}]   |
==> | [Node[3984]{Id:4000},Node[25893]{Id:25909},Node[18536]{Id:18552},Node[10763]{Id:10778}]   |
==> | [Node[3984]{Id:4000},Node[31683]{Id:31699},Node[18536]{Id:18552},Node[10763]{Id:10778}]   |
==> | [Node[3984]{Id:4000},Node[6965]{Id:6980},Node[18536]{Id:18552},Node[10763]{Id:10778}]     |
==> +-------------------------------------------------------------------------------------------+
==> 13 rows
==> 2824 ms
==> 
==> ColumnFilter(symKeys=["path", "n", "t", "  UNNAMED3", "Nodes"], returnItemNames=["Nodes"], _rows=13, _db_hits=0)
==> Extract(symKeys=["n", "t", "  UNNAMED3", "path"], exprKeys=["Nodes"], _rows=13, _db_hits=0)
==>   ExtractPath(name="path", patterns=["  UNNAMED3=n-[:ASSOCIATIVY_CONNECTION*1..3]-t"], _rows=13, _db_hits=0)
==>     PatternMatch(g="(n)-['  UNNAMED3']-(t)", _rows=13, _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) 

设置:

Neo4j图数据库具有165k节点和266k关系,其中所有关系都是无向的(双向的),并且具有标签“ASSOCIATIVY_CONNECTION”。没有一个节点连接到根节点。除了节点和关系之外,每个节点只存储一个整数值(图数据库不用于存储实际数据,而仅用于结构)。

该数据库的内存配置如下:

wrapper.java.initmemory=1024
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. bat开始在Windows 8机器上运行Neo4j 1.9.M05社区。我认为硬件不会成为问题,因为查询只会导致短暂的10%CPU峰值。有GB的免费RAM可用。

我非常感谢有关如何使此查询运行得更快的指针。

编辑:在283k节点和538k关系的同一图的略微增强版本中尝试了相同的查询。现在需要20秒!

编辑2,增加内存限制:根据迈克尔的建议,我将wrapper.java. initMemory和wrapper.java.maxMemory设置提高到8192(8GB)。它确实将运行Neo4j的java进程的内存占用增加到2,25GB,并且还提高了查询的性能:现在预热查询大约为1秒(第三次运行后)。我还将neo4j.properties配置文件中的内存设置提高到每个2GB,但没有任何明显的效果。为了所有这些工作,我需要64bJava运行时(您可以轻松下载浏览器的默认版本是32b版本),所以我下载了手动安装程序。安装后,Neo4j将自动启动它,而不是32b版本。


共1个答案

匿名用户

当您在Windows上运行时,请增加堆大小,因为MMIO直接内存是Windows上java堆的一部分。