Как сгруппировать совпадающие результаты в Neo4J / Cypher

#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. Я думаю, что я пробовал это раньше и столкнулся с той же проблемой.