Cypher: персонализированный PageRank с несколькими исходными узлами, возвращающими дубликаты - PullRequest
0 голосов
/ 24 августа 2018

У меня есть конкретный запрос 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 уникальных узлов.

Как мне обеспечить I RETURN n уникальных узлов?

1 Ответ

0 голосов
/ 02 октября 2018

Как говорит @Tezra, вам нужно определить, как вы хотите разрешить несколько score s для одного и того же 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
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...