簡體   English   中英

如何使用 gremlin API 在 Azure Cosmos DB 中進行左連接

[英]How to do left join in Azure Cosmos DB using gremlin API

我正在研究 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'))

現在您可以看到並非所有產品都有圖像。

我希望能夠 select 所有具有類別和圖像屬性的產品。 如果產品沒有圖像,則仍應使用 null 圖像屬性選擇它。

我試圖通過以下鏈接執行類似於左連接的操作: http://sql2gremlin.com/#_left_join

但不幸的是,Gremlin API 的 Azure Cosmos 還不支持 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) 那里的合並語句基於Gremlin 配方來檢查元素是否存在。 如果它沒有找到任何東西,因為配方不存在,它會返回一個常量值

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM