【问题标题】:Neo4j : How to combine multiple cyphers into one?Neo4j:如何将多个密码合二为一?
【发布时间】:2015-10-09 10:03:16
【问题描述】:

我有一个带有常用社交图的 Neo4j 数据库。我正在尝试创建一个活动源(用户 X 关注了你,用户 Y 喜欢了你的消息等)

UserMessage 节点。

还有FollowsLikesMentions 关系,每个关系都有一个created_on 属性。

(实际上我想要更多的关系,但为了简洁起见,我将其保留为 3 以作为示例)

我正在尝试返回一个活动事件列表,按日期分页和排序。每个活动都会有它发生的日期、与之相关的用户和消息(如果适用)。

我对每种活动类型/关系都有此工作,但我正在努力将它们全部组合成一个密码/响应。

Cyphers 分别是……

喜欢

MATCH (me:User {username:"matt"})-[:Owner]->(msg:Message)<-[likes:Likes]-(user:User) RETURN user, msg, likes.created_on ORDER BY likes.created_on LIMIT 25

提及

MATCH (me:User {username:"matt"})<-[mentions:Mentions]-(msg:Message)-[:Owner]-(user:User) RETURN user, msg, mentions.created_on ORDER BY mentions.created_on LIMIT 25

关注

MATCH (me:User {username:"Matt"})<-[follows:Follows]-(user:User) RETURN user, follows.created_on ORDER BY follows.created_on LIMIT 25

我最初将它们全部与optional 组合在一起,但这会返回每行不止一个结果/关系类型。因此,一个 Activity 可以同时具有 commentmention。这会弄乱限制请求,因为我们有 2 个活动占用一个结果。

然后我尝试了WHEREOR

 MATCH (me:User {username:"Matt"})-[r]-(m)--(u)
    WHERE me-[:Owner]->(m:Message)<-[r:Likes]-(u:User)
    OR me<-[r:Message]-(m:Message)-[:Owner]-(u:User)
    OR me<-[r:Follows]-(u:User)
    RETURN m, u, r.created_on
    ORDER BY r.created_on
    LIMIT 25

但我现在迷路了!这似乎根本没有返回任何结果

关于如何将上述密码组合到一个请求中的任何建议/指针?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    试试这样的

    MATCH (me:User {username:"matt"})
    OPTIONAL MATCH (me)-[:Owner]->(msg:Message)<-[likes:Likes]-(user:User) 
    WHERE likes.created_on > x-days-ago
    WITH me, msg, user, likes.created_on as created_on
    ORDER BY created_on LIMIT 25
    WITH me, collect(distinct {user:user, created_on:created_on}) as activities
    OPTIONAL MATCH (me)<-[mentions:Mentions]-(msg:Message)-[:Owner]->(user:User) 
    WITH me, msg, user, mentions.created_on as created_on, activities
    ORDER BY created_on LIMIT 25
    WITH me, activities + collect(distinct {user:user, created_on:created_on}) as activities
    OPTIONAL MATCH (me)<-[follows:Follows]-(user:User) 
    WITH me, msg, user, follows.created_on as created_on, activities
    ORDER BY created_on LIMIT 25
    UNWIND (activities + collect(distinct {user:user, created_on:created_on})) as activity
    RETURN activity
    ORDER BY activity.created_on LIMIT 25
    

    【讨论】:

      【解决方案2】:

      你可以使用联合http://neo4j.com/docs/stable/query-union.html 这样你就得到了所有的结果

      【讨论】:

      • 谢谢,我可以使用 UNION 方法,但是限制和订单适用于每个查询,而不是整个查询。显然尚不支持对 UNION 查询应用总体限制 (github.com/neo4j/neo4j/issues/2725) 如此接近,但到目前为止......
      • 也许会问 neo4j 他们会实现它。或者以后在代码中做
      猜你喜欢
      • 2013-07-24
      • 2017-03-07
      • 2019-01-16
      • 2012-12-30
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多