Cypher:返回集合中节点之间的所有关系

时间:2018-08-12 21:50:25

标签: neo4j cypher

我只是想让Cypher输出集合中节点之间或匹配节点之间的所有关系。

我已经阅读了关于SO的几种解决方案,但是没有一个对我有用。

MATCH (p:Paper {paper_id: '29912657'})
CALL algo.pageRank.stream(null, null, {direction: "BOTH", 
sourceNodes: [p]})
YIELD nodeId, score
WITH p, nodeId, score ORDER BY score DESC
LIMIT 25

MATCH (n)
WHERE id(n) = nodeId
WITH n, score, collect(n) AS c
MATCH (n)-[r:Cites]->(m)
WHERE m in c
RETURN r

在第一段代码中,我在具有特定“ paper_id”属性的节点上运行个性化页面排名。然后,我按分数对结果进行排序,并获得前25个结果。

我尝试了第二个代码块的许多变体,但均未成功。我正在尝试MATCH cRETURN集合中的节点之间存在的所有关系。当我运行它时,我得到一个空的响应。我怀疑MATCH (n)-[r:Cites]->(m)行有问题,因为如果我尝试RETURN其他变量,例如n,我仍然会得到一个空的响应。删除该行并RETURN添加n将产生除查询节点p之外的前24个得分节点。

如果我尝试使用OPTIONAL MATCH而不是MATCH,则会得到25个null值的列表。

我正在使用Neo4j 3.4.5版。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您有正确的主意,请先进行收集,然后将其与集合中的节点进行匹配,但是您会遇到聚合问题。

进行聚合时,非聚合变量将成为分组关键字,即聚合的上下文。

查看此行:

WITH n, score, collect(n) AS c

问的是,每个nscore都给我那个n的集合。每个n将有一行,并且每个集合将是该n的单个集合。

为了拥有完整的节点集合,但每行保持单个节点,您需要先收集节点,然后退回到行(我们可以在此处省略分数,因为您不会在第二行中使用它)查询的一部分。

... // since you already have the nodes you want no need to re-match to them
WITH collect(p) as nodes
UNWIND nodes as p  // let's just keep the variable consistent here
// we now have each `p` and the full collection of nodes
MATCH (p)-[r:Cites]->(m)
WHERE m in nodes
RETURN r