我有一个像这样的密码查询:
match (s)-[r]-(m)
where s.id='...' and r.id='...'
return s.id as id, s.title as title, s.content as content
我想要实现的是仅当总行数小于给定阈值(例如5)时才返回s.content的(可能非常大)值。
我试过
match (s:mytype)-[r:myothertype]-(m:mytype)
where s.id='...' and r.id='...'
return s.id as id, s.title as title,
case
when count(*) < 5 s.content
else null
end as content
这个查询似乎在语法上是正确的,但它需要永远回来并最终撕下我的服务器,即使数据库中只有10个节点和4个关系。
我做错了什么?
提前完成,
延
P.S。只是说清楚:我不想限制结果。在所有情况下,我都需要所有节点的id和title。
答案 0 :(得分:2)
有一些因素可能导致您的性能问题,但这很大程度上取决于您的数据。您已在示例中进行了概括,但我们假设您尚未在x.id
的属性上设置索引。
运行以下查询以在属性mytype
的标签id
上设置索引:
CREATE INDEX ON :mytype(id)
然后请尝试此优化查询。问题可能是,对于每个s
节点,您正在对整个集合执行计数聚合。这看起来很昂贵。
MATCH (s:mytype { id: '...' })
MATCH (s)-[r:myothertype { id: '...'}]-(:mytype)
WITH count(*) as content_weight
MATCH (s:mytype { id: '...' })
MATCH (s)-[r:myothertype { id: '...'}]-(:mytype)
WITH s, content_weight,
(CASE
WHEN content_weight < 5 THEN s.content
ELSE null
END) as content
RETURN s.id, s.title, content
更新:你会在这里看到两场比赛。使用Cypher即将推出的功能还有另一种方法可以进行此查询。现在,这个查询应该运行良好。执行此操作的正确方法是在s
上收集,获取收集长度,然后将集合展开回具有内容权重的行。抱歉给您带来不便。