Как сгруппировать совпадающие результаты в Neo4J / Cypher - PullRequest
2 голосов
/ 22 марта 2019

Я очень новичок в Neo4J и Cypher, и мне нужно работать над набором данных с высокой степенью реляции. Модель графа выглядит так

enter image description here

Где в моих данных у меня есть несколько экземпляров 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 Ответ

0 голосов
/ 22 марта 2019

Вы были близки. Это должно работать для вас:

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

Также обратите внимание, что более эффективно включить направленность отношений в запрос.

...