neo4j - 创建包含范围的节点时遇到问题
问题描述
我正在通过使用 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});
...以及其他几种我现在不记得的方式。任何人都知道如何做到这一点或是否有可能?
解决方案
您似乎在多个节点标签之间不必要地复制属性,以防止给定节点与多个其他节点相关联。例如,Artist 节点不应具有 title 属性,因为这会将该节点绑定到特定的歌曲。无论如何,每首歌曲都可能与相应的艺术家有关系,因此无需将歌曲的标题存储在艺术家节点中。
此外,正如@InverseFalcon 建议的那样,您可以使用一对属性来表示一个范围,比如min
and 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;
推荐阅读
- python - Python 错误字符串索引必须是整数
- arrays - Ruby on Rails - Ruby,如何使用相同的键从两个哈希中添加值,而不覆盖这些值?
- android - 错误:命令失败:./gradlew app:installDebug -PreactNativeDevServerPort=8081(尝试了其他类似问题的所有答案。)
- segmentation-fault - 为什么我的代码中存在分段错误,即从 BT 的叶节点创建 DLL?
- tesseract - Tesseract 无法识别最简单的文本
- javascript - 将数据从主布局传递到 Nextjs 中的子页面
- jquery - filedrop.js 使用隐藏字段重命名文件
- git - 如何从 CentOS7 中删除 SmartGit?
- python - PySimpleGUI 中的计算器
- python - 如何在子图中添加颜色条和标题?