【问题标题】:Neo4J Merge two nodes based on label valueNeo4J 根据标签值合并两个节点
【发布时间】:2016-02-22 15:09:29
【问题描述】:

我对 neo4j 比较陌生,在合并节点时遇到了一些麻烦。也许我的概念错了,但这是问题陈述和我试图做的事情..

问题陈述:通过根据属性值为每个用户找到匹配项来创建图表。

Person->  id: user1, movie: lord of the rings
Person->  id: user1, movie: alice in wonderland
Person->  id: user2, movie: star wars
Movie->   name: lord of the rings, genre: Fantasy
Movie->   name: alice in wonderland, genre: Fantasy
Movie->   name: star wars, genre: Fantasy

我想要的输出是:

user1 -> lord of the rings   
      -> alice in wonderland
user2 -> star wars

我得到的是:

user1 -> lord of the rings
user1 -> alice in wonderland
user2 -> star wars

这是我迄今为止尝试过的:

MATCH (a:user),(b:movie)
where a.movieName = b.name
MERGE (a)-[r:matches]->(b)
RETURN r

理想情况下,我希望能够创建一个图表,在其中我可以将用户与不同电影的所有连接视为一对多连接。我希望这很清楚!关于我做错了什么的任何想法。

【问题讨论】:

    标签: graph neo4j graph-databases bigdata


    【解决方案1】:

    你在这里做的是一种 SQL 逻辑,这不是 Neo4j 应该使用的方式:)。我认为你必须改变你的数据模型:

    其实你有:

    (u:User(name:"", movie:""})
    (m:Movie{name:""})
    

    问题是在这里,您有一个 n:1(或 1:n?永远不知道是哪一个)关系,这意味着一个用户只能拥有一部电影。

    Neo4j 是一个图形数据库,这意味着您可以简单地这样做:

    (u:User{properties...})-[:MATCHES]->(m:Movie{properties...})
    

    然后,您将能够使用此请求找到用户的每一部电影:

    MATCH (:User{properties...})-[:MATCHES]->(m:Movie) return m;
    

    【讨论】:

    • 那么我需要指定它匹配的内容吗?我的意思是它怎么知道匹配什么?
    • 您必须在创建数据集时设置关系,而不必像在问题查询中那样创建 foreignKey 关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多