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
Другие вопросы по тегам