Neo4j Как вернуть верхние узлы для каждого значения свойства - PullRequest
0 голосов
/ 07 ноября 2018

Я запускаю PageRank для группы узлов типа Paper, где у каждого узла есть свойство year. В настоящее время я нормализую каждую оценку PageRank по годам, используя среднее и стандартное отклонение оценок PageRank для всех статей в этом году.

Я хотел бы вернуть 100 лучших работ (на основе масштабированных значений PageRank) за каждый год. Могу ли я сделать это одним запросом?

В приведенном ниже запросе рассчитываются масштабированные баллы и возвращаются первые 100 результатов в целом, а не первые 100 в год:

CALL algo.pageRank.stream(
  'MATCH (p:Paper) WHERE p.year < 2015 RETURN id(p) as id',
  'MATCH (p1:Paper)-[:CITES]->(p2:Paper) RETURN id(p1) as source, id(p2) as target',
  {graph:'cypher', iterations:20, write:false, concurrency:20})
YIELD node, score
WITH 
  node.title AS title,
  node.year AS year, 
  score AS page_rank
ORDER BY page_rank DESC
LIMIT 100
WITH year, COLLECT({title: title, page_rank: page_rank}) AS data, AVG(page_rank) AS avg_page_rank, stDev(page_rank) as stdDev
UNWIND data AS d
RETURN year, d.title AS title, ABS(d.page_rank-avg_page_rank)/stdDev AS scaled_score;

Любые предложения будут с благодарностью!

1 Ответ

0 голосов
/ 07 ноября 2018

Попробуйте это:

CALL algo.pageRank.stream(
  'MATCH (p:Paper) WHERE p.year < 2015 RETURN id(p) as id',
  'MATCH (p1:Paper)-[:CITES]->(p2:Paper) RETURN id(p1) as source, id(p2) as target',
  {graph:'cypher', iterations:20, write:false, concurrency:20})
YIELD node, score
WITH 
  node.title AS title,
  node.year AS year, 
  score AS page_rank
ORDER BY page_rank DESC
WITH year, COLLECT({title: title, page_rank: page_rank})[..100] AS data, AVG(page_rank) AS avg_page_rank, stDev(page_rank) as stdDev
UNWIND data AS d
RETURN year, d.title AS title, ABS(d.page_rank-avg_page_rank)/stdDev AS scaled_score;

Этот запрос удаляет предложение LIMIT и вместо этого сохраняет топ-100 (отсортированных) data элементов в год.

...