Запрос шифрования NOT IN с необязательным соответствием

НЕ СООТВЕТСТВУЮЩИЙ - ПЕРЕЙДИТЕ К ВАМ

У меня есть следующий запрос:

MATCH (n)
WHERE (n:person) AND n.id in ['af97ab48544b'] // id is our system identifier
OPTIONAL MATCH (n)-[r:friend|connected|owner]-(m)
WHERE (m:person OR m:dog OR m:cat)
RETURN n,r,m

Этот запрос возвращает всех людей, собак и кошек, которые имеют отношения с конкретным человеком. Я хотел бы перевернуть его, чтобы получить все узлы и отношения, которые НЕ включены в результаты этого запроса.

Если бы это был SQL, это было бы

select * from graph where id NOT IN (my_query)

Я думаю, что ФАКУЛЬТАТИВНЫЙ МАТЧ является проблемной частью. Как я могу это сделать? Любой совет?

Благодарю.

- Важно Редактировать -

Эй, ребята, извините за изменение моего вопроса, но мои требования были изменены. Мне нужно подключить и отключить весь граф (все узлы и отношения), кроме определенных узлов по идентификаторам. Следующий запрос работает, но только для одного идентификатора, в случае большего количества идентификаторов он не работает.

MATCH (n) WHERE (n:person)
OPTIONAL MATCH (n)-[r:friend|connected|owner]-(m) WHERE (m:person OR m:dog OR m:cat)
WITH n,r,m
MATCH (excludeNode) WHERE excludeNode.id IN ['af97ab48544b']
WITH n,r,m,excludeNode WHERE NOT n.id = excludeNode.id AND (NOT m.id = excludeNode.id OR m is null)
RETURN n,m,r

В качестве альтернативы я попробовал более простой запрос:

MATCH (n) WHERE (n:person) AND NOT n.id IN ['af97ab48544b'] return n

Но этот не возвращает отношения (помните, мне также нужны отключенные узлы).

Как я могу получить весь граф, исключая определенные узлы? Это включает в себя узлы и отношения, связанные узлы, а также отключенные.

2 ответа

Решение

Попробуй это:

match (n), где не n.id = "id для удаления", необязательное match (n)-[r]-(m), где не n.id в ["id to remove"] и не m.id в ['id убрать '] вернуть n,r,m

Вы должны переключить "перспективу" вашего запроса... начните с цикла по каждому узлу, затем удалите те, которые связаны с вашим человеком.

MATCH (bad:person) WHERE bad.id IN ['af97ab48544b']
WITH COLLECT(bad) AS bads
MATCH path = (n:person) - [r:friend|:connected|:owner] -> (m)
WHERE n._id = '' AND (m:person OR m:cat OR m:dog) AND NOT ANY(bad IN bads WHERE bad IN NODES(path))
RETURN path

Тем не менее, эта проблема гораздо больше подходит для SQL, чем для графа. Каждый раз, когда вам приходится перебирать каждый узел с меткой, вы находитесь на реляционной территории, график будет менее эффективным.

Другие вопросы по тегам