Azure cosmosdb 如何使用gremlinapi在azurecosmosdb中进行左连接

Azure cosmosdb 如何使用gremlinapi在azurecosmosdb中进行左连接,azure-cosmosdb,graph-databases,azure-cosmosdb-gremlinapi,Azure Cosmosdb,Graph Databases,Azure Cosmosdb Gremlinapi,我正在研究Azure Cosmos DB的Gremlin API,并试图将一些SQL语句转换为Gremlin遍历 命令如下: //add product vertex g.addV('product').property('id', 'product1') g.addV('product').property('id', 'product2') g.addV('product').property('id', 'product3') g.addV('product').property('id

我正在研究Azure Cosmos DB的Gremlin API,并试图将一些SQL语句转换为Gremlin遍历

命令如下:


//add product vertex
g.addV('product').property('id', 'product1')
g.addV('product').property('id', 'product2')
g.addV('product').property('id', 'product3')
g.addV('product').property('id', 'product4')
g.addV('product').property('id', 'product5')

//add product_category vertex
g.addV('product_category').property('id', 'category1')
g.addV('product_category').property('id', 'category2')

//connect product and product_categories

g.V('product1').addE('belongs_to').to(g.V('category1'))
g.V('product2').addE('belongs_to').to(g.V('category1'))
g.V('product3').addE('belongs_to').to(g.V('category2'))
g.V('product4').addE('belongs_to').to(g.V('category2'))
g.V('product5').addE('belongs_to').to(g.V('category2'))

//add image vertex
g.addV('image').property('public_url', 'url_1').property('id', 'image1')
g.addV('image').property('public_url', 'url_2').property('id', 'image2')


//link products to images

g.V('product1').addE('belongs_to').property('primary', true).to(g.V('image1'))
g.V('product2').addE('belongs_to').property('primary', true).to(g.V('image2'))

现在你可以看到,并不是所有的产品都有图像

我想能够选择与类别和图像属性的所有产品。 如果产品没有图像,则仍应使用空图像属性选择该产品

我正在尝试通过以下链接执行类似于左连接的操作:

但不幸的是,Azure Cosmos的Gremlin API还不支持match()步骤

我当前的查询仅选择具有输出边缘到图像的产品:

g.V()
.has('label', 'product')
.as('product')
.outE('has_image')
.has('primary', true)
.inV()
.as('primary_image')
.in('has_image')
.out('belongs_to')
.as('category')
.select('product','primary_image','category')
.by(__.valueMap()).by(__.values('public_url')).by(__.values('name'))


所以这里有两件事:

1) 上面的脚本无法正确地将数据插入TinkerGraph(我没有Cosmos帐户)。我在下面添加了更新的脚本

2) 您尝试的内容不需要左连接。由于这两种关系都与产品无关,因此您可以仅从产品顶点投影结果,如下所示:

g.V().
  hasLabel('product').
  project('product', 'category', 'image').
    by(id()).
    by(out('belongs_to').id()).
    by(
      __.out('has_image').fold().
      coalesce(
        unfold().id(), 
        constant('No Image')
      )
    )
其工作原理是查找所有产品顶点,然后返回图像和类别

3) 那里的coalesce语句基于Gremlin recipe来检查元素是否存在。如果它找不到任何东西,因为配方不存在,它将返回一个常量值

4) Gremlin不允许返回
null
值,因此您需要返回一些内容

更新的添加脚本

//add product vertex
g.addV('product').property(id, 'product1')
g.addV('product').property(id, 'product2')
g.addV('product').property(id, 'product3')
g.addV('product').property(id, 'product4')
g.addV('product').property(id, 'product5')

//add product_category vertex
g.addV('product_category').property(id, 'category1')
g.addV('product_category').property(id, 'category2')

//connect product and product_categories

g.V('product1').addE('belongs_to').to(g.V('category1'))
g.V('product2').addE('belongs_to').to(g.V('category1'))
g.V('product3').addE('belongs_to').to(g.V('category2'))
g.V('product4').addE('belongs_to').to(g.V('category2'))
g.V('product5').addE('belongs_to').to(g.V('category2'))

//add image vertex
g.addV('image').property(id, 'image1').property('public_url', 'url_1')
g.addV('image').property(id, 'image2').property('public_url', 'url_2')


//link products to images

g.V('product1').addE('has_image').to(V('image1')).property('primary', true)
g.V('product2').addE('has_image').to(V('image2')).property('primary', true)

举个例子对提高问题的质量非常有用。向我们展示您拥有的数据、边和顶点以及尝试运行的遍历的示例。感谢您的更正,请参阅编辑版本。