2013-03-21 114 views
1

作为“Neo4j Cypher path finding slow in undirected graph”问题的后续处理。 Michael Hunger和Wes Freeman很有帮助,但我没有将所学的技术适用于应该返回路径的路径查找查询。在无向图中优化Neo4j Cypher路径查找与有限路径

问题:

的下面查询需要大约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 

该数据集是由以下的维基百科文章之间的互连所产生的曲线图,是从here下载。

我从Neo4j.bat开始在Windows 8机器上运行Neo4j 1.9.M05社区。我不认为硬件可能成为一个问题,因为查询只会导致10%的CPU高峰。有可用RAM的GB。

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

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

编辑2,增加存储器限制: 诚如通过迈克尔我调升wrapper.java.initmemory和wrapper.java.maxmemory设置到8192(8GB)。它的确将内存占用量增加到运行Neo4j的Java进程的2,25GB,并且它增加了查询的性能:现在它在热身查询(在第三次运行之后)上升了大约1秒。 我也将neo4j.properties配置文件中的内存设置调高到2GB,但没有任何明显的效果。 对于所有这些工作,我需要64b Java运行时(您可以轻松地为您的浏览器下载的默认一个是32b版本),所以我为它下载了manual installer。安装完成后,Neo4j会自动启动,而不是32b版本。

回答

1

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

+0

谢谢!你的意思是wrapper.java.initmemory和wrapper.java.maxmemory值? – Piedone 2013-03-28 23:55:38

+0

是的,最好将它们都设置为4G或8G之类的东西 – 2013-03-30 16:09:00

+0

谢谢!请在问题中查看我的编辑。它提高了性能,但它仍然处于可用于具有响应式UI的应用程序的边缘。它可以做得更快,或者这是限制吗? – Piedone 2013-04-03 08:36:52