Neo4j Cypher запрос: скобки не рассматриваются в предложении WHERE? - PullRequest
2 голосов
/ 11 января 2020

Я пытаюсь выполнить запрос, подобный следующему:

MATCH (n:Type1)-[:relation1]->(:Type1)<-[:relation2]-(:Type2) WHERE
((n.prop1="A" and n.prop2 in [42, 34]) OR
 (n.prop1="B" and n.prop2 in [67])     OR
 (n.prop1="C" and n.prop2 in [51, 43]) OR
 (n.prop1="D" and n.prop2 in [56, 42])) 
RETURN DISTINCT id(n) as node_id, n.prop3 as node_prop3, n.prop1 as prop1, n.prop2 as prop2;

Это дает смешанные результаты ie prop1="D", сопоставленные с prop2=51, что явно не соответствует предполагаемому условию. Это как если бы скобки не имели права голоса при образовании условного. Результаты совпадают, когда я запускаю запрос без скобок в предложении WHERE.

Хотя, если я запрашиваю что-то вроде:

MATCH (n:Type1)-[:relation1]->(:Type1)<-[:relation2]-(:Type2) WHERE
((n.prop1="A" and n.prop2=42) OR
 (n.prop1="A" and n.prop2=34) OR
 (n.prop1="B" and n.prop2=67) OR
 (n.prop1="C" and n.prop2=51) OR
 (n.prop1="C" and n.prop2=43) OR
 (n.prop1="D" and n.prop2=56) OR
 (n.prop1="D" and n.prop2=42)) 
RETURN DISTINCT id(n) as node_id, n.prop3 as node_prop3, n.prop1 as prop1, n.prop2 as prop2;

Есть ли что-то, что я пропускаю, когда замена отдельных условий в примере 2 на IN в примере 1, чтобы избежать повторных сравнений строк для prop1?

1 Ответ

2 голосов
/ 12 января 2020

Я полагаю, что IN работает так, как вы ожидаете.

Настройте образцы данных.

(:Type1 {prop1:"A", prop2:34}),
(:Type1 {prop1:"B", prop2:67}),
(:Type1 {prop1:"C", prop2:51}),
(:Type1 {prop1:"C", prop2:43}),
(:Type1 {prop1:"D", prop2:56}),
(:Type1 {prop1:"D", prop2:42}),
(:Type1 {prop1:"D", prop2:51}),
(:Type1 {prop1:"B", prop2:42});

MATCH (t:Type1)
MERGE (t)-[:relation1]->(:Type1)<-[:relation2]-(:Type2);

Теперь запустите ваш запрос.

MATCH (n:Type1)-[:relation1]->(:Type1)<-[:relation2]-(:Type2) WHERE
((n.prop1="A" and n.prop2 in [42, 34]) OR
 (n.prop1="B" and n.prop2 in [67])     OR
 (n.prop1="C" and n.prop2 in [51, 43]) OR
 (n.prop1="D" and n.prop2 in [56, 42])) 
RETURN DISTINCT id(n) as node_id, n.prop3 as node_prop3, n.prop1 as prop1, n.prop2 as prop2;

Оператор возвращает семь записей, и результаты не включают узел с prop1 = D и prop2 = 51.

См. этот ответ для получения информации о приоритете булевых операторов, если вы оставите скобки.

...