在订购结果之前汇总多个匹配项

时间:2018-08-25 04:31:16

标签: neo4j cypher

我有一个活动节点(a),它指向(:Something),可以通过与:LIKE的直接:User 'me'关系进行匹配 OR a {通过:LIKE建立的{1}}关系。

第一个关系可以描述为:

:FRIEND

第二种关系可以描述为:

MATCH (a)-[:REF]->(:Something)<-[:LIKE]-(:User {user: 'me'})

我将如何对所有不同的活动节点MATCH (a)-[:REF]->(:Something)<-[:LIKE]-(:User)<-[:FRIEND]-(:User {user: 'me'}) 进行分组,以便可以按时间戳对完整列表进行排序?看起来像这样:

(a)

1 个答案:

答案 0 :(得分:1)

您可以使用the variable-length pattern matching

// u = node "me" or the node "friend"
MATCH
  (:User {user: 'me'})-[:FRIEND*0..1]->(u:User)
MATCH
  (a)-[:REF]->(:Something)<-[:LIKE]-(u)
RETURN DISTINCT a 
ORDER BY a.ts DESC

更新:如果查询完全不同,则可以收集第一个查询的结果,然后收集第二个查询的结果,汇总并展开:

MATCH 
  (a1)-[:REF]->(:Something)<-[:OWN]-(:User {user: 'me'})
WITH
  collect(DISTINCT a1) AS ac1
MATCH 
  (a2)-[:REF]->(:Something)<-[:INCLUDES]-(:SomethingElse)<-[:LIKE]-(:User {user: 'me'})
WITH
  ac1, collect(DISTINCT a2) AS ac2 
UNWIND 
  ac1 + ac2 AS a
RETURN DISTINCT a
ORDER BY a.ts DESC