当节点之间存在多个连接时,如何查询Gremlin

当节点之间存在多个连接时,如何查询Gremlin,gremlin,graph-databases,azure-cosmosdb-gremlinapi,Gremlin,Graph Databases,Azure Cosmosdb Gremlinapi,我正在尝试使用Gremlin构建一个建议引擎,但我很难理解当多个节点由不同的中间节点连接时如何创建查询 操场: 图形: 在这个简单的例子中,我有两个用户,都喜欢奶酪和面包。但是User2也喜欢三明治,这对User1来说似乎是一个很好的建议,因为他与User2有一些共同的兴趣 我试图回答的问题是:“根据其他用户的喜好,我可以向用户1提出什么建议?” 答案应该是:其他用户喜欢的与User1相同的东西,但不包括User1已经喜欢的东西。在这种情况下,它应该返回一个三明治 到目前为止,我有一个疑问:

我正在尝试使用Gremlin构建一个建议引擎,但我很难理解当多个节点由不同的中间节点连接时如何创建查询

操场:

图形:

在这个简单的例子中,我有两个用户,都喜欢奶酪和面包。但是User2也喜欢三明治,这对User1来说似乎是一个很好的建议,因为他与User2有一些共同的兴趣

我试图回答的问题是:“根据其他用户的喜好,我可以向用户1提出什么建议?”

答案应该是:其他用户喜欢的与User1相同的东西,但不包括User1已经喜欢的东西。在这种情况下,它应该返回一个三明治

到目前为止,我有一个疑问:

g.V(2448600).as('user1')
 .out().as('user1Likes')
 .in().where(neq('user1')) // to get to User2
 .out().where(neq('user1Likes')) // to get to what User2 likes but excluding items that User1 likes
返回:

Sandwich, bread, Sandwich (again), cheese
我认为它返回该数据是因为它首先通过Cheese节点遍历图形,因此Bread不包括在“user1Likes”列表中,因此不会排除在最终结果中。然后它穿过面包节点,所以在本例中奶酪是一个很好的建议


关于如何编写该查询有什么想法/建议吗?考虑到它应该升级到多个用户,我建议您以不同的方式建模您的问题。通常,顶点标签用于确定实体的类型。不识别实体。在您的例子中,我认为您需要两个顶点标签:“用户”和“产品”

下面是创建图形的代码

g.addV('user').property('name', 'User1').as('user1').
  addV('user').property('name', 'User2').as('user2').
  addV('product').property('name', 'Cheese').as('cheese').
  addV('product').property('name', 'Bread').as('bread').
  addV('product').property('name', 'Sandwiches').as('sandwiches').
  addE('likes').from('user1').to('cheese').
  addE('likes').from('user1').to('bread').
  addE('likes').from('user2').to('cheese').
  addE('likes').from('user2').to('bread').
  addE('likes').from('user2').to('sandwiches')
下面是为“User1”获得推荐产品的遍历

聚合步骤将“User1”喜欢的所有产品聚合到一个名为“user1Likes”的集合中

不带的
谓词只传递不在集合“user1Likes”中的顶点

g.V().has('user', 'name', 'User1').as('user1').
  out('likes').aggregate('user1Likes').
  in('likes').
  where(neq('user1')).
  dedup().
  out('likes').
  where(without('user1Likes')).
  dedup()