Neo4j Cypher:多个源节点返回重复项的个性化PageRank

Neo4j Cypher:多个源节点返回重复项的个性化PageRank,neo4j,cypher,Neo4j,Cypher,我有一个特定的Cypher查询,它在一组源节点上运行个性化的PageRank。我想返回最上面的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,

我有一个特定的Cypher查询,它在一组源节点上运行个性化的PageRank。我想
返回
最上面的
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时,不存在重复项

这是一个问题,因为我想
返回
n
唯一节点(在上面的代码块
n
=25中)。在两个源节点的典型运行中,我得到了大约21-22个唯一节点


如何确保返回唯一节点?

正如@Tezra所说,您需要确定如何为相同的
p
解析多个
分数

以下选项均涉及对本条款进行简单更改:

    WITH p, nodeId, score
选项:

  • 使用最大
    分数

    WITH p, nodeId, MAX(score) AS score
    
    WITH p, nodeId, MIN(score) AS score
    
    WITH p, nodeId, AVG(score) AS score
    
  • 使用最低
    分数

    WITH p, nodeId, MAX(score) AS score
    
    WITH p, nodeId, MIN(score) AS score
    
    WITH p, nodeId, AVG(score) AS score
    
  • 使用平均
    分数

    WITH p, nodeId, MAX(score) AS score
    
    WITH p, nodeId, MIN(score) AS score
    
    WITH p, nodeId, AVG(score) AS score
    

那么您希望如何解析不同的页面排名?你能把
MAX(score)
作为最后的pageRank吗?
返回DISTINCT
将删除重复行,但如果重复行中存在不同的值,则需要添加逻辑来解决这些差异,以获得最终的DISTINCT行。