无法创建包含范围的节点

时间:2018-12-12 01:21:56

标签: neo4j

我正在通过使用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});

...以及我现在不记得的其他几种方式。任何知道如何执行此操作或是否可能的人?

1 个答案:

答案 0 :(得分:1)

您似乎在多个节点标签之间不必要地复制了属性,从而避免了给定节点与多个其他节点相关。例如,一个Artist节点不应具有title属性,因为它将该节点绑定到特定的Song。无论如何,每首歌曲都可能与适当的歌手有关系,因此无需将歌曲的标题存储在歌手节点中。

此外,正如@InverseFalcon建议的那样,您可以使用一对属性(例如minmax)来表示范围。

以下是合适的数据模型中路径的示例:

(:Tempo {min: 0, max: 79})<-[:HAS_TEMPO]-(:Song {title: 'Foo'})<-[:PERFORMED]-(:Artist {name: 'Fred'})

每个速度范围将有一个Tempo节点。

使用上述数据模型,此简单查询将返回所有具有相同节奏范围的歌曲($speedparameter,表明感兴趣的特定节奏):

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;