2016-12-06 37 views
1

可能有人给我讲解一下:Neo4j的大型数据库的简单查询

在其建议搜索

在使用节点标签我这样做对大型数据库然而,当Neo4j website(2万个节点):

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

有没有什么办法,使标记的版本执行相同类型的搜索?

+0

你使用的是什么版本的neo4j? – cybersam

+0

你试过指定单向关系吗? – RustyB

+0

是的,我已经把它放在描述中了,3.0.7版 –

回答

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 

这也可能是值得一试,如果规划器将执行不同,如果我们从中心开始查询:在模式美孚节点,而不是它在做什么,现在,它是从的每一个可能的终端节点扩展然后运行散列连接来查找中间的节点。

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

非常好,你的第一个建议会碰撞到头部(第二个给出了慢速散列连接,我猜它是等效的) –