2016-02-22 45 views
0

我对neo4j比较新,我在合并节点时遇到了一些问题。也许我有错误的概念,但这里是问题陈述和我试图做的事情。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 

理想情况下,我想能够创建一个图表,我可以看到用户对不同电影的所有连接作为一对多连接。我希望这是明确的!关于我做错什么的想法。

回答

0

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

其实,你有:

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

问题是,在这里,你有一个:1(或1:2 N永远不知道哪一个)关系,意义一个用户只能有一部电影。

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

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

然后你就可以找到每一部电影的用户,使用该请求:

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

所以我是否需要指定它匹配的内容?我的意思是它怎么知道要匹配什么? – Roshini

+0

您必须在创建数据集时设置关系,而不必在您的问题查询中创建外键关系。 – Supamiu

+0

我看到工作!非常感谢。 – Roshini