Cypher:返回集合中所有节点的节点关系和属性

时间:2018-08-19 13:15:55

标签: neo4j cypher

目前,我正在一组节点上运行个性化PageRank。我要获取顶部的n节点和RETURN这些节点之间的所有关系 ,以得出每个节点的PageRank得分以及每个节点的一组属性。< / p>

目前,我正在设法RETURN关系的开始和结束节点,但是我无法弄清楚如何也RETURN得分和任何其他节点属性。

我的查询如下:

 MATCH (p) WHERE p.paper_id = $paper_id
 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 collect(n) as nodes
 UNWIND nodes as n
 MATCH (n)-[r:Cites]->(p) WHERE p in nodes
 RETURN startNode(r).paper_id as start, collect(endNode(r).paper_id) as end

在第二个代码块I collect中,匹配的节点n是为了随后查找该集合中节点之间的所有关系。但是,在score行中包含WITH collect(n) as nodes会导致score用作索引器,当我想以某种方式单独传递它时(允许吗?)。

输出格式并不重要,因为我可以在服务器端正确格式化它。

1 个答案:

答案 0 :(得分:1)

APOC在这里可以提供帮助,您可以使用apoc.algo.cover()获取一组节点之间的所有关系。

关于获得分数,最好从收集的节点中提取一个map projection,其中包括分数:

MATCH (p) WHERE p.paper_id = $paper_id
 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 collect(nodeId) as ids, collect(n {.*, score}) as nodes
 CALL apoc.algo.cover(ids) YIELD rel
 RETURN nodes, collect(rel) as rels