MATCH (a:Author {id:'author_1'}),
(art:Article {id:'PMID:21473878'})
WITH a, art
MATCH r=((a)-[*2..4]-(art))
RETURN r
在一个拥有大约130万个节点和800万个关系的数据库中,此查询将永远运行。我有什么可以做的吗?
有索引:作者和:文章ID
===============
答案 0 :(得分:1)
在这种特殊情况下,查询规划器有时会在连接到您已知道的两个节点的模式时使用低效方法。
在这种情况下,规划器将一个节点作为起始节点,从给定模式扩展到所有可能的节点,然后对所有这些节点应用过滤器以查看它是否是该节点的另一个节点。比赛结束。这是不必要的属性访问,尤其是对于大量匹配的节点。
更好的方法是通过索引查找起始节点和结束节点,然后从其中一个节点执行扩展,并使用散列连接来确定哪些端节点与端节点相同你正在寻找。这种方法仅在匹配有问题的终端节点的id时使用属性访问(而不是在扩展结束时找到的每个节点)。
现在的诀窍是如何让Neo4j在规划器中使用这种方法。这可能有效:
MATCH (a:Author {id:'author_1'}),
(art:Article {id:'PMID:21473878'})
MATCH r=((a)-[*2..4]-(end))
WHERE end = art
RETURN r
至少,我希望这与使用可选竞赛的方法一样快。
答案 1 :(得分:0)
前两场比赛没有必要。删除它并尝试:
MATCH r=(:Author {id:'author_1'})-[*2..4]-(:Article {id:'PMID:21473878'})
return r