Определение различных кластеров с Neo4j - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть запрос на шифрование, который возвращает серию путей, которые частично перекрываются и приводят к образованию нескольких отдельных кластеров.В этом случае будет небольшое количество кластеров (100–1000) относительно небольшого размера (1–50 узлов).Полный набор данных обычно состоит из нескольких миллионов узлов (запрос извлекает относительно небольшое подмножество всех узлов).

Упрощенная версия запроса выглядит следующим образом:

MATCH p=(a:M)-[:F2EDGE]-(b:M) WHERE a.prop > 90 AND b.prop > 90 RETURN p

Фактический запрос будет немного сложнее, чем запрос с переменным числом промежуточных узлов, но это должно служить примером проблемы..

Теперь я хочу изучить различные кластеры, сгенерированные этим запросом.Я нашел документы по алгоритму Connected Components , который отображается в правильных строках, но я не понимаю, как это можно применить к списку путей, который является результатом запроса.Я хотел бы иметь возможность:

  1. получить список кластеров и некоторые основные свойства для этого (например, количество узлов)
  2. получить данные, которые позволили мне воспроизводимо получить этот кластерснова в будущем (возможно, извлекая идентификаторы узлов или добавляя новые «кластерные» узлы, которые связаны с каждым кластером)

Может кто-нибудь подсказать, как этого добиться?

1 Ответ

0 голосов
/ 01 декабря 2018

Вы можете использовать зашифрованные проекции с этим

что-то вроде этого:

CALL algo.unionFind('
MATCH (a:M) WHERE a.prop > 90 RETURN id(a) as id
UNION
MATCH (b:M) AND b.prop > 90 RETURN id(b) as id
', '
MATCH p=(a:M)-[:F2EDGE]->(b:M) WHERE a.prop > 90 AND b.prop > 90 RETURN id(a) as source, id(b) as target
', {graph:"cypher",write:true, partitionProperty:"partition"})

Обратите внимание, что в этом случае один из запросов узла был быдостаточно того, что у них обоих одинаковые критерии, я просто хотел продемонстрировать, как объединять запросы на исходном и целевом узлах.

Если вы хотите ограничить узлы только теми в вашем связанном графе, вы также можете использовать это как "запрос узла":

MATCH (a:M)-[:F2EDGE]-(b:M) 
WHERE a.prop > 90 AND b.prop > 90 
UNWIND [id(a), id(b)] as id
RETURN distinct id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...