我正在通过使用neo4j连接图形数据库中的歌曲来构建音乐推荐系统的框架(CSV文件中包含来自Million Songs的数据)。这是我第一次使用neo4j,但是我以前使用过SQL。
到目前为止,我有三个节点:Song,Artist和Tempo。
我已经创建了艺术家与其歌曲之间的关系,现在我正尝试在每首歌曲和一系列节奏之间建立一种关系。
我可以让每首歌曲都与特定的节奏有关联(例如:120bpm),但这不会很有用,因为那样我便无法从Tempo退回并看到另一首速度非常接近的歌曲(例如:119或121bpm)。
因此,我尝试将Tempo节点(为浮动节点)从一个确切的数字(例如:120bpm)分组到范围,例如0-80(分类为非常慢),81-100(慢) ,101-130(中等)等...
我知道从理论上讲最好不要设置速度组,但是我才刚刚开始,现在可以。
每个Song节点具有参数title
artistName
tempo
。
每个Artist节点都有参数artistName
title
。
每个Tempo节点都有参数tempo
title
。
我尝试通过以下方式创建新节点:
CREATE (Tempo {Tempo.tempo<80});
...以及我现在不记得的其他几种方式。任何知道如何执行此操作或是否可能的人?
答案 0 :(得分:1)
您似乎在多个节点标签之间不必要地复制了属性,从而避免了给定节点与多个其他节点相关。例如,一个Artist节点不应具有title属性,因为它将该节点绑定到特定的Song。无论如何,每首歌曲都可能与适当的歌手有关系,因此无需将歌曲的标题存储在歌手节点中。
此外,正如@InverseFalcon建议的那样,您可以使用一对属性(例如min
和max
)来表示范围。
以下是合适的数据模型中路径的示例:
(:Tempo {min: 0, max: 79})<-[:HAS_TEMPO]-(:Song {title: 'Foo'})<-[:PERFORMED]-(:Artist {name: 'Fred'})
每个速度范围将有一个Tempo
节点。
使用上述数据模型,此简单查询将返回所有具有相同节奏范围的歌曲($speed
是parameter,表明感兴趣的特定节奏):
MATCH (t:Tempo)
WHERE t.min <= $speed <= t.max
MATCH (t)<-[:HAS_TEMPO]-(s:Song)
RETURN s;
这是您返回曾在所需节奏范围内播放过歌曲的独特歌手的方式:
MATCH (t:Tempo)
WHERE t.min <= $speed <= t.max
MATCH (t)<-[:HAS_TEMPO]-(:Song)<-[:PERFORMED]-(a:Artist)
RETURN DISTINCT a;