【发布时间】:2021-05-23 08:40:18
【问题描述】:
我正在使用 Amazon Neptune 创建和查询一个简单的图形数据库。我目前正在 AWS Jupyter Notebook 中运行我的代码,但最终会将代码移至 Python (gremlin_python)。正如您可能猜到的那样,我对 Gremlin 和图形数据库很陌生。
我有以下数据
g.addV('person').property(id, 'john')
.addV('person').property(id, 'jim')
.addV('person').property(id, 'pam')
.addV('game').property(id, 'G1')
.addV('game').property(id, 'G2')
.addV('game').property(id, 'G3').iterate()
g.V('john').as('p').V('G1').addE('bought').from('p').iterate()
g.V('john').as('p').V('G2').addE('bought').from('p').iterate()
g.V('john').as('p').V('G3').addE('bought').from('p').iterate()
g.V('jim').as('p').V('G1').addE('bought').from('p').iterate()
g.V('jim').as('p').V('G2').addE('bought').from('p').iterate()
g.V('pam').as('p').V('G1').addE('bought').from('p').iterate()
数据库中有 3 个人和 3 个游戏。我的目标是,给定一个人,告诉我哪些人购买了与他们相同的游戏,以及哪些游戏是那些
查看示例代码(主要来自https://tinkerpop.apache.org/docs/current/recipes/#recommendation)后,我有以下代码尝试查找购买的游戏
g.V('john').as('target') Target person we are interested in comparing against
.out('bought').aggregate('target_games') // Games bought by target
.in('bought').where(P.neq('target')).dedup() // Persons who bought same games as target (excluding target and without duplicates)
.group().by().by(out("bought").where(P.within("target_games")).count()) // Find persons, group by number of co owned games
.unfold().order().by(values, desc).toList() // Unfold to create list, order by greatest number of common games
这给了我结果:
- {v[jim]: 2}
- {v[pam]: 1}
这告诉我 jim 有 2 个与 john 相同的游戏,而 pam 只有 1 个。但我希望我的查询返回他们共同拥有的实际游戏(仍按最常见游戏的顺序排列):
- {v[jim]: ['G1', 'G2']}
- {v[pam]: ['G1]}
感谢您的帮助。
【问题讨论】:
-
我在下面的答案中提供了几种不同的方法来做到这一点。您可能希望将问题标题更改为“查找拥有我拥有的游戏的人”之类的内容。当前标题不会帮助其他人搜索此类问题。感谢您提供示例图。这在回答问题时真的很有帮助。
-
@KelvinLawrence 在下面回答了所有问题,除了如何按常见游戏数量对最终结果进行排序。
-
我添加了一个按共同游戏数量排序的查询版本
标签: python-3.x gremlin amazon-neptune