2

在具有 165k 节点和 266k 关系的图中,我想运行以下 Cypher 查询:

START n=node:NodeIds('id:firstId'), t=node:NodeIds('id:secondId')   
MATCH (n)-[:RELATIONSHIP_TYPE*1..3]-(t)   
RETURN count(*)

其中firstIdsecondId是 NodeIds Lucene 索引的有效条目。

从 Neo4j 控制台执行查询大约需要 4 秒,我想了解它为什么这么慢以及如何使它更快。

从此索引查找大约需要 40 毫秒(即只返回两个节点的查询需要这么多),所以这不是问题。

我从 Neo4j.bat 开始使用默认设置在 Windows 8 机器上运行 Neo4j。我不认为硬件可能是一个问题,因为查询只会导致短暂的 10% CPU 峰值和几乎不可见的磁盘使用峰值。

顺便说一句,第一个节点的度数为 40,第二个为 2,结果为 1。

任何帮助,将不胜感激。

编辑1,内存配置:

我从 Neo4j.bat 开始使用 OOTB 配置运行 Neo4j,并使用以下有关内存的默认值(如果我没记错的话,这些是唯一与内存相关的配置):

wrapper.java.initmemory=16
wrapper.java.maxmemory=64

neostore.nodestore.db.mapped_memory=25M
neostore.relationshipstore.db.mapped_memory=50M
neostore.propertystore.db.mapped_memory=90M
neostore.propertystore.db.strings.mapped_memory=130M
neostore.propertystore.db.arrays.mapped_memory=130M

在黑暗中拍摄一个我将这些值提高到以下值:

wrapper.java.initmemory=128
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 的内存使用量(我的意思是运行 Neo4j 的 java.exe 实例的内存使用量)而没有很好地提高性能(查询花费的时间大致相同,偶尔可能增加 2-300 毫秒)。有 GB 的 RAM 可用,因此没有硬件限制。

编辑 2,分析器数据: 为相关查询运行分析器会产生以下结果:

neo4j-sh (0)$ profile START n=node:NodeIds('id:4000'), t=node:NodeIds('id:64599') MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t) RETURN count(*);
==> +----------+
==> | count(*) |
==> +----------+
==> | 1        |
==> +----------+
==> 1 row
==> 0 ms
==> 
==> ColumnFilter(symKeys=["  INTERNAL_AGGREGATE-939275295"], returnItemNames=["count(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["(  INTERNAL_AGGREGATE-939275295,CountStar)"], _rows=1, _db_hits=0)
==>   ExtractPath(name="path", patterns=["  UNNAMED3=n-[:ASSOCIATIVY_CONNECTION*1..3]-t"], _rows=1, _db_hits=0)
==>     PatternMatch(g="(n)-['  UNNAMED3']-(t)", _rows=1, _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) 

它说 0ms 但我不知道这应该是什么意思:结果在几秒钟后返回,并且在数据浏览器的控制台中执行的相同查询大约需要 3.5 秒(这是它显示的)并且大致相同的数量通过 RESTful 端点获取的时间。

编辑3,真实数据集: 理论已经够了:-),这是我真正在谈论的数据集:http: //associativy.com/Media/Default/Associativy/Wiki.zip这是一个生成的图表通过使用从维基百科转储文件创建的维基百科文章之间的链接。这仅仅是个开始。

我试图运行的真正查询实际上是以下查询,返回构建两个节点之间路径的节点:

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

我展示了 count 查询,因为我想要显示症状的最简单查询。

编辑4:

我专门针对路径返回查询打开了另一个问题。

4

2 回答 2

1

我同意韦斯的观点,这应该会立即返回。

您升级配置是有道理的,这是在 2 个不同的配置文件中,对吧?

当您在 Windows 上运行时,MMIO 位于 Java 堆内,所以我会将其设置为:

wrapper.java.initmemory=4096 wrapper.java.maxmemory=4096

返回的路径有多长?在您的领域中指定方向是否有意义?

您能否运行以下命令(使其适应返回的路径长度)

START n=node:NodeIds('id:4000'), 
      t=node:NodeIds('id:64599') 
MATCH path = (n)-[:ASSOCIATIVY_CONNECTION]-(a)
             (a)-[:ASSOCIATIVY_CONNECTION]-(b)-[:ASSOCIATIVY_CONNECTION]-(t) 
RETURN count(*), count(distinct a), count(a), count(distinct b), count(b);
于 2013-03-18T23:36:32.073 回答
0

您正在运行 1.9 里程碑版本吗?1.9 中的双向匹配器可能会比 1.8.x 做得更好。

于 2013-03-17T01:45:25.583 回答