我有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在较少连接的节点上自动扩展的方式编写。
答案 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)
索引。如果没有这些提示,计划者目前只会使用一次索引。