我们有一个Neo4J数据库(运行在企业版4.3.2上),它包含:
680万个节点的标签为itemA
。25000个节点,标签为itemB
。18个节点标签为itemC
每个标签为itemA
的节点至少与一个标签为itemB
的节点通过称为a_b
的关系相关联。
每个节点与标签itemA
与至少一个节点通过一个关系与标签itemC
称为a_c
。
有7,000,000个a_b
关系。有7000000个a_c
关系。
标签为itemA
的节点有一个属性prop1
,它包含3个字符串值中的一个,每个字符串值的长度约为20个字符。prop1
已被索引
下列查询及其结果:
match (a:itemA) return count(a)
match (b:itemB) return count(b)
match (a:itemA)-[r:a_b]->(b:itemB) count(a)
match (a:itemA)-[r:a_b]->(b:itemB) return a.prop1, count(a)
match (a:itemA)-[r:a_b]->(b:itemB), (a)-[r2:a_c]->(c:itemC) return count(a)
match (a:itemA)-[r:a_b]->(b:itemB), (a)-[r2:a_c]->(c:itemC) return a.prop1, count(a)
第三和第四个查询可以优化,因为您只计算节点度:
第三查询:
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
子句来检查引擎盖下面发生了什么。