选择与条件匹配的所有节点,以及n-n关系的第一个记录

时间:2016-02-25 15:37:35

标签: neo4j cypher graph-databases

我有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)) 

而且它正在工作,但是......我认为这是非常低效的,因为我选择了所有节点,而不是我选择的第一个节点。

有更好的解决方案吗?

1 个答案:

答案 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;

我认为timeparameter