如何用Neo4j查询仅出演指定id电影的演员,是否需要结合JS实现
这个需求完全可以通过纯Cypher查询实现,不需要额外在JS层做遍历统计,数据库层面计算效率更高,也能减少不必要的数据传输开销。
核心Cypher查询逻辑
// 先定位参数指定id的目标电影 MATCH (target_m:Movie) WHERE id(target_m) = $movieId // 匹配所有出演过该电影的演员 MATCH (a:Actor)-[:ACTED_IN]->(target_m) // 过滤出总出演电影数为1的演员,即仅在这部电影出演过的演员 WHERE size((a)-[:ACTED_IN]->(:Movie)) = 1 RETURN target_m.title as title, a.name as actor_name
注意你原有代码直接拼接请求参数到Cypher语句里,存在Cypher注入风险,必须使用Neo4j驱动的参数化查询能力传参,避免恶意请求破坏你的数据库。
修改后的完整接口代码
router.get('/:id/distinct_actors', async (req, res) => { const session = driver.session(); const data = [] try { const result = await session.run( `MATCH (target_m:Movie) WHERE id(target_m) = $movieId MATCH (a:Actor)-[:ACTED_IN]->(target_m) WHERE size((a)-[:ACTED_IN]->(:Movie)) = 1 RETURN target_m.title as title, a.name as actor_name`, // 参数化传值,原生Neo4j id为数字类型,这里做了类型转换,按需调整 { movieId: parseInt(req.params.id) } ) result.records.forEach(record => { data.push({ title: record.get('title'), actor_name: record.get('actor_name') }) }) res.send(data) } catch (err) { console.error('查询失败:', err) res.status(500).send('服务内部错误') } finally { // 无论查询成功失败都关闭session await session.close() } });
如果你使用的是自定义的电影id属性而非Neo4j原生id,把查询条件里的id(target_m)替换为对应的属性名即可,比如target_m.custom_id。
内容的提问来源于stack exchange,提问作者crazyfrog
相关产品推荐
相关产品推荐

