Cypher查询Neo4j中的条件顺序

时间:2016-07-30 10:22:27

标签: neo4j cypher

您好我想通过两个过滤器对图表结果进行排序..

我的Cypher查询看起来像这样..

{{1}}

现在如果ts> 3,我想只通过ts对final_score和rel_count ELSE srt的结果进行排序。 请修改订单..

2 个答案:

答案 0 :(得分:1)

1)您使用分页(跳过和限制)

2)如果我理解你需要什么,那么添加“else”来排序:

UNWIND RANGE(1,100) as i
WITH i, rand()*5 as x, toInt(rand()*10) as y
RETURN i, x, y, CASE WHEN x>3 THEN 1 ELSE 0 END as for_sort 
    ORDER BY 
        CASE 
            WHEN for_sort=1 THEN x ELSE y END DESC,
        CASE 
            WHEN for_sort=1 THEN y ELSE x END DESC

答案 1 :(得分:1)

这个简化的查询(使用ORDER BY的单个参数)是否适用于您?

MATCH (u:User)-[r:like]->(s:Story)
WITH s, (s.trending_score_all*4) AS ts
RETURN DISTINCT s.story_id, ts, TOINT(s.impression_count_72)
ORDER BY (CASE WHEN ts > 3 THEN ts ELSE TOINT(s.impression_count_72) END) DESC
LIMIT 10;

[EDITED]

如果您需要按不同数量的值进行排序(具体取决于具体情况),则必须使用变通方法,因为Cypher不直接支持。

例如,假设您想要按ts DESC然后按s.story_id ASC订购(ts> 3)。在这种情况下,您可以将上述ORDER BY子句更改为:

ORDER BY
  (CASE WHEN ts > 3 THEN ts ELSE TOINT(s.impression_count_72) END) DESC,
  (CASE WHEN ts > 3 THEN s.story_id ELSE NULL END) ASC

通过这种方式使用NULL(或任何文字值),您可以让任何子排序有效地执行任何操作。