我有一个特定的Cypher查询,该查询在一组源节点上运行个性化PageRank。我想RETURN
得分最高的n
个节点,包括其PageRank分数,其他属性以及这些节点之间的所有关系。
在SO的帮助下,我到了这一点:
MATCH (p) WHERE p.paper_id IN $paper_ids
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 ids, nodes, collect(rel) as rels
我唯一的问题是此查询返回重复的节点。例如,可以使用不同的PageRank分数多次返回一个节点。我怀疑这是由于有多个源节点,所以不同的分数对应于每个源节点的PageRank分数。对于单个源节点运行PageRank时,没有重复项。
这是一个问题,因为我想RETURN
n
唯一个节点(在上面的代码块n
= 25中)。在具有两个源节点的典型运行中,我得到约21-22个唯一节点。
如何确保RETURN
n
个唯一节点?
答案 0 :(得分:0)
正如@Tezra所说,您需要确定如何为同一个score
解决多个p
。
以下所有选项都涉及对该子句进行简单的更改:
WITH p, nodeId, score
选项:
使用最大的score
:
WITH p, nodeId, MAX(score) AS score
使用最小的score
:
WITH p, nodeId, MIN(score) AS score
使用平均值score
:
WITH p, nodeId, AVG(score) AS score