Рассмотрим этот игрушечный пример:
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
и только потом записывать информацию в БД.
Спасибо