как запросить где в где в neo4j - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть проект, который использует весеннюю загрузку и базу данных neo4j.Я хочу написать запрос, который за один match получает все, что имеет некоторые параметры и минус узел, который приводит ко второму match.Я использую optional match, но когда второй match имеет 2 узла в ответ, он не работает.Я пытался использовать оператор UNWIND, но он не работает.Я должен сказать, что результат от до match - это один и тот же узел, и когда результаты второго match - это один узел, запрос хорошо работает в этом проекте, у меня есть твит, пользовательский и ArchivedChat узлы, и пользователь может создатьили ответьте на другой твит или заархивированный твит, который создаете сам.

запрос, который хорошо отвечает для некоторого уравнения:

match (n:Twit)-[t:TAGS]->(y:Hashtag)
where n.isPrivate=true and y.name="#PRIVATE_xxxxx"
match (a:ArchivedChat)
where  a.username="xxxxx" and  a.chatId<>n.chatId
return distinct n

Я ищу и читаю много документов и использую WITH и UNWIND операторы и не получают правильного ответа.

Я думаю, что ситуация аналогична СУБД, когда вы хотите использовать select, где IN другой select.

Если у вас есть предложения по этой проблеме, пожалуйста, свяжитесь со мной или ответьте на сообщение.

спасибо

Ответы [ 4 ]

0 голосов
/ 02 марта 2019

Я нахожу свой ответ

необязательное совпадение (nn: GArchivedChat), где nn.username = 'xxx' с collect (nn.chatId) в качестве совпадения nn2 (n: GTwit) - [t: TAGS] -> (y: GHashtag) где n.isPrivate = true и y.name = '# PRIVATE_CHAT_xxx', а не (n.chatId в nn2) возвращают различные n

решение было, а не (n.chatId в nn2) спасибо всем пользователям

0 голосов
/ 25 февраля 2019

Вы захотите собрать узлы в список, и оттуда вы можете использовать проверку IN, чтобы сделать то, что вы хотите:

match (n:Twit)-[:TAGS]->(y:Hashtag)
where n.isPrivate=true and y.name="#PRIVATE_xxxxx"
with collect(DISTINCT n) as forbiddenList
match (a:ArchivedChat)
where  a.username="xxxxx" and NOT a IN forbiddenList
return a

Однако, если вы ищете противоположное, личное: Twits, которые не заархивированы для имени пользователя, затем вам нужно будет отменить операции:

match (a:ArchivedChat)
where  a.username="xxxxx"
with collect(a) as forbiddenList
match (n:Twit)-[:TAGS]->(y:Hashtag)
where n.isPrivate=true and y.name="#PRIVATE_xxxxx" and NOT n IN forbiddenList
return DISTINCT n
0 голосов
/ 28 февраля 2019

Если на узлах: ArchivedChat отображаются: Twitch архивированные узлы, вы можете сделать это более простым способом, просто добавив: ArchivedChat label для: Twit узлов.Затем вы можете исключить узлы с меткой: ArchivedChat с помощью следующего запроса:

MATCH (n:Twit)-[t:TAGS]->(y:Hashtag)
WHERE NOT n:ArchivedChat AND n.isPrivate=true AND y.name="#PRIVATE_xxxxx"
RETURN n
0 голосов
/ 25 февраля 2019

Как насчет:

match (n:Twit)-[t:TAGS]->(y:Hashtag), (a:ArchivedChat{username:"xxxxx"})
where n.isPrivate=true and y.name="#PRIVATE_xxxxx" and a.chatId<>n.chatId
return distinct n

Дайте мне знать, если это решило вашу проблему.

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