neo4j将create添加到cypher查询更改查询执行

时间:2015-08-04 07:51:52

标签: neo4j cypher

使用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关系后得到了正确的结果

这是我得到的计划

enter image description here

现在我添加了一个with语句和一个限制的创建它工作但创建了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)

我从这个问题中傻眼了。请帮忙!

1 个答案:

答案 0 :(得分:1)

由于不同的查询规划器用于只读查询,因此新的基于COST的规划器更快,更高效。

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

有时可能更好(使用计算信息的复杂查询)将读取(计算)操作与两次查询中的写入(更新)操作分开。

您可以从读取查询中返回计算值和node-id,然后使用它们更新图表

更新

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

如果您希望查询使用多个索引,则必须在匹配子句后添加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)