2017-09-09 46 views
3

在Cosmos DB圖中,當我將索引策略定義爲自動時,我能夠運行查詢,但是當我將索引策略更新爲手動並將索引路徑(/ label /?)和索引模式設置爲'一致'時,查詢不會獲取任何數據。問:Azure Cosmos數據庫圖表:如何將索引策略定義爲手動時在Graph API中運行查詢?

比方說,我的第一個查詢(當索引策略設置爲手動)是:

g.addV('Azure').property('name','Cerulean Software')) 

結果是:

[ 
    { 
     "id": "0c14a00a-edf6-46b1-9e40-45cc37f750ea", 
     "label": "Azure", 
     "type": "vertex", 
     "properties": { 
      "name": [ 
       { 
        "id": "f89ee2ee-74df-4256-a5d4-2b47eb526976", 
        "value": "Cerulean Software" 
       } 
      ] 
     } 
    } 
] 

現在,我的第二個查詢(當索引策略設置爲手動(見下面編輯#1)):

g.V().hasLabel('Azure') 

這第二個查詢不獲取任何結果,即使有頂點出現在名爲「Azure」的圖表中。

背後有什麼可能的原因?

編輯#1:手工索引策略更改

之前
"indexingPolicy": { 
    "automatic": false, 
    "excludedPaths": [], 
    "includedPaths": [ 
     { 
      "path": "/*", 
      "indexes": [ 
       { 
        "dataType": "Number", 
        "kind": "Range", 
        "precision": -1 
       }, 
       { 
        "dataType": "String", 
        "kind": "Hash", 
        "precision": 3 
       } 
      ] 
     }, 
     { 
      "path": "/label/?", 
      "indexes": [ 
       { 
        "dataType": "String", 
        "kind": "Hash", 
        "precision": 3 
       }, 
       { 
        "dataType": "Number", 
        "kind": "Range", 
        "precision": -1 
       } 
      ] 
     } 
    ], 
    "indexingMode": "consistent" 
}, 

編輯#2:手動索引政策變更後

"indexingPolicy": { 
    "automatic": false, 
    "excludedPaths": [], 
    "includedPaths": [ 
     { 
      "path": "/*", 
      "indexes": [ 
       { 
        "dataType": "Number", 
        "kind": "Range", 
        "precision": -1 
       }, 
       { 
        "dataType": "String", 
        "kind": "Hash", 
        "precision": 3 
       } 
      ] 
     }, 
     { 
      "path": "/_isEdge/?", 
      "indexes": [ 
       { 
        "dataType": "String", 
        "kind": "Hash", 
        "precision": 3 
       }, 
       { 
        "dataType": "Number", 
        "kind": "Range", 
        "precision": -1 
       } 
      ] 
     } 
    ], 
    "indexingMode": "consistent" 
}, 

回答

3

隨着宇宙,圖形報表不作爲Azure的側遍歷執行。圖形客戶端實際上將gremlin語句轉換爲Document SQL調用,然後將結果聚合回客戶端。在發言的情況下g.V().hasLabel('Azure')呼叫實際上是翻譯成{"query":"SELECT N_2 FROM Node N_2 WHERE (IS_DEFINED(N_2._isEdge) = false AND (N_2.label = 'Azure'))"}

這可以通過使用代理,如提琴手,這將使您檢查從機呼出電話進行驗證。

頂級_isEdge財產似乎用於所有Gremlin翻譯的查詢,所以我懷疑如果你添加該屬性到你的索引策略,你應該開始看到預期的結果。

編輯: 我最初錯過了設置automatic: false的部分索引策略。 According to the Cosmos docs(標題下的Opting in and opting out of indexing),By default, all documents are automatically indexed, but you can choose to turn it off. When indexing is turned off, documents can be accessed only through their self-links or by queries using ID.

如果您選擇使用索引運行已關閉,那麼你的索引其他策略是有效的毫無意義的,通過文檔ID是不能直接查詢將不再工作。你能詳細說明你在這裏想要完成什麼嗎?似乎有點混亂。您放置在labelisEdge上的索引設置甚至不是必需的,因爲它們與您爲*放置的值相同,該值是匹配所有路徑的默認規則。

發佈您的索引策略的目標是什麼,我可以嘗試提出適當的建議,但您一定要將automatic: true放回到您的策略中。

+0

謝謝傑西。所以我嘗試將這個屬性添加到我們的索引策略中,但不幸的是這沒有任何區別。我已在編輯策略之前(編輯1)和之後(編輯2)編輯了您提出的更改的問題。如果你能回顧一下並且告訴我我做錯了什麼,我將不勝感激。 – shruti

+0

@shruti我已經更新了我的答案以提供更多信息。請讓我知道,如果這可以幫助你 –

+0

非常感謝,傑西。現在我可以通過在查詢中傳遞頂點ID來獲取數據。 – shruti