作为“ Neo4j Cypher path find 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
该数据集是通过维基百科文章之间的相互联系生成的图表,可从此处下载。
我从 Neo4j.bat 开始在 Windows 8 机器上运行 Neo4j 1.9.M05 社区。我不认为硬件可能是一个问题,因为查询只会导致短暂的 10% CPU 峰值。有 GB 的可用 RAM。
我将非常感谢有关如何使此查询运行得更快的指针。
编辑:在具有 283k 节点和 538k 关系的同一图表的略微增强版本中尝试了相同的查询。现在需要20秒!
编辑 2,增加内存限制: 根据 Michael 的建议,我将 wrapper.java.initmemory 和 wrapper.java.maxmemory 设置提高到 8192 (8GB)。它确实将运行 Neo4j 的 java 进程的内存占用增加到 2,25GB,并且还提高了查询的性能:现在预热查询大约需要 1 秒(第三次运行之后)。我还将 neo4j.properties 配置文件中的内存设置提高到每个 2GB,但它没有任何明显的效果。为了使所有这些工作,我需要 64b Java 运行时(您可以轻松为浏览器下载的默认版本是 32b 版本),因此我下载了它的手动安装程序。安装后 Neo4j 将自动启动它而不是 32b 版本。