【问题标题】:Match nodes with and without a relationship in Neo4j在 Neo4j 中匹配有和没有关系的节点
【发布时间】:2015-03-18 23:24:12
【问题描述】:

我正在使用 Neo4j 安装附带的示例影片图。

我想找一个演员(按姓名),他在电影和所有其他电影中扮演的角色(他还没有接触到)。

我能得到的最接近的是以下内容,但演员、角色和 actedInMovies 重复的次数与其他电影一样多。

MATCH (actor{name:'Bill Paxton'})-[roles:ACTED_IN]->(actedInMovies), (otherMovies:Movie)
WHERE NOT (actor)-[:ACTED_IN]->(otherMovies)
RETURN actor, roles, actedInMovies, otherMovies

我怎样才能只得到一个演员的结果,对应电影的角色,以及所有其他电影?

提前致谢!

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

    稍微不同的方法怎么样?首先获取比尔·帕克斯顿演过的所有电影,然后使用该电影集合找到所有不在其中的电影。然后返回比尔·帕克斯顿,他演过的电影集和他没有演过的电影集(即其余部分)

    MATCH (actor:Person {name:'Bill Paxton'})-[r:ACTED_IN]->(acted:Movie) 
    with actor, collect(acted) as acted_in_movies, collect(r) as roles
    MATCH (other:Movie)
    WHERE none (acted in acted_in_movies where acted = other) 
    RETURN actor.name, acted_in_movies, roles, collect(other) as other_movies
    

    更新了查询以反映我测试它的数据集。添加角色名称集合并将电影节点更改为结果集的标题。

    MATCH (actor {name:'Bill Paxton'})-[r:ACTS_IN]->(acted) 
    with actor, collect(acted) as acted_in_movies, collect(acted.title) as acted_titles, collect(r.name) as roles
    MATCH (other:Movie)
    WHERE none (acted in acted_in_movies where acted = other) 
    RETURN actor.name, acted_titles, roles, collect(other.title) as other_movies
    

    【讨论】:

    • 该查询得到 0 行?
    • 不,肯定是 ACTED_IN
    • 还有这个? MATCH (actor {name:'Bill Paxton'})-[roles:ACTED_IN]->(acted) return actor, collect(acted) as acted_in_movies 它必须是一个数据的东西。我在这里使用了电影数据集neo4j.com/developer/example-data/#_the_data_sets 并尝试了原始查询,但我必须将 ACTED_IN 更改为 ACTS_IN 才能返回行
    • 这很好。抱歉,错误是演员节点被标记为:Person,而不是:Actor...
    • 我将您的原始答案编辑为:个人标签,这几乎是我所需要的,缺少角色...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多