如何编写Gremlin查询在AWS Neptune中创建共享两部电影的Person节点关系?
在AWS Neptune中创建共享两部喜欢电影的Person节点关系
示例数据创建(Gremlin语句)
// 创建Person节点 g.addV('person').property('id', 'p1').property('name', 'Alice') g.addV('person').property('id', 'p2').property('name', 'Bob') g.addV('person').property('id', 'p3').property('name', 'Charlie') g.addV('person').property('id', 'p4').property('name', 'David') // 创建Movie节点 g.addV('movie').property('id', 'm1').property('title', 'Inception') g.addV('movie').property('id', 'm2').property('title', 'Interstellar') g.addV('movie').property('id', 'm3').property('title', 'The Dark Knight') g.addV('movie').property('id', 'm4').property('title', 'Tenet') // 创建likes_movie关联边 g.V('p1').addE('likes_movie').to(V('m1')) g.V('p1').addE('likes_movie').to(V('m2')) g.V('p1').addE('likes_movie').to(V('m3')) g.V('p2').addE('likes_movie').to(V('m1')) g.V('p2').addE('likes_movie').to(V('m2')) g.V('p2').addE('likes_movie').to(V('m4')) g.V('p3').addE('likes_movie').to(V('m1')) g.V('p3').addE('likes_movie').to(V('m3')) g.V('p4').addE('likes_movie').to(V('m2')) g.V('p4').addE('likes_movie').to(V('m4'))
核心查询语句
以下查询会找出所有共享至少两部喜欢电影的Person节点对,并创建shares_two_liked_movies关联边,同时避免重复创建双向边:
g.V().hasLabel('person').as('p1') .out('likes_movie').as('m') .in('likes_movie').hasLabel('person').as('p2') .where(neq('p1')) // 排除自身配对 .where(lt('p1.id', 'p2.id')) // 确保节点对仅被处理一次(避免A→B和B→A重复) .group().by(['p1', 'p2']).by(count('m').as('common_movies')) .unfold() .where(select('common_movies').is(gte(2))) .select(keys).as('pair') .addE('shares_two_liked_movies').from(select('pair').by(0)).to(select('pair').by(1))
关键逻辑说明
- 遍历所有Person节点,找到他们喜欢的电影,再反向关联到其他喜欢该电影的Person
- 通过
neq('p1')排除同一个节点自我配对的情况 - 利用
lt('p1.id', 'p2.id')确保每个节点对仅被处理一次,避免生成重复的双向边 - 分组统计每对Person的共同喜欢电影数量,筛选出数量≥2的节点对
- 为符合条件的节点对创建指定关联边
注意事项
- 如果你的Person节点不用
id作为唯一标识,可将lt('p1.id', 'p2.id')替换为实际的唯一属性比较(比如lt('p1.name', 'p2.name')) - 数据量较大时,建议先执行到
.unfold().where(...)部分,确认筛选出的节点对符合预期后,再添加addE步骤创建边
内容的提问来源于stack exchange,提问作者jjjjohnson
相关产品推荐
相关产品推荐

