1

我有一个相对较小的图表(2.5M 节点,5M rel,7.7M 属性)并且我正在执行(在我看来)一个简单的查询,但在基于 SSD 的快速笔记本电脑上执行需要 63 秒。这真的是我应该从 Neo4j 获得的性能,还是查询有什么问题?

start ph=node(2)
match ph-[:NEXT_LEVEL]->c
where c.tag = "class 1"
with c
match c-[:NEXT_LEVEL]->p<-[:SOLD]-l<-[:LINE]-h-[:SOLD_IN]->s
return s.tag as store, sum(l.item_quantity) as quantity order by s.tag;

控制台输出

更新:只想发布更新的查询:

start ph=node(2)
match ph-[:NEXT_LEVEL]->c-[:NEXT_LEVEL]->p<-[:SOLD]-l<-[:LINE]-h-[:SOLD_IN]->s
where c.tag = "class 1"
with s.tag as store, sum(l.item_quantity) as quantity
return store, quantity order by store;

带有更新查询的控制台

4

1 回答 1

0

除非您有特定的用例,否则您通常应该尝试删除该WITH子句以提高性能。

start ph=node(2)
match ph-[:NEXT_LEVEL]->c-[:NEXT_LEVEL]->p<-[:SOLD]-l<-[:LINE]-h-[:SOLD_IN]->s
where c.tag = "class 1"
return s.tag as store, sum(l.item_quantity) as quantity order by s.tag;

编辑:ORDER BY正如评论中所讨论的,我们可以通过强制在聚合之后而不是之前发生来获得更好的性能。我们可以通过使用来做到这一点WITH(所以有我们刚刚讨论的特定用例)。这里的不同之处在于我们将WITH子句尽可能地移到了末尾,允许将所有先前的处理组合在一起而不是分开。

start ph=node(2)
match ph-[:NEXT_LEVEL]->c-[:NEXT_LEVEL]->p<-[:SOLD]-l<-[:LINE]-h-[:SOLD_IN]->s
where c.tag = "class 1"
with s.tag as store, sum(l.item_quantity) as quantity
return store, quantity order by store;
于 2013-06-10T15:14:53.360 回答