Neo4j Cypher:返回集合中节点之间的所有关系
我只是想让Cypher输出集合中节点之间或匹配节点之间的所有关系 我已经读过几个解决这个问题的方法,但是没有一个对我有效Neo4j Cypher:返回集合中节点之间的所有关系,neo4j,cypher,Neo4j,Cypher,我只是想让Cypher输出集合中节点之间或匹配节点之间的所有关系 我已经读过几个解决这个问题的方法,但是没有一个对我有效 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 (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名的结果
我尝试了第二个代码块的许多变体,但都没有成功。我正在尝试匹配集合c
中节点之间存在的所有关系,并返回它们。当我运行这个时,我得到一个空的响应。我怀疑匹配(n)-[r:Cites]->(m)
行有问题,因为如果我尝试返回其他变量,例如n
,我仍然会得到一个空响应。删除该行并返回ingn
将产生除查询节点p
之外的前24个评分节点
如果我尝试OPTIONAL MATCH
而不是MATCH
我会得到一个包含25个null
值的列表
我使用的是Neo4j版本3.4.5
感谢您的帮助 您的想法是正确的,收集并匹配到集合中的节点,但是您遇到了聚合问题
聚合时,非聚合变量成为分组键,即聚合的上下文
看看这一行:
带n,得分,收集(n)作为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
很好,谢谢你的帮助。我没有意识到我在聚合中犯的错误,这就清除了它。