2016-06-21 3 views
0

У меня есть то, что кажется довольно простым вопросом Сайфера.Cypher: исключить общие узлы?

У меня есть следующие данные, где у меня есть два узла A и 3 B узлы с b1, связанные с a1, b2, связанные с a2, и b3 является общим и относится как к a1, так и a2. Моя цель - написать оператор Cypher, который, учитывая конкретный узел A, вернет узлы B, которые связаны только с ним и не связаны с каким-либо другим узлом A. Например, при заданном узле a1 запрос должен возвращать b1, а когда задан узел a2, b2 должен быть возвращен. Узел b3, который относится как к a1, так и a2, никогда не должен возвращаться из этого запроса, независимо от того, какой из них указан. Говоря иначе, я пытаюсь найти узлы B, которые являются уникальными для данного узла A, поскольку результирующие узлы B не связаны ни с каким другим узлом А, кроме указанного в моем совпадении.

В этом примере данные (надеюсь) сделать мою цель более ясно:

CREATE (n:A { code: 'a1' }) 
CREATE (n:A { code: 'a2' }) 
CREATE (n:B { code: 'b1' }) 
CREATE (n:B { code: 'b2' }) 
CREATE (n:B { code: 'b3' }) 

match (a:A), (b:B) where a.code = 'a1' and b.code = 'b1' create (a)<-[r:A_AND_B]-(b) return a, r, b 
match (a:A), (b:B) where a.code = 'a2' and b.code = 'b2' create (a)<-[r:A_AND_B]-(b) return a, r, b 
match (a:A), (b:B) where a.code = 'a1' and b.code = 'b3' create (a)<-[r:A_AND_B]-(b) return a, r, b 
match (a:A), (b:B) where a.code = 'a2' and b.code = 'b3' create (a)<-[r:A_AND_B]-(b) return a, r, b 

Если бы я был готов включить общий узел b3, запрос будет прямо вперед и быть:

матча (a: A) - [r: A_AND_B] - (b: B), где a.code = 'a1' return b

Это возвращает b1 и b2. Однако, учитывая, что я хочу включить любые B-узлы, которые относятся к другому узлу A (b2 в этом случае не нужно возвращать), я изо всех сил стараюсь найти правильный подход и синтаксис.

Я исследовал изученные СИФ Cypher и ДОПОЛНИТЕЛЬНЫЕ МАТЧЫ, пока не повезло. Я также могу выполнить то, что хочу, если я использую два отдельных запроса, которые немного обманывают и уклоняются от возможности обучения.

Может ли кто-нибудь обеспечить повышение?

ответ

1

Как о чем-то вроде этого:

match (a:A)-[:A_AND_B]-(b:B) 
where a.code = 'a1' 
match (b)-[r:A_AND_B]-(:A) 
with b, count(r) as c 
where c = 1 
return b 
+0

Это было именно импульс мне нужен; Спасибо за вашу помощь. –

Смежные вопросы