Neo4J Cypher:仅当rowcount小于阈值时才返回一些属性

时间:2014-01-30 14:20:58

标签: neo4j cypher

我有一个像这样的密码查询:

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。

1 个答案:

答案 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上收集,获取收集长度,然后将集合展开回具有内容权重的行。抱歉给您带来不便。