首页 > 解决方案 > 使用 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);

          })
                        ```

标签: node.jsneo4jcypher

解决方案


此 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 ...)用来获取不同电影的列表。


推荐阅读