Cypher: запрос на выбор двух узлов, соединенных двумя экземплярами одного и того же отношения с разными атрибутами?

У меня есть некоторый узел n8, соединенный с другим узлом n9 двумя экземплярами одного и того же отношения. Эти экземпляры отличаются только атрибутом отношения tag. Первый экземпляр отношения имеет tag = foo, а второй экземпляр имеет tag = bar (см. код ниже).

Какой запрос выберет эти два узла из всех остальных узлов и отношений? Другими словами: как запросить два узла, соединенных двумя экземплярами одного и того же отношения с разными атрибутами?

create (n8 { id:'n8' })
create (n9 {id:'n9' })

MATCH (x),(y)
WHERE x.id = 'n8' AND y.id = 'n9'
CREATE (x)-[r:rl {tag:'foo'}]->(y)
RETURN r

MATCH (x),(y)
WHERE x.id = 'n8' AND y.id = 'n9'
CREATE (x)-[r:rl {tag:'bar'}]->(y)
RETURN r

person DarqMoth    schedule 19.05.2014    source источник


Ответы (1)


Это должно сработать. Используйте два предложения MATCH в сочетании с предложением WHERE, которое позволяет tag отношения быть любым значением в списке возможностей:

MATCH (n8)-[firstRel:r1]->(n9),
      n8-[secondRel:r1]->n9
WHERE firstRel.tag in ['foo', 'bar'] AND
      secondRel.tag in ['foo', 'bar'] AND
      firstRel <> secondRel AND
      firstRel.tag <> secondRel.tag
return firstRel, secondRel
person FrobberOfBits    schedule 19.05.2014
comment
Спасибо, но как я описал выше у меня firstRel == secondRel. Кроме того, как будет выглядеть этот запрос для любых двух произвольных узлов, если вы не знаете их имен и атрибутов? - person DarqMoth; 20.05.2014
comment
Если firstRel.tag=foo и secondRel.tag=bar, то firstRel==secondRel не может быть истинным. Этот запрос связывается с ЛЮБЫМ узлом с атрибутом id='n8' и id='n9'. Таким образом, он не будет искать любые два произвольных узла, а только те, у которых есть такие идентификаторы, как вы указали. - person FrobberOfBits; 20.05.2014
comment
У меня есть только одно отношение типа rel с атрибутом tag, который может принимать разные значения. Итак, мне нужно найти узлы, для которых выполняется следующее: `rel.tag = 'foo' AND rel.tag = 'bar' ---узлы, которые имеют два экземпляра одного и того же отношения. Мне нужно, чтобы этот запрос работал для любых произвольных узлов без априорного знания атрибутов узлов. - person DarqMoth; 20.05.2014
comment
Я обновил свой ответ. Теперь он работает для любых двух узлов (а не только с определенными идентификаторами) и требует, чтобы теги были разными. Так как есть два совпадения, и оба должны иметь tag=foo или bar, и их теги должны быть разными, это гарантирует два разных отношения, одно помечено как foo, а другое bar. - person FrobberOfBits; 20.05.2014