neo4j对大型数据库的简单查询

时间:2016-12-06 16:43:40

标签: optimization neo4j out-of-memory cypher

有人可以向我解释一下:

Neo4j website上,它建议在搜索时使用节点标签

但是当我在大型数据库(200万个节点)上执行此操作时:

MATCH p = (n:Foo)-[r:Bar]->(m:Foo)<-[s:Bar]-(o:Foo) RETURN p LIMIT 1

它导致了一个可怕的广度优先搜索,比较了一个billon对象,并且该函数永远不会返回。

BFS

另一方面,无标签的等效物在不到一秒的时间内完成。

MATCH p = (n)-[r:Bar]->(m)<-[s:Bar]-(o) RETURN p LIMIT 1

DFS

有没有办法让标签版本执行相同类型的搜索?

1 个答案:

答案 0 :(得分:1)

这取决于您的数据,但您可以尝试将该查询分解为部分,以便为最终结果而努力。

MATCH (m:Foo)
WHERE SIZE( (m)<-[:Bar]-(:Foo) ) > 1
WITH m LIMIT 1
MATCH p = (n:Foo)-[r:Bar]->(m)<-[s:Bar]-(o:Foo) 
RETURN p LIMIT 1

如果我们从中心开始,计划程序将以不同的方式执行查询也是值得的:模式中的Foo节点而不是它现在正在做什么,这是从每个可能的终端节点扩展然后运行散列连接以查找中间的节点。

MATCH (m:Foo)
WITH m
MATCH p = (n:Foo)-[r:Bar]->(m)<-[s:Bar]-(o:Foo) 
RETURN p LIMIT 1