阿里云GDB推薦使用String-based
Gremlin scripts請求與GDB服務端交互,在使用各SDK發送scripts請求時,需要將請求中參數部分模板化以提升查詢性能。
重要
參數模板化是使用一個Map
結構參數bindings,將scripts請求中可變數據參數用占位符替換,同時再將占位符和對應的數據值放到bindings,達到使用相同scripts請求、不同bindings完成同類型Gremlin訪問。
各語言SDK的參數模板化寫法相似,以下給出關鍵部分代碼示例。
常見問題
內部保留字
proprty(id, G__id)
這個不加引號的id
為主鍵,滿足全局唯一性約束你在設置參數綁定時,不要使用以下
g.addV(label).property('id', id)
寫法,因為id、label均為系統內部保留字,語句中加引號的id
代表一個普通屬性,不滿足唯一性約束。
模板化參數個數限制
GDB支持bindings中模板化參數的個數最大值是128,不可修改。
模板化中參數的選取
一類scripts請求通常使用在固定場景時,數據參數中僅有部分是可變的,我們只需要給可變部分建立占位符,固定數據部分可以直接硬編碼到請求中。
以下示例請求是添加標簽為’person’,帶’name’和’age’兩個屬性的點。
dsl = "g.addV('person').property('name', G___PV1).property('age', G___PV2)" bindings = {"G___PV1":"Jack","G___PV2":29} client.submit(dsl, bindings).all().join()
參數dsl不變,使用獲取到的’name’和’age’數據填充bindings。提交請求寫入點數據。
List參數支持
// 帶有list類型,hasId、within等 valueMap見下文,需要使用多個占位符 String dsl = "g.V().has(G__key1, within(G__value1)).valueMap(true)"; Map<String, Object> parameters= new HashMap<>(1); List<String> values = new ArrayList<>(Arrays.asList("beijing", "shanghai", "shenzhen")); parameters.put("G__key1", "location"); parameters.put("G__value1", values); List<Result> result = client.submit(dsl, parameters).all().join();
部分
Gremlin Step
參數不支持數組類型參數,比如ValueMap,需要使用多個占位符分別指定多值類型中的元素。# valueMap參數不支持數組,參數錯誤 bindings = {"G___PKs":["name","age"]} dsl = "g.V().hasLabel('person').valueMap(G___PKs)" client.sumbit(dsl, bindings) # 使用兩個占位符表示兩個參數,正確 bindings = {"G___PK1":"name","G___PK2":"age"} dsl = "g.V().hasLabel('person').valueMap(G___PK1,G___PK2)" client.submit(dsl, bindings).all().join()
Java參數模板化
String dsl ="g.addV(G___label).property(id,G___id).property('name',G___name)";
Map<String, Object> parameters = new HashMap<>();
parameters.put("G___id","sand131_id_5_99"); // 點id參數
parameters.put("G___label","person"); // 點label參數
parameters.put("G___name","Jack"); // 點屬性'name'值參數
List<Result> result = client.submit(dsl, parameters).all().join();
python參數模板化
dsl ="g.addV(G___label).property(id,G___id).property('name',G___name)"
parameters = {}
parameters["G___id"] = "sand131_id_5_99"
parameters["G___label"] = "person"
parameters["G___name"] = "Jack"
results = client.submit(dsl, bindings=parameters).all().result()
.Net參數模板化
string dsl ="g.addV(G___label).property(id,G___id).property('name',G___name)";
Dictionary<string, object> parameters = new Dictionary<string, object> {
{"G___id", "sand131_id_5_99"},
{"G___label", "person"},
{"G___name", "Jack"}};
gremlinClient.SubmitAsync<dynamic>(dsl, parameters);
Nodejs參數模板化
function addVertex1()
{
return client.submit("g.addV(G___label).property(id,G___id).property('name',G___name)",{
G___id: "sand131_id_5_99",
G___label: "person",
G___name: "Jack"
}).then(data => {
console.log("Add Vertex Result: %s\n", JSON.stringify(data));
});
}
Go參數模板化
dsl := "g.addV(G___label).property(id,G___id).property('name',G___name)"
parameters := make(map[string]interface{})
parameters["G___id"] = "sand131_id_5_99"
parameters["G___label"] = "person"
parameters["G___name"] = "Jack"
results, err := client.SubmitScriptBound(dsl, parameters)
文檔內容是否對您有幫助?