Neo4j 2.1+ - Cypher - Возвращает количество раз, когда связь появляется при использовании DISTINCT
Я борюсь с, может быть, простым запросом, но я не могу найти ответ:
Давайте приведем следующую простую схему:
Узлы:
Package1
Library1
Library2
Library3
Отношения:
(Library1)-[:USES {in_version:'1.1'}]->(Package1)
(Library2)-[:USES {in_version:'1.2'}]->(Package1)
(Library3)-[:USES {in_version:'1.2'}]->(Package1)
Просто нет?
Итак, я хотел бы вернуть узел пакета и групповые отношения по отдельному свойству in_version и количеству использований in_version.
Это должно быть возвращение, которое я хотел бы получить:
package | in_version | usage |
Package 1 | 1.1 | 1 |
Package 1 | 1.2 | 2 |
Я пытался объединить разные, собирать, но сейчас я борюсь
редактировать
Мой последний запрос выглядит следующим образом:
MATCH (p:Package)<-[r:USES]-()
WHERE p.name = 'Package1'
WITH p, collect(r) as v
UNWIND v as x
RETURN distinct x.in_version, count(x) as usage
ORDER BY usage DESC
И я могу получить версии и использование правильно. Но если я хочу добавить имя пакета к возврату, шифр пожалуется на "." в x.in_version
MATCH (p:Package)<-[r:USES]-()
WHERE p.name = 'Package1'
WITH p, collect(r) as v
UNWIND v as x
RETURN p.name, distinct x.in_version, count(x) as usage
ORDER BY usage DESC
Хотя p.name не является необходимым для этого запроса, поскольку я знаю его заранее, цель состоит в том, чтобы 1-й отфильтровать пакеты, имеющие наиболее часто используемые отношения, а затем вернуть этот запрос по пакетам за один раз.
заранее спасибо
Крис
1 ответ
Попробуйте этот запрос
match (lib)-[r:USES]->(pack)
where has(r.in_version)
with pack, collect(r.in_version) as vers,lib
with pack,vers ,collect(lib) as libs,count(lib) as usage
return pack as package,vers as in_version,usage