Neo4J, как агрегировать и считать одинаковые результаты запроса? - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь выполнить анализ текста в Neo4j и хочу написать запрос, в котором сортируется количество результатов в порядке убывания. Мои данные структурированы:

(Word)->[next]->(Word)->[Next] и т. Д.

Я хочу написать запрос, в котором говорится, какие из трех словосочетаний являются наиболее популярными, 4 словосочетания и т. Д. Я пробовал это, но он всегда подсчитывает единицу для словосочетаний:

MATCH p = (w1:Word)-[r:NEXT]->(w2:Word)-[r2:NEXT]->(w3:Word)
WITH [w1.name,w2.name,w3.name] AS word_pair 
RETURN COUNT(word_pair) as frequency, word_pair
ORDER BY frequency DESC
LIMIT 50

1 Ответ

0 голосов
/ 09 сентября 2018

Частота паттерна всегда одна, потому что вы упаковываете информацию о ней в свойство count отношения. Следовательно, вам не нужно подсчитывать количество вхождений шаблона, но найти минимум этого свойства:

Пример данных:

UNWIND ["My cat eats fish on Saturday",
        "My Cat eats cat food on Saturdays"] AS text
WITH split(tolower(text)," ") AS words 
UNWIND range(0,size(words)-2) AS i 
  MERGE (w1:Word {name: words[i]}) 
    ON CREATE SET w1.count = 1 
    ON MATCH SET w1.count=w1.count+1 
  MERGE (w2:Word {name: words[i+1]}) 
    ON CREATE SET w2.count = 1 
    ON MATCH SET w2.count=w2.count+1 
  MERGE (w1)-[r:NEXT]->(w2) 
    ON CREATE SET r.count = 1 
    ON MATCH SET r.count=r.count+1;

Запрос:

MATCH p = (:Word)-[:NEXT*2]->(:Word)
WITH extract(n IN nodes(p) | n.name) AS word_pair, 
     extract(r IN relationships(p) | r.count) AS counts
UNWIND counts AS count
RETURN word_pair, 
       min(count) AS frequency
ORDER BY frequency DESC
LIMIT 50;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...