0

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'))

ご覧のとおり、すべての製品に画像があるわけではありません。

カテゴリと画像のプロパティですべての商品を選択できるようにしたい。商品に画像がない場合でも、null 画像プロパティで選択する必要があります。

このリンクをたどって、左結合と同様のことをしようとしています: http://sql2gremlin.com/#_left_join

残念ながら、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'))

4

1 に答える 1

1

したがって、ここではいくつかのことが行われています。

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)
于 2019-10-28T05:22:54.207 に答える