我试图找到所有未连接到特定节点的节点。我有一个应用程序,学生在做一个任务发现故事中的主题,然后写出说明。然后,其他学生对这些说明进行同行评审。我的数据如下:
Assignment-hasTheme->Theme-hasChild->Theme
Annotation-theme->Theme
Explication-owner->User
Explication-annotation->Annotation
PeerReview-explication->Explication
作为应用程序的一部分,当用户必须进行同行评审时,我必须找到其他用户编写的所有解释。在我看来,这个查询应该有效:
MATCH
(u),
(a)-[:hasTheme]->(:Theme)
-[:hasChild*]->(:Theme)
<-[:theme]-(ann:Annotation)
<-[:annotation]-(e:Explication)
OPTIONAL MATCH
(e)<-[:explication]-(p:PeerReview)
WHERE id(a)=7 AND id(u)=4
AND (e)-[:owner]->(u)
RETURN e, count(e) AS explicationCount
ORDER BY explicationCount ASC
问题在于它没有:我得到了所有用户都写过的所有解释。这包括用户编写的解释。谁能告诉我如何排除这些?
答案 0 :(得分:2)
问题是WHERE
子句只与另一个子句......前面的MATCH
,OPTIONAL MATCH
或WITH
相关联。在您的查询中,它与OPTIONAL MATCH
。
如果你知道这一点重新阅读你的查询,你可以看到第一个MATCH
没有WHERE
子句,所以它匹配所有的任务和所有用户,找到所有的解释。
然后它执行可选匹配以获得:PeerReviews
匹配给定的赋值和用户ID,其中解释所有者是具有给定id的用户。 WHERE
仅影响:PeerReviews
(变量p
)匹配。
我可以看到的其他几件事......您在模式中匹配的ann
上引入变量:Annotations
,并为{{1}引入变量p
但是,你实际上并没有在查询中对这些做任何事情。这也会导致PeerReview
无用,您无法返回或操作匹配的OPTIONAL MATCH
。
我的建议是删除这些变量并完全删除:PeerReviews
。
OPTIONAL MATCH
如果您确实要添加MATCH
(u),
(a)-[:hasTheme]->(:Theme)
-[:hasChild*]->(:Theme)
<-[:theme]-(:Annotation)
<-[:annotation]-(e:Explication)
WHERE id(a)=7 AND id(u)=4
AND (e)-[:owner]->(u)
RETURN e, count(e) AS explicationCount
ORDER BY explicationCount ASC
并使用匹配的OPTIONAL MATCH
,请确保它低于影响:PeerReview
的{{1}},如下所示:
WHERE
编辑
在回复所需结果的评论时:解释和所有链接的计数:PeerReviews,您将使用此查询:
MATCH
修改
更新了上述查询,以便在父主题上找到注释,而不仅仅是其子主题。