我有3种类型的节点:文章,股票,董事会。
一篇文章可以在多个董事会中共享,因此共享与文章之间存在1-n关系,共享与董事会之间存在1-n关系。
(article:`Article`)<-[:shared_article]-(share:`Share`)-[:shared_in]->(board:`Board`)
我想选择一个Article
,同时加载共享它的第一个 Board
(A share有一个创建日期属性)
如何在cypher中构建此查询?
我试过了:
MATCH (article:`Article`)<-[:shared_article]-(share:`Share`)-[:shared_in]->(board:`Board`)
WHERE article.created_at > ?
RETURN DISTINCT(article), board
ORDER BY board.created_at DESC
但它没有用。
我也试过这个:
MATCH (article:`Article`)<-[:shared_article]-(share:`Share`)-[:shared_in]->(board:`Board`)
WHERE article.created_at > ?
WITH article, board
ORDER BY board.created_at DESC
RETURN article, head(collect(board))
而且它正在工作,但是......我认为这是非常低效的,因为我选择了所有节点,而不是我选择的第一个节点。
有更好的解决方案吗?
答案 0 :(得分:1)
此查询可能适合您。它按article
排序board
/ board.created_at
对(按升序顺序,因为您需要第一个板),聚合每个board
的所有article
个,并返回每个article
及其第一个board
。我假设提供了time
参数。
MATCH (article:Article)<-[:shared_article]-(share:Share)-[:shared_in]->(board:Board)
WHERE article.created_at > {time}
WITH DISTINCT article, board
ORDER BY board.created_at
WITH article, COLLECT(board) AS boards
RETURN article, boards[0] AS first_board;
我认为time
是parameter。