node.js - 使用 nodejs 从 Neo4j 获取数据
问题描述
我第一次将 Neo4j 与 nodejs 一起使用。我正在尝试一个特定的用例,它是“用户可以搜索电影,例如:泰坦尼克号,为了推荐其他类似电影,结果必须包含相同类型的电影,来自同一导演的电影。”当我搜索电影时,我能够获得电影的演员、导演和流派等相关节点。接下来我想要的是与这个导演和类型相关的其他电影。
这里的“标题”是我在 REST API Get 方法中传递的电影的名称。
session.run("MATCH (n:movie{name : $title}) -[:Acted_In|:Directed |: Belong_To]-(r) Return r ",
{ title: req.params.name }
)
.then(function (data) {
data.records.forEach(function(record){
console.log("record._fields[0].properties = ",record._fields[0].properties.name);
result.push(record._fields[0].properties.name);
})
console.log(result);
})
```
解决方案
此 Cypher 查询应该适用于您的用例(“用户可以搜索电影,例如:泰坦尼克号,为了推荐其他类似电影,结果必须包含相同类型的电影,来自同一导演的电影。”):
MATCH (m:movie)
WHERE m.name = $title
MATCH (m)-[:Belong_To]->()<-[:Belong_To]-(x)
WITH m, COLLECT(x) AS xs
MATCH (m)<-[:Directed]-()-[:Directed]->(y)
WITH m, xs, COLLECT(y) AS ys
UNWIND (xs + ys) AS otherMovie
RETURN m, COLLECT(DISTINCT otherMovie) AS recommendations
我假设这种Belong_To
关系指向一种类型。我还假设所有电影都至少有一种类型和一位导演;如果这不是真的,那么相关的MATCH
应该是一个OPTIONAL MATCH
.
该查询使用聚合函数 COLLECT
分别收集具有相同类型 ( xs
) 和相同导演 ( ys
) 的电影。然后它UNWIND是和的组合,xs
以便ys
它可以COLLECT(DISTINCT ...)
用来获取不同电影的列表。
推荐阅读
- java-ee-8 - Java EE 的 Developer Studio 项目设置不允许带有 JBoss EAP 7.2 运行时的 EAR 版本 8
- python - 如何递归更新列表
- push-notification - 从 OneSignal 迁移到 FoxPush 推送通知
- google-apps-script - 如何在来自附加侧边栏的自定义函数中插入数据
- checkbox - 将复选框重新设置为 true(处理空白)- Google Apps 脚本
- java - 使用 spock lang 规范测试控制器的选项
- java - Float to Int vs Int to Float 自动转换
- c# - SMART SSD 信息 C#
- marklogic - MarkLogic - 摄取和协调性能调整
- javascript - 如何遍历 Django 模板中的字典?