我有一个使用spring boot和neo4j数据库的项目。
我想编写一个查询,在其中一个match
中获取具有某些选项的所有查询,并减去导致第二个match
产生的节点。我使用optional match
,但是当第二个match
有2个节点作为响应时,它不起作用。我尝试使用UNWIND
运算符,但不起作用。
我必须说,来自match
的结果是同一节点,当第二个match
的结果是一个节点时,查询效果很好
在这个项目中,我有一个tweet,用户和ArchivedChat节点,用户可以创建或回复由他自己创建的另一条tweet或已归档的tweet。
对于某些方程式响应良好的查询是:
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
运算符,但没有得到正确的答复。
我认为情况与RDBMS相同,当您想在其他select
中使用IN
时使用select
。
如果您对此问题有任何建议,请与我联系或回复帖子。
谢谢
答案 0 :(得分:0)
怎么样:
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
让我知道这是否解决了您的问题。
答案 1 :(得分:0)
您需要将节点收集到一个列表中,然后可以使用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
但是,如果您正在寻找相反的,私有的,未为用户名存档的T子,那么您将需要撤消操作:
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
答案 2 :(得分:0)
如果:ArchivedChat节点显示已存档的:Twit节点,则可以通过将:ArchivedChat标签添加到:Twit节点,以更简单的方式进行。然后,可以通过以下查询排除带有:ArchivedChat标签的节点:
MATCH (n:Twit)-[t:TAGS]->(y:Hashtag)
WHERE NOT n:ArchivedChat AND n.isPrivate=true AND y.name="#PRIVATE_xxxxx"
RETURN n
答案 3 :(得分:0)
我找到了答案
可选匹配项(nn:GArchivedChat),其中nn.username ='xxx',collect(nn.chatId)为nn2匹配项(n:GTwit)-[t:TAGS]->(y:GHashtag)其中n.isPrivate = true和y.name ='#PRIVATE_CHAT_xxx'而不是(nn2中的n.chatId)返回不同的n
解决方案是(不是)(nn2中的n.chatId) 感谢所有用户