NEO4J CYPHER查询按分类查询分组

时间:2014-04-04 18:56:54

标签: collections group-by neo4j cypher

我很难为一个用例提出正确的CYPHER查询:

我有USERHOBBY作为节点。 CommentUser Hobbies的关系UserHobbies可以Users COMMENT Hobbies User HOBBIES COMMENTS {/ 1}}。{/ 1}

问题:显示CommentsUser,其中MATCH (u:user)-[r:comment]->(n:Hobby) WHERE has(r.`comment`) and u.id = 'Test' RETURN DISTINCT n.id,n.name, n.description, COLLECT(r.id) as `comment` ORDER BY r.creationdate DESC 的最新r.creationdate按最新的排序。

我想要执行的查询是:

{{1}}

显然,{{1}}无法用于在分组结果中进行排序。还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

尝试在汇总前强制执行订单。 <怎么样

MATCH (u:user {id:'test'})-[r:comment]->(n:Hobby)
WHERE has(r.comment)
WITH n, r
  ORDER BY r.creationdate
RETURN n.id, n.name, n.description, COLLECT(r.id) as comment

(旁注:我建议&#39;惯用&#39;或者至少一致的样式用于查询,例如类型标签就像你的名字一样((:User) )和关系类型就像你在互联网上大喊一样([:COMMENT])。这对于有效性或性能没有任何区别,但它很好,它有助于避免愚蠢的错误遵循任意约定。)

答案 1 :(得分:1)

你不需要在你的情况下有所区别,聚合已经不同了

r在您要对其进行排序时不再存在。

  1. 要么你不收集,那么你可以按它排序,
  2. 或者您使用WITH预先对其进行排序。
  3. 或按min(r.creationdate)max(r.creationdate)
  4. 排序

    代表2:

    MATCH (u:user)-[r:comment]->(n:Hobby) 
        WHERE has(r.`comment`) and u.id = 'Test' 
    WITH
        n, r.id as rid 
    ORDER BY 
        r.creationdate DESC
    RETURN n.id,n.name, n.description, collect(rid) as comment
    

    代表3:

    MATCH (u:user)-[r:comment]->(n:Hobby) 
        WHERE has(r.`comment`) and u.id = 'Test' 
    RETURN 
        DISTINCT n.id,n.name, n.description, COLLECT(r.id) as `comment`, max(r.creationdate)
    ORDER BY 
        max(r.creationdate) DESC