【问题标题】:How can I grab a date in Neo4j GraphQL that is either from the relationship or from the node?如何从关系或节点中获取 Neo4j GraphQL 中的日期?
【发布时间】:2022-01-02 04:12:31
【问题描述】:

您好,下面是在 Neo4j GraphQL 的上下文中(所以我需要确保我在这里返回节点,而不是 Maps 或任何东西,我认为)。

我有节点Users 和Posts,用户可以在其中撰写或转发帖子。基本上帖子有created_date 字段,但是当用户“转发”该帖子时,我想知道该转发的时间。

典型的关系如下所示:

(u:User)-[r:WROTE]->(post:Post)

帖子创建日期字段的位置。当用户重新发布它时,基础帖子不会更改,他们只是向该帖子添加一个 REPOSTED 关系。像这样:

(u:User)-[r:REPOSTED]->(post2:Post)

当我想查看用户的帖子时,我想抓取他们撰写或转发的任何内容,并按照 post.created_date 的顺序(如果他们WROTE 帖子或REPOSTED 时间)进行排序如果他们转发了。

我不知道我应该在这里做什么,所以我尝试了这样的事情,但它没有及时编辑 repost_date(它没有返回正确的结果)。

MATCH (u:User)-[r:WROTE|REPOSTED]->(post:Post)
WITH (CASE WHEN r.created_date IS NOT NULL THEN r.created_date ELSE post.date END) as repost_date, post
SET post.repost_date = repost_date
RETURN post, repost_date
ORDER BY repost_date DESC
LIMIT 10

是否有另一种方法来获取并返回两个日期(当两者都存在时,即它是一个 REPOST)?

提前谢谢你!

【问题讨论】:

  • 我不确定您在此处描述的数据结构是否完全有意义。如果许多用户重新发布帖子会发生什么?这些日期将存储在哪里?
  • 每个用户都将与该帖子建立关系,该关系将具有属性,例如上面示例的 r.created_date。
  • 你想只包含转发还是包含没有转发的帖子
  • 两者都是@TomažBratanič!基本上任何时候都有帖子或转发,但是当它是转发时,我想返回 repost_date。

标签: neo4j graphql cypher


【解决方案1】:

有几种方法可以实现您想要的。可能最简单的是:

MATCH (u:User)-[r:WROTE|REPOSTED]->(post:Post)
WITH post, coalesce(r.created_date, post.created_date) AS date
ORDER BY date DESC
LIMIT 10
RETURN post

您也可以使用子查询 UNION,然后使用后过滤

MATCH (u:User)
CALL {
  MATCH (u)-[:WROTE]->(p:Post)
  RETURN p, p.created_date as date
  UNION 
  MATCH (u)-[r:REPOSTED]->(p:Post)
  RETURN p, r.created_date as date
}
WITH p, date
ORDER BY date DESC
LIMIT 10
RETURN p

第三种选择是使用 CASE 语句

MATCH (u:User)-[r:WROTE|REPOSTED]->(post:Post)
WITH post, CASE WHEN r:REPOSTED THEN r.created_date ELSE post.created_date END AS date
ORDER BY date DESC
LIMIT 10
RETURN post

您可以使用 PROFILE 子句来查看什么是最好的

【讨论】:

  • 您好,这看起来很有趣,但我认为它不适用于 Neo4j/GraphQL,因为 graphql 查询需要单个节点作为回报。我可以在返回之前将新日期放入节点中吗?或者,如果它不是节点的一部分,GraphQL 库是否可以访问该日期值?
  • 你可以按日期排序,然后只返回节点,我会编辑查询
  • 但是,在这里您丢失了重新发布日期,这很糟糕。您需要创建一个自定义类型来返回我猜的两个日期。但是,您可能会失去执行额外子查询以扩展任何关系的可能性。
  • 对不起,我希望能够访问客户端中的日期(用于显示目的,基本上是重新发布的时间)。而不仅仅是订购它们。那可能吗?顺便说一句,非常感谢!
  • 啊,我明白了!有趣,在这里感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多