首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何告诉cypher在哪里进行nodehashjoin

如何告诉cypher在哪里进行nodehashjoin
EN

Stack Overflow用户
提问于 2017-08-24 21:53:43
回答 1查看 79关注 0票数 1

我对某些类型的查询有非常有趣的观察。

我的起始查询是:

代码语言:javascript
复制
PROFILE 
MATCH (cs:Movie { id: 'm:H01016' }) WITH cs 
MATCH (ms:Actor { id: 'a:111' }) WITH cs,ms  
MATCH p=((cs)--(x0)--(x1)--(x2)--(ms))   
RETURN EXTRACT(n IN nodes(p) | n)  SKIP 0 LIMIT 24

使用我的数据,它执行141ms

稍微修改一下这个查询

代码语言:javascript
复制
PROFILE 
MATCH (cs:Movie { id: 'm:H01016' }) WITH cs 
MATCH (ms:Actor { id: 'a:111' }) WITH cs,ms  
MATCH p=((cs)--(x0:Director)--(x1)--(x2)--(ms))   
RETURN EXTRACT(n IN nodes(p) | n)  SKIP 0 LIMIT 24

它开始执行7-8秒。我看到的唯一区别是nodehashjoin发生在哪里。

第一个执行计划是:

第二个看起来像这样:

区别是非常明显的。在第一个查询中,我们在两端都有2个扩展,nodehashjoin发生在中间,而在第二个查询中,我们有3个扩展,1个扩展在另一个端,nodehashjoin发生在末尾。在第二次查询时,这3个扩展导致超过一百万分贝的命中。那么,有没有办法指导nodehashjoin必须在哪里发生呢?

下面是执行缓慢的查询的扩展版本。我相信这里面没什么奇怪的。只是nodehashjoin发生在一个不合适的地方:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-25 21:35:44

因此,如果您想以某种方式更改查询优化的行为,实际上有一个技巧可以使用。我没有你的数据集来测试它,但是这个子句可以影响你的执行计划。这样,您可以将展开(全部)和筛选器更改为展开( into )运算符:

代码语言:javascript
复制
with * where true
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45863482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档