#graph #neo4j #cypher
#График #neo4j #cypher
Вопрос:
Я новичок в 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
метода, чтобы выполнить это.
Ответ №1:
Вы были близки к этому. Это должно сработать для вас:
MATCH (c:C)<--(:A)-->(le:LE)-->(:R)-->(f:F),
(le)-->(lo:LO)
WITH f, lo, COLLECT(DISTINCT c) AS cs
RETURN f, lo, cs, SIZE(cs) as _counts
ORDER BY _counts LIMIT 5
Обратите внимание, также, что более эффективно включать направленность отношений в запрос.
Комментарии:
1. Спасибо за совет! Но теперь у меня все _counts = 1. Я думаю, что я пробовал это раньше и столкнулся с той же проблемой.