如何在Neo4j中获取或创建独特的子节点
问题描述:
我是Neo4j的新手,尝试设置音乐数据库来玩耍。从简单开始,我只是有两个标签玩:如何在Neo4j中获取或创建独特的子节点
Artist
Song
显然,这是一个父子关系,其中一个Song
是Artist
的孩子(或可能有多个Artist
S),并可能看起来像:
(:Artist {name:'name'})-[:RECORDED]->(:Song {title:'title'})
我在做后续荷兰国际集团假设:
- 艺术家名称是唯一
- 歌曲标题是不独特
- 重复采集的数据是不可避免的
举的想什么,我做的一个例子:
- 我摄入伦纳德科恩的“哈利路亚”。创建了一个新的
Artist
节点和Song
节点,其中RECORDED
关系 - 我通过Jeff Buckley摄入“Hallelujah”。再次,创建新的
Artist
和Song
节点,关系为RECORDED
。第一个“哈利路亚”Song
根本没有与这个新图形关联。 - 我再次通过Jeff Buckley摄取“哈利路亚”。什么都没发生。
- 我摄入Jeff Buckley的“丁香葡萄酒”。我们再用我们的老
Artist
节点,但我有一个RECORDED
关系
从我可以告诉一个新Song
节点,使用MERGE
让我接近,但并不完全存在(它停止ARTIST
的重复,但不的SONG
)。如果我使用CREATE
,则点编号3.不能正常工作。
我想我可以添加另一个属性到SONG
标签跟踪其ARTIST
(因此我可以做出独特的),但这似乎有点冗余和单一的图形数据库,不是?
有没有人对执行这些关系和要求最简洁的方式有任何明智的想法?
答
合并艺术家第一次,之后宋:
WITH 'Leonard Cohen' AS ArtistName,
'Hallelujah' AS SongTitle
MERGE (A:Artist {name:ArtistName})
WITH A,
SongTitle
OPTIONAL MATCH p=(A)-[:RECORDED]->(:Song {title:SongTitle})
FOREACH (x in CASE WHEN p IS NULL THEN [1] ELSE [] END |
CREATE (S:Song {title:SongTitle})
MERGE (A)-[:RECORDED]->(S)
)
WITH A,
SongTitle
MATCH p = (A)-[:RECORDED]->(:Song {title:SongTitle})
RETURN p
答
我不认为歌曲标题是独一无二的东西,尤其是如果此图谱包含现有歌曲的封面。
确定一些额外的手段来暗示唯一性是要走的路。
艺术家是一种方式。记录日期可能是另一个需要考虑的数据。如果您从其他类型的数据库中读取这些数据,则可能会有其他唯一ID用于唯一性。
无论如何,一旦你有你想用来确定唯一性的领域,合并您的歌曲节点与所有这些领域存在。
这确实工作,虽然现在已经看到了语法多么复杂需要是实现这一目标,我倾向于只使用一个冗余'artist'我可以写'MERGE(a) - [:RECORDED] - >(s:Song {title:'Hallelujah',艺术家:'Leonard Cohen'})'(或者甚至是一起去掉'Artist'标签?!) – Alec