我只是想让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
c
和RETURN
集合中的节点之间存在的所有关系。当我运行它时,我得到一个空的响应。我怀疑MATCH (n)-[r:Cites]->(m)
行有问题,因为如果我尝试RETURN
其他变量,例如n
,我仍然会得到一个空的响应。删除该行并RETURN
添加n
将产生除查询节点p
之外的前24个得分节点。
如果我尝试使用OPTIONAL MATCH
而不是MATCH
,则会得到25个null
值的列表。
我正在使用Neo4j 3.4.5版。
感谢您的帮助!
答案 0 :(得分:1)
您有正确的主意,请先进行收集,然后将其与集合中的节点进行匹配,但是您会遇到聚合问题。
进行聚合时,非聚合变量将成为分组关键字,即聚合的上下文。
查看此行:
WITH n, score, collect(n) AS c
问的是,每个n
和score
都给我那个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