Генерация непересекающихся звездообразных подграфов на основе равенств - PullRequest
0 голосов
/ 09 октября 2018

Рассмотрим этот игрушечный пример:

MERGE (:Obj {desc:'A',id:1})
MERGE (:Obj {desc:'A',id:2})
MERGE (:Obj {desc:'A',id:3})
MERGE (:Obj {desc:'A',id:4})
MERGE (:Obj {desc:'B',id:5})
MERGE (:Obj {desc:'B',id:6})

У меня 6 разных узлов, но для описания есть только два разных значения (то есть только два класса узлов).Предположим, я хочу создать отношение SAME_AS, через которое все узлы, имеющие одинаковое описание, будут подключены .То есть я должен быть в состоянии получить доступ от узла x ко всем другим узлам, имеющим такое же описание, пересекающим отношения SAME_AS.

Для подключенных подкомпонентов я бы предпочел звездообразные графы, где для каждой категории узел с наименьшим id выступает в качестве прототипа, которому все остальные эквиваленты узлы ссылаются на.(Другой возможностью, не такой хорошей, были бы гамильтоновы пути)

До сих пор я придумал только это

MATCH (o1:Obj), (o2:Obj)
WHERE o1.desc=o2.desc AND o1.id<o2.id
MERGE (o1)<-[:SAME_AS]-(o2) 

Но он создает клику для каждого класса.

Лучше решения требуется с использованием MATCH в выражении FOREACH, что недопустимо в neo4j.

Я даже не понимаю, является ли cypherназначенный для этого, или я должен выполнить эти вычисления за пределами neo4j и только потом записывать информацию в БД.

Спасибо

1 Ответ

0 голосов
/ 09 октября 2018

Как на счет этого

// match the objects
MATCH (o1:Obj)
WITH o1.desc AS desc, o1

// put them in ascending order so we can find the smallest
ORDER BY desc,o1.id

// collect them per description
WITH desc, collect(o1) AS objs

// connect 1..n to node 0
UNWIND RANGE(1,size(objs)-1) AS idx
WITH objs[0] AS origin, objs[idx] AS dupe
MERGE (origin)<-[:SAME_AS]-(dupe)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...