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

neo4j simple query on large database

谁能给我解释一下:

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

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

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

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

另一方面,无标签等效项在不到一秒内完成。

MATCH p = (n)-[r:Bar]->(m)<-[s:Bar]-(o) RETURN p LIMIT 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