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

时间:2018-08-24 17:48:45

标签: neo4j cypher

我有一个特定的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个唯一节点?

1 个答案:

答案 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