Я очень новичок в Neo4J и Cypher, и мне нужно работать над набором данных с высокой степенью реляции. Модель графа выглядит так
Где в моих данных у меня есть несколько экземпляров C, A, Le и только несколько экземпляров Lo, R, F.
Я ищу способ получить следующее: Для каждой уникальной пары Lo-F получите все C и посчитайте, сколько уникальных C для каждой такой пары.
Другими словами, я хочу, чтобы все группы C
имели одинаковые LO
и F
, и мне нужны мои результаты, чтобы сказать мне:
- Сколько уникальных
C
- Общий LO
- Общий F
Мой скромный старт состоял в MATCH
шаблоне, подобном этому (направления стрелок в основном не имеют значения для этой проблемы):
MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
(le)--(lo:LO)
RETURN f, lo, c LIMIT 5
, который возвращает все совпавшие шаблоны. Затем я попытался использовать collect
и count
. Например,
MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
(le)--(lo:LO)
RETURN f, lo, collect(c), COUNT(*) as _counts
ORDER BY _counts LIMIT 5
, который, кажется, дает мне таблицу с уникальными парами f-lo и списком C
плюс число. Однако в столбце collect(c)
повторено C
, и поэтому _counts
неверны. Затем я попытался ввести DISTINCT
:
MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
(le)--(lo:LO)
RETURN f, lo, collect(DISTINCT c), COUNT(*) as _counts
ORDER BY _counts LIMIT 5
Но у меня такие же результаты ...
Я много гуглил, но, поскольку я также довольно новичок в SQL, я нахожу большинство учебников и примеров трудными для подражания в их SQL-аналогии.
Кроме того, будет ли это лучше сформулировано как алгоритм кластеризации? Я установил плагин algo
, но изо всех сил пытался понять, как подготовить совпадение для метода .stream
, чтобы добиться этого.