2013-10-05 4 views
0

Как вы or условий, а не and? Пример ниже:Конъюнкции в разделе MATCH?

START user = node({id}) 
MATCH 
(user)-[:follows]->(followed), 
(follower)-[:follows]->(user) 
RETURN user, followed, follower 

Что я хочу получить обратно есть: user, независимо от того, следует ли кто-нибудь ее или она следует ли кто-нибудь. Все followers, если есть. Все followed если есть.

Запрос выше действует так, как если бы он был and. Если если user не следует никому, или никто не следует за пользователем, ничего не возвращается.


Вот что-то еще я пробовал, но я получаю ошибку синтаксиса на нем:

start a = node(40663) 
with a, a as b 
match (b)-[:follows]->(c) 
with b, a as d 
(e)-[:follows]->(d) 
return a, c, e; 

Ошибка:

SyntaxException: string matching regex `$' expected but `(' found 

Think we should have better error message here? Help us by sending this query to [email protected] 

Thank you, the Neo4j Team. 

"start a = node(40663) with a, a as b match (b)-[:follows]->(c) with b, a as d (e)-[:follows]->(d) return a, c, e" 
                      ^

Независимо от этой ошибки, уменьшенная query (только с одним with) возвращает нулевые результаты, так что, похоже, это не так.

ответ

0

ОК, я мог бы решить эту одну, используя что-то вроде этого:

start a = node(40663) 
match (a)-[?:follows]->(b), (c)-[?:follows]->(a) 
return a, b, c; 

Но если есть лучший способ, не стесняйтесь сказать!

0

матч (с) < - [?: следует] - (а) - [?: следует] -> (б) должны также работать

EDIT: Альтернативно

START user = node({id}) 
MATCH user--m 
WHERE user-[:follows]->m 
OR user<-[:followed]-m 
RETURN user ,m 
+0

Второй вариант не эквивалентен: мне нужны те, кто следит за «пользователем» и теми, кого «пользователь» следует в отдельных сумках. Труднее понять проблему, которая применима и к вашему первому варианту, и к моему варианту. Если «пользователь» следует за собой, то она будет перечисляться дважды в каждом списке (что неверно по всем счетам, она следует за собой только один раз и один раз). Поэтому мне пришлось заменить 'a, collection (distinct b), collection (distinct c)' в предложении return. Но я все еще не могу сказать, является ли это ошибкой, или есть какая-то логика. –

1

Может вы делаете:

START user = node({id}) 
MATCH 
p1 = (user)-[:follows]->(followed), 
p2 = (follower)-[:follows]->(user) 
RETURN user, followed, follower 

альтернативно:

START user = node({id}) 
MATCH (user)-[:follows]->(f) 
WITH user, collect(f) as followed 
MATCH (f)-[:follows]->(user) 
RETURN user, followed, collect(f) as follower 
+0

Первый действительно странный. Вы можете немного объяснить? Зачем мне нужны эти блуждающие переменные (они даже переменные?), Я имею в виду 'p1' и' p2'. Это еще не совсем объясняет семантику запятой. Он действует как 'и', строгий 'и 'или делает это короткое замыкание? Re 'второй запрос: он возвращает правильное количество последовательных/последователей, без дубликатов. Не могли бы вы объяснить, почему в моем исходном запросе были дубликаты? –

+0

@wvxvw В принципе, существует совпадение для каждой уникальной комбинации пользователя, следующего и последующего. Однако, поскольку он использует COLLECT (f), узлы последующих и последовательных элементов группируются в отдельные массивы. Таким образом, уникальная комбинация агрегируется, поэтому у вас есть только один пользователь в строке. – LameCoder

+0

@ LameCoder извините, вы полностью меня потеряли. На какой вопрос вы пытались ответить? –

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