用于匹配具有相等值的节点的查询优化

时间:2016-10-12 14:16:30

标签: neo4j cypher

我想收集具有相同属性值的所有节点

MATCH (rhs:DataValue),(lhs:DataValue) WHERE rhs.value = lhs.value RETURN rhs,lhs

我在属性上创建了一个索引

CREATE INDEX ON :DataValue(value)

创建索引:

Indexes
    ON :DataValue(value)          ONLINE                             

我只有2570个DataValues。

match (n:DataValue) return count(n)
> 2570

但是,查询需要很长时间/不会在浏览器的超时时间内终止。

这让我感到惊讶,因为我有一个索引,并期望查询在O(n)内运行,其中n是节点数量。

我的想法是:如果我自己实现它,我可以匹配所有节点O(n)按值O(n log n)对它们进行排序,然后浏览排序列表并返回所有更长的子列表超过1 O(n)。因此,我可以存档的时间是O(n log n)。但是,我希望索引已经涵盖了排序。

我怎么弄错了,如何优化此查询?

1 个答案:

答案 0 :(得分:2)

你的复杂度实际上是O(n ^ 2),因为你的匹配为rhs和lhs创建了一个笛卡尔积,然后对每个配对进行过滤以查看它们是否相等。索引根本不适用于您的查询。您应该能够通过在查询上运行EXPLAIN或PROFILE来确认。

你需要稍微调整一下你的查询才能得到O(n)。希望在未来的neo4j版本中,查询计划将更加智能,因此我们不必如此明确。

MATCH (lhs:DataValue)
WITH lhs
MATCH (rhs:DataValue)
WHERE rhs.value = lhs.value 
RETURN rhs,lhs

请注意,您返回的值将包含相反的对((A,B),(B,A))。