Neo4j / Cypher Match, только если предикат применяется для всех отношений - PullRequest
0 голосов
/ 07 июня 2019

Мне нужно сопоставлять узлы только тогда, когда каждое отношение, которое имеет узел, заполняет предложение where:

MATCH (o:Otherthing)
WHERE id(o) = 1
MATCH (unknown:Thing)
WHERE (unknown)-[:DEPENDS_ON]->(:Thing)<-[:DEPENDS_ON*]-(:Thing)<-[:STARTED_WITH]-(o) 
RETURN unknown

Каждое сопоставленное «Thing» должно иметь только отношения, помеченные как «DEPENDS_ON», и все они должны полностью удовлетворять условию.

Как мне этого добиться?

1 Ответ

0 голосов
/ 07 июня 2019

Это может сработать для вас:

MATCH (u:Thing)-[:DEPENDS_ON]->(:Thing)<-[:DEPENDS_ON*]-(:Thing)<-[:STARTED_WITH]-(o)
WHERE ID(o) = 1
WITH u, COUNT(*) AS num
WHERE SIZE((u)--()) = num
RETURN u

Запрос использует эффективную проверку степени защиты, чтобы получить общее количество отношений для u, и сравнивает это с количеством раз, когда u удовлетворилMATCH.Кроме того, поскольку вы идентифицируете o по его собственному идентификатору (который, как я предполагаю, всегда будет идентификатором для Otherthing), более эффективно не указывать его метку (чтобы избежать операции проверки метки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...