neo4j在连接节点之间建立直接关系

时间:2017-10-26 14:33:03

标签: neo4j cypher

我有2个节点。其中第一个“b1”有16米的关系,第二个有“b” - 17k。标签B在id属性上编入索引。

检索他们是否有直接关系的查询是:

profile 
MATCH (b:B {id :'D006019' }) WITH b 
MATCH (b1:B {id :'D006801' }) WITH b, b1 
MATCH (b)-[r]-(b1) RETURN r

几点意见:

  • 查询速度极慢。它运行了5分钟。首先,它使nodeindexscan非常快,但不知何故,它设法获取节点b1并继续执行扩展此节点。 Byt“b1”有16m的关系,这与下面的过滤器破坏了性能

  • 如果我稍微更改一下,我可以足够快地进行此查询。

以下是更快的查询:

profile 
MATCH (bB {id :'D006019' }) WITH b 
MATCH (b1:B) WHERE b1.id IN ['D006801' ] WITH b, b1   
MATCH (b)-[r]-(b1)  RETURN r 

所以现在“b1”在“IN”子句中,neo4j开始扩展“b”,它只有17k关系,查询执行大约100 ms。

我的问题是:查询是否可以在neo4j在较少连接的节点上自动扩展的方式编写。

1 个答案:

答案 0 :(得分:0)

有时你必须给Cypher一些提示:

MATCH (b:B {id :'D006019'})
USING INDEX b:B(id)
MATCH (b1:B {id :'D006801'})
USING INDEX b1:B(id)
MATCH (b)-[r]-(b1)
RETURN r;

上述查询告诉Cypher它应该为前2个匹配中的每个匹配使用:B(id)索引。如果没有这些提示,计划者目前只会使用一次索引。