Cypher: несколько путей и условий в свойствах узла пути, соединенных OR - PullRequest
0 голосов
/ 29 января 2019

Нужна помощь с шифром, как показано ниже,

MATCH (user)
WHERE (ID(user) = 999)
MATCH (user)<-[rel1:`post`]-(p:`Post`)
WHERE ((p)-[r:`review`]->(w:Review) AND r.score IN [4,5] AND w.category='FB') OR
((p)-[r:`review`]->(w:Review) AND r.score IN [6,8] AND w.category='INSTA')
RETURN DISTINCT(p)

Это дает undefined variable r ошибку.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Подход Раджа является правильным, если здесь присутствует только один тип отношений.

Однако вы сказали, что «отношение после ИЛИ может быть другим», поэтому вы ищете либо один тип отношения, соответствующий определенному предикату, либодругой тип с другим предикатом.

Вы можете использовать здесь понимание шаблона , чтобы собрать здесь фрагменты шаблона, и это позволит вам ввести новые переменные в область действия понимания.

MATCH (user)
WHERE ID(user) = 999
MATCH (user)<-[:`post`]-(p:`Post`)
WITH user, p, [(p)-[r:`review`]->(w:Review) WHERE r.score IN [4,5] AND w.category='FB' | w] as midFB_Review, [(p)-[r:`review`]->(w:Review) WHERE r.score IN [6,8] AND w.category='INSTA' | w] as highINSTA_Review
WITH user, p
WHERE size(midFB_Review) + size(highINSTA_Review) > 0
RETURN p

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

0 голосов
/ 29 января 2019

Новые переменные (здесь и r) не допускаются в предложении WHERE .

Вы можете проверять переменные, только если они присутствуют до WHERE.

Вы можете получить те же результаты, переместив проверку взаимосвязи с ГДЕ на МАТЧ Предложение типа:

MATCH (user) WHERE (ID(user) = 999) 
MATCH (user)<-[rel1:`post`]-(p:`Post`)-[r:`review`]->(w:Review) 
WHERE (r.score IN [4,5] AND w.category='FB') OR (r.score IN [6,8] AND w.category='INSTA') 
RETURN DISTINCT(p)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...