【问题标题】:neo4j adding create to cypher query changes query executionneo4j 将 create 添加到 cypher 查询更改查询执行
【发布时间】:2015-08-04 07:51:52
【问题描述】:

使用 neo4j 2.3 我创建了一个查询来查找与两个节点有关系的所有节点,并为它们创建与第三个节点的关系

   MATCH (:group{Id:'1'})-->(b:item)<--(:group{Id:'2'} )
,   (g:ComboGroup{Id:'(1) AND (2))'})
Create (g)-[:HasItem]->( b)

这个查询永远不会结束
但是当我确实返回时

  MATCH (:group{Id:'1'})-->(b:item)<--(:group{Id:'2'} )
, (g:ComboGroup{Id:'(1) AND (2))'})
RETURN g, b

我通过创建 2709 关系得到了正确的结果

这是我得到的计划

现在我添加了一个 with 语句和一个对 create 的限制,它工作但创建了 3000 个关系而不是 2709 个

MATCH (:group{Id:'1'})-->(b:item)<--(:group{Id:'2'} )
,   (g:ComboGroup{Id:'(1) AND (2))'})
WITH b,g limit 3000
Create (g)-[:HasItem]->( b)

我被这个问题吓傻了。请帮忙!

【问题讨论】:

  • 你有:group(Id)的索引吗?

标签: neo4j cypher


【解决方案1】:

因为只读查询使用了不同的查询计划器,所以新的基于 COST 的计划器更快、更高效。

对于写入查询,使用之前基于 RULE 的计划器,这可能无法创建最佳计划。

有时在两个查询中将读取(计算)操作与写入(更新)操作分开可能会更好(对于计算信息的复杂查询)。

您可以从读取查询中返回计算值和节点 ID,然后使用它们来更新图形

更新

对于您的查询,您是否有以下索引::group(Id):ComboGroup(Id)

由于您希望查询使用多个索引,因此您必须在 match 子句之后添加 using index

MATCH (a:group{Id:'1'})-->(b:item)<--(c:group{Id:'2'} ),
      (g:ComboGroup{Id:'(1) AND (2))'})
using index a:group(Id) 
using index c:group(Id) 
using index g:ComboGroup(Id)
Create (g)-[:HasItem]->( b)

【讨论】:

  • 感谢重播。这个问题在企业版中解决了吗?我更新了很多关系,并且来回传递 id 会使偏好压力同样大
  • 我会尝试添加使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多