作为问题“Neo4j Cypher path finding slow in undirected graph”的后续行动。 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
数据集是通过维基百科文章之间的互连生成的图表,可从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版本。
答案 0 :(得分:1)
当您在Windows上运行时,请增加堆大小,因为MMIO直接内存是Windows上Java堆的一部分。