在Neo4J中加入两次比赛

问题描述 投票:0回答:1

我是neo4j的新手,需要帮助,我遇到以下问题:

我有一个描述电影评论的小数据库。

基本上,节点设置如下:

(Critic)-[review]->(Movie)

评论关系具有一个称为星星的属性,它描述评论家给予电影的星星。

一个例子是这个。

(Jon)-[review{stars:4}]->(Titanic)
(Jon)-[review{stars:3}]->(Avatar)
(Alf)-[review{stars:4}]->(Avatar)

我很高兴我被要求得到所有评论家中给出4星但从未给出3的评论家的名字。

在这种情况下,答案必须是Alf

[首先,我与给了4星(Jon,Alf)的评论家比赛,然后我与给了3(Jon)的评论家比赛。现在我想内部加入他们,只得到Alf。我该怎么做?香港专业教育学院到目前为止所取得的成就:

MATCH (N:Critic)-[r:REVIEWS]->() 
WHERE r.Stars=4 with distinct n.Name as names4
MATCH (m:Critic)-[s:REVIEWS]->() 
WHERE s.Stars=3 with distinct m.Name as names3, names4 as names4
RETURN distinct [n IN names4 WHERE NOT n IN names3 ] as listC

正如您所知,我有两个匹配项,但我不知道如何进行内部联接

group-by neo4j cypher inner-join
1个回答
0
投票

您可以大大简化查询。 Cypher非常酷,富有表现力:)

MATCH (c:Critic)
WHERE (c)-[:REVIEWS{Stars:4}]->() AND
NOT (c)-[:REVIEWS{Stars:3}]->()
RETURN c.name as critic_name

您尝试过的方式也可以,您必须将查询更改为:

// Get all the critics who given a score 3
MATCH (c:Critic)-[r:REVIEWS]->()
WHERE r.Score = 3
WITH collect(distinct c) as score_3_critics
// get all critics who gave a score 4, but filter out
// critics who gave it 3
MATCH (c1:Critic)-[r1:REVIEWS]->()
WHERE r1.Score = 4 AND NOT c1 in score_3_critics
RETURN distinct c1.name as critic

我总是更喜欢像第一个示例那样过滤结果。如果您有多种定义查询的方式以获得相同的结果,则最好使用PROFILE语句检查执行计划,以查看哪个查询更快。

© www.soinside.com 2019 - 2024. All rights reserved.