如何查询neo4j中的位置

时间:2019-02-23 13:30:36

标签: neo4j cypher

我有一个使用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

我搜索并阅读了大量文档,并且使用WITHUNWIND运算符,但没有得到正确的答复。

我认为情况与RDBMS相同,当您想在其他select中使用IN时使用select

如果您对此问题有任何建议,请与我联系或回复帖子。

谢谢

4 个答案:

答案 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) 感谢所有用户