我想收集具有相同属性值的所有节点
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)
。但是,我希望索引已经涵盖了排序。
我怎么弄错了,如何优化此查询?
答案 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))。