Есть ли способ отфильтровать наиболее частые термины в запросе Neo4J APOC? - PullRequest
0 голосов
/ 13 января 2019

У меня есть следующий запрос:

CALL apoc.index.relationships('TO','context:34b4a5b0-0dfa-11e9-98ed-7761a512a9c0') 
 YIELD rel, start, end WITH DISTINCT rel, start, end 
 RETURN DISTINCT start.uid AS source_id, 
 start.name AS source_name, 
 end.uid AS target_id, 
 end.name AS target_name, 
 rel.uid AS edge_id, 
 rel.context AS context_id, 
 rel.statement AS statement_id, 
  rel.weight AS weight

, который возвращает таблицу результатов, таких как enter image description here

Вопрос: Есть ли способ отфильтровать верхние 150 наиболее подключенных узлов (source_name/source_id и target_name/edge_id узлов)?

Не думаю, что это сработает с frequency, так как каждая строка таблицы уникальна (из-за различий edge_id), но, возможно, внутри Neo4J / Cypher есть функция, которая позволяет мне подсчитывать самые частые (source_name/source_id и target_name/edge_id) узлов?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Этот запрос может делать то, что вы хотите:

CALL apoc.index.relationships('TO','context:34b4a5b0-0dfa-11e9-98ed-7761a512a9c0') 
YIELD rel, start, end
WITH start, end, COLLECT(rel) AS rs
ORDER BY SIZE(rs) DESC LIMIT 50
RETURN
  start.uid AS source_id, 
  start.name AS source_name, 
  end.uid AS target_id, 
  end.name AS target_name,
  [r IN rs | {edge_id: r.uid, context_id: r.context, statement_id: r.statement, weight: r.weight}] AS rels

Запрос использует агрегирующую функцию COLLECT, чтобы собрать все отношения для каждой пары start/end узлов, сохранить данные для 50 пар узлов с наибольшим количеством связей и вернуть строку данные для каждой пары (с данными для отношений в списке rels).

0 голосов
/ 14 января 2019

Вы всегда можете использовать size( (node)-[:REL]->() ) для получения степени.

И если вы сначала вычислите высшую ступень, вы можете отфильтровать ее, сравнив

WHERE min < size( (node)-[:REL]->() ) < max

...