首页 > 解决方案 > 创建包含范围的节点时遇到问题

问题描述

我正在通过使用 neo4j 连接图形数据库中的歌曲来制作音乐推荐系统的框架(包含 CSV 文件中的百万歌曲的数据)。这是我第一次使用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});

...以及其他几种我现在不记得的方式。任何人都知道如何做到这一点或是否有可能?

标签: neo4j

解决方案


您似乎在多个节点标签之间不必要地复制属性,以防止给定节点与多个其他节点相关联。例如,Artist 节点不应具有 title 属性,因为这会将该节点绑定到特定的歌曲。无论如何,每首歌曲都可能与相应的艺术家有关系,因此无需将歌曲的标题存储在艺术家节点中。

此外,正如@InverseFalcon 建议的那样,您可以使用一对属性来表示一个范围,比如minand max

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

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

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

使用上面的数据模型,这个简单的查询将返回所有具有相同速度范围的歌曲($speed是一个表示感兴趣的特定速度的参数):

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;

推荐阅读