Loop in cypher, UNWIND или FOREACH (Neo4j) - PullRequest
       9

Loop in cypher, UNWIND или FOREACH (Neo4j)

0 голосов
/ 11 декабря 2018

У меня есть отношение в моей базе данных neo4j:

(r:RateableEntity)<-[t:TAG]-(h:HashTags)

Теперь я хочу получить запрос, который возвращает список, включающий:

  1. Список hashtagName и ихчастота в базе данных как hashtagCount и список элементов, связанных с этим хэштегами.hashtagName и hashtagItems имеют метку id.

Примечание: Я получаю число hashtag и hashtagItems из входного параметра в качестве переменной.

И вот результат, который я ожидал от своего запроса на шифр:

"hashtagList": [ 
{
  "hashtagName": "hashtagName1",
  "hashtagCount": number of times hashtag has been used in database,
  "hashtagItems": [ list of relevant items for hashtagName1 ]
},
{
  "hashtagName": "hashtagName2",
  "hashtagCount": number of times hashtag has been used in database,
  "hashtagItems": [ list of relevant items for hashtagName2 ]
},
...
]

Я написал этот шифр:

MATCH p = (r:RateableEntity)<-[t:TAG]-(h:HashTag)
UNWIND TAIL (NODES(p)) AS hash
WITH COUNT(hash) as Count, h, hash
ORDER BY hash LIMIT 3
WHERE h.tag in hash.tag
MATCH (r:RateableEntity)<-[:TAG]-(h:HashTag)
 RETURN DISTINCT h.tag, r.id, Count
 LIMIT 3

, но он возвращает этот результат:

h.tag       r.id                                  Count
"vanessa"   "cdd14968-404c-41e9-84d5-bf147030a023"  15
"vanessa"   "b7e74f38-44e4-4b7f-b2c4-8301023ffa9b"  15
"vanessa"   "2064d3e4-2995-4202-b178-bb2a6f230ab0"  15

Спасибо заранее за помощь.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я нашел это для своего вопроса, может быть, кто-то еще должен знать:

MATCH (:RateableEntity)<-[:TAG]-(p:HashTag)
RETURN p.tag As Tag, COUNT(p) as Count, [(p)-[:TAG]->(m) | m.id][..3] AS 
RateableEntities ORDER BY Count DESC LIMIT 3

Вот ссылка на документы на сайте:

limit-match-Результаты за строкой / * * 1 008

0 голосов
/ 11 декабря 2018

Некоторые вещи, которые следует иметь в виду:

  1. Операции шифрования выполняются для каждой строки.

  2. Старайтесь не думать о UNWIND как о циклесостав.Все это делает декартово произведение переменных в строке с элементами списка.

Таким образом, когда вы УВЕЛИЧИТЕ список, у вас будет строка для каждого элемента списка, а также все переменные, которые уже присутствовали в строке.Затем, когда происходит следующая операция (например, MATCH или WITH), которая выполняется для каждой строки, это выглядит как циклическая структура, но на самом деле это не так.

В любом случае UNWIND не требуетсяВот.Для шаблона с двумя узлами tail(nodes(p)) будет просто одноэлементным списком, содержащим только последний узел.Он не изменил количество строк (поскольку размер списка равен 1) и не поможет вам в этом.

Этот запрос должен работать лучше:

MATCH (h:HashTag)
WITH h LIMIT 3 // best to limit early to avoid doing unnecessary work
WITH h, h.tag as hashtagName, size((h)-[:TAG]->()) as hashtagCount, [(h)-[:TAG]->(r:RateableEntity) | r.id] as hashtagItems
WITH h {hashtagName, hashtagCount, hashtagItems} as entry
RETURN collect(entry) as hashtagList

РЕДАКТИРОВАТЬ

Если вы хотите получить 3 верхних хэштега по размеру, вы можете использовать модифицированный запрос ниже:

MATCH (h:HashTag)
WITH h, size((h)-[:TAG]->()) as hashtagCount
ORDER BY hashtagCount DESC
LIMIT 3
WITH h, hashtagCount, h.tag as hashtagName, [(h)-[:TAG]->(r:RateableEntity) | r.id] as hashtagItems
WITH h {hashtagName, hashtagCount, hashtagItems} as entry
RETURN collect(entry) as hashtagList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...