Neo4J 数据库性能

Neo4J Database Performance

我们有一个 Neo4J 数据库(运行 企业版 4.3.2)包含:

6,800,000 个节点,标签为 itemA。 带有标签 itemB 的 25,000 个节点。 带有标签 itemC.

的 18 个节点

带有标签 itemA 的每个节点都通过称为 a_b.

的关系与至少一个带有标签 itemB 的节点相关

带有标签 itemA 的每个节点都通过称为 a_c.

的关系与至少一个带有标签 itemC 的节点相关

有 7,000,000 a_b 个关系。 有 7,000,000 a_c 个关系。

带有标签 itemA 的节点有一个 属性 prop1,其中包含 3 个字符串值之一 - 每个字符串的长度大约为 20 个字符。 prop1 已编入索引。

以下查询及其结果:

Query Duration(ms)
match (a:itemA) return count(a) 1
match (b:itemB) return count(b) 1
match (a:itemA)-[r:a_b]->(b:itemB) count(a) 1,800-2,200
match (a:itemA)-[r:a_b]->(b:itemB) return a.prop1, count(a) 10,500-14,000
match (a:itemA)-[r:a_b]->(b:itemB), (a)-[r2:a_c]->(c:itemC) return count(a) 14,500
match (a:itemA)-[r:a_b]->(b:itemB), (a)-[r2:a_c]->(c:itemC) return a.prop1, count(a) > 20,000

我们咨询了 Neo4J 的支持团队。我们很高兴我们的服务器有足够的资源并且 Neo4J 数据库服务器配置正确。

我的问题:

这种规模的查询真的应该这么慢吗?如果不是,我们做错了什么?

第三个和第四个查询可以优化,因为你只计算节点度:

第三个查询:

match (a:itemA)
WITH a,size((a)-[:a_b]->()) as degree
RETURN sum(degree) as result

第四个查询:

match (a:itemA) return a.prop1, size((a)-[:a_b]->())    

第五和第六个查询无论如何都会爆炸式增长,因为您正在计算同时出现的次数,结果可能会得到很大的数字。您可以使用 PROFILE 子句来检查幕后发生的事情。