Neo4J Cypher排除连接到特定节点

时间:2016-09-01 18:22:13

标签: neo4j cypher

我试图找到所有未连接到特定节点的节点。我有一个应用程序,学生在做一个任务发现故事中的主题,然后写出说明。然后,其他学生对这些说明进行同行评审。我的数据如下:

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

问题在于它没有:我得到了所有用户都写过的所有解释。这包括用户编写的解释。谁能告诉我如何排除这些?

1 个答案:

答案 0 :(得分:2)

问题是WHERE子句只与另一个子句......前面的MATCHOPTIONAL MATCHWITH相关联。在您的查询中,它与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

修改

更新了上述查询,以便在父主题上找到注释,而不仅仅是其子主题。