作为"Neo4j循环路径在无向图中的慢查找“问题的后续。Michael和Wes好心地提供了帮助,但我没有将所学到的技术应用到路径查找查询中,这些查询应该返回路径。
问题:
下面的查询大约取3s,并从数据库返回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图数据库有165 k节点和266 k关系,其中所有关系都是无向的(双向的),标签为"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=330Mdataset是通过跟踪维基百科文章之间的互连而生成的图表,可以从这里下载。
我从Neo4j启动,在Windows8机器上运行Neo4j.bat 1.9.M05社区。我不认为硬件会成为一个问题,因为查询只会导致10%的CPU峰值。有GBs的免费RAM可用。
我非常感谢关于如何使这个查询运行得更快的指针。
编辑:在有283 k节点和538k关系的略有增强的相同图中尝试了相同的查询。现在需要20秒!
编辑2,增加内存限制:按照Michael的建议将wrapper.java.initmemory和wrapper.java.maxmemory设置提高到8192 (8GB)。它确实将运行Neo4j的java进程的内存占用增加到了2,25 up,并且提高了查询的性能:现在,在热身查询上(在第三次运行之后)大约是1s。我还将neo4j.properties配置文件中的内存设置分别提高到2GB,但没有任何明显的效果。为此,我需要64bJava运行时(浏览器可以轻松下载的默认运行时是32b版本),因此我下载了它的手动安装程序。安装后,Neo4j将自动开始使用它,而不是32b版本。
发布于 2013-03-28 18:09:45
在Windows上运行时,请增加堆大小,因为MMIO直接内存是windows上java堆的一部分。
https://stackoverflow.com/questions/15549573
复制相似问题