使用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语句和一个限制的创建它工作但创建了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)
我从这个问题中傻眼了。请帮忙!
答案 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)