下載地址
iGraph Java SDK 讓 Java 開發人員可以非常方便地使用 Java 程序操作特征存儲引擎服務。開發者可以直接使用 Maven依賴添加SDK,也可以下載包到本地。目前,SDK 支持 J2SE 8.0 及以上版本。
使用步驟
為快速開始使用 iGraph Java SDK,請按照如下步驟進行。
步驟1 創建阿里云賬號
具體方法請參考 賬號注冊(PC端)。為了更好地使用阿里云服務,建議盡快完成實名認證,否則部分阿里云服務將無法使用。
步驟2 獲取iGraph訪問密鑰
登錄阿里云控制臺,在購買頁面設置的用戶名和密碼就是訪問iGraph的密鑰。
如忘記密碼,可參看下圖進行密碼重置。
步驟3 安裝 Java 開發環境
iGraph Java SDK 支持 J2SE 8.0 及以上的 Java 運行環境,您可以從 Java 官方網站 下載并按說明安裝 Java 開發環境。
步驟4 安裝 Java SDK
推薦使用 Apache Maven 獲取最新版本的 SDK,您可以添加如下配置到您的 Maven 項目。
<dependency>
<groupId>com.aliyun.igraph</groupId>
<artifactId>aliyun-sdk-igraph</artifactId>
<version>{lastest-sdk-version}</version>
</dependency>
步驟5 開始使用SDK
使用 iGraph Java SDK 的主要步驟:
類似于開源Gremlin客戶端,配置初始化參數并構建
Client
實例,除了阿里云賬號密碼以外,您還需要設定endpoint
構建查詢或更新的 Query
調用submit接口發起查詢、更新及刪除請求并處理應答或異常
配置參數
參數說明
參數 | 類型 | 描述 |
src | String | 含義:用戶自己定義的場景名稱 功能:統計用戶查詢來源的指標標識,便于故障排查的快速定位 |
endpoint | String | 查詢、更新服務的Endpoint |
userName | String | 經過授權的云賬號userName |
userPasswd | String | 經過授權的云賬號userPasswd |
maxConnPerRoute | int | 與服務端單機 HTTP 的最大連接數,建議值8 |
maxConnTotal | int | 與服務端 HTTP 的最大總連接數,建議值2000 如果有連接數超過最大值的報錯,可再適當放大 |
connectionRequestTimeout | int | 查詢超時時間,單位毫秒 |
socketTimeout | int | netty 參數,與connectionRequestTimeout保持一致即可 |
connectTimeout | int | netty 參數,與connectionRequestTimeout保持一致即可 |
retryTimes | int | 遇到超時或可重試異常的重試次數,建議值3。 |
客戶端初始化
為了增加連接池的復用,建議不要多次創建
Client
,盡量使用同一個Client
對象。
// 配置客戶端
Cluster.Builder builder = Cluster.build();
// 必選配置,指定endpoint、用戶名、密碼
builder.addContactPoint("your_endpoint")
.userName("your_user_name")
.userPasswd("your_user_passwd");
// 可選配置,不指定則客戶端按默認值配置
builder.src("your_src")
.socketTimeout(100)
.connectTimeout(100)
.connectionRequestTimeout(100)
.maxConnTotal(10000)
.maxConnPerRoute(5000)
.retryTimes(3);
Cluster cluster = builder.create();
Client client = cluster.connect();
Gremlin查詢、更新與刪除數據
Gremlin語法及算子介紹,詳見:功能概覽
Gremlin兼容性,詳見:Gremlin step兼容情況
查詢
API查詢接口
這里提供簡單一度查詢的示例代碼
首先
import static com.aliyun.iGraph.client.gremlin.gremlin_api.GraphTraversalSource.g
,iGraph可以方便地指定圖名來實現多圖查詢。客戶端API會對每個單步做一些簡單的語法校驗
// 完成一次查詢并打印結果
GraphTraversal gt = g("your_graph_name").V("your_id").hasLabel("your_label");
// 調用查詢接口,獲取結果集
ResultSet resultSet = client.submit(gt);
List<Result> resultList = resultSet.all().join();
resultList.forEach(p -> System.out.println(p.getObject()));
// 關閉客戶端
cluster.close();
明文查詢接口
直接使用明文構建查詢Query
在客戶端通過bind將Gremlin Query中的可變參數(如key等)替換為bind變量,使得iGraph服務端可以將Gremlin Query生成的語法樹放入cache,可使客戶端rt下降4%-8%
注意:
此優化僅支持
g
、E
、V
、filter
、fields
、order
、range
、join
、alias
等單步組成的Query此優化僅可替換
V/E
后的id、filter
后的表達式、range
后的上下邊界值bind_key以
$
開頭,如$para1
、$1
可以通過構造
RequestOption
指定bind和其他個性化參數
// 調用明文查詢接口獲取結果
String gt = "g(\"your_graph_name\").V(\"your_id\").hasLabel(\"your_label\")";
ResultSet resultSet = client.submit(gt);
// 指定bind
String gt = "g(\"your_graph_name\").V($1).hasLabel(\"your_label\")";
Map<String, Object> bind = new HashMap<>();
bind.put("$1", "1");
ResultSet resultSet = client.submit(gt, bind);
// 通過 RequestOptions 指定個性化參數
String gt = "g(\"your_graph_name\").V($1).hasLabel(\"your_label\")";
RequestOptions requestOptions = RequestOptions.build()
.src("your_src")
.timeout(1000)
.retryTimes(2)
.addParameter("$1", "1")
.create();
ResultSet resultSet = client.submit(gt,requestOptions);
更新與刪除
iGraph支持Gremlin語法的插入與刪除操作,但不支持游走中的節點更新
更新時需要指定節點或邊的所有屬性
刪除時只需要指定pkey
返回的
ResultSet
中保存本次請求的相關信息
// 插入一個只有一個屬性值的點
GraphTraversal gt = g("your_graph_name").addV("your_label").property("pkey", "pk_value").property("value", "0.5");
ResultSet resultSet = client.submit(gt);
List<Result> resultList = resultSet.all().join();
resultList.forEach(p -> System.out.println(p.getObject()));
// 將更新的節點刪除
gt = g("your_graph_name").V("pk_value").hasLabel("your_label").drop();
resultSet = client.submit(gt);
resultList = resultSet.all().join();
resultList.forEach(p -> System.out.println(p.getObject()));
更多更新和刪除樣例
// 插入一條有兩個屬性值的邊
gt = g("graph_name").addE("label").property("pkey", "pk_value").property("skey","sk_value").property("value1", "abc").property("value2", "0.5");
// 刪除指定pkey的邊,若存在符合條件的多條邊,全部刪除
gt = g("graph_name").E("pk1").hasLabel("label").drop();
// 刪除指定pkey、skey的邊
gt = g("graph_name").E("pk1:sk1").hasLabel("label").drop();
查詢結果讀取
ResultSet
每次查詢返回一個
ResultSet
,結果的獲取接口與TinkerPop完全相同,可以通過如下接口獲取:
// 獲取本次請求的所有結果。iGraph SDK不是流式的,會一次性返回所有結果,建議使用此接口。
CompletableFuture<List<Result>> futureList = resultSet.all();
// 獲取本次請求的部分結果
CompletableFuture<List<Result>> futureList = resultSet.some(int i);
// 獲取本次請求的單條結果
Result result = resultSet.one();
每個
Result
就是一條結果,您需要根據結果類型調用相應的接口:
接口 | 意義 |
String getString() | 獲取String結果 |
int getInt() | 獲取int結果 |
byte getByte() | 獲取byte結果 |
short getShort() | 獲取short結果 |
long getLong() | 獲取long結果 |
float getFloat() | 獲取float結果 |
double getDouble() | 獲取double結果 |
boolean getBoolean() | 獲取boolean結果 |
Vertex getVertex() | 獲取一個點 |
Edge getEdge() | 獲取一條邊 |
Element getElement() | 獲取一個實體元素,可以是一個點也可以是一條邊 |
Path getPath() | 獲取一條游走路徑 |
<V> Property<V> getProperty() | 獲取一條屬性 |
<V> VertexProperty<V> getVertexProperty() | 獲取一條點的屬性 |
<T> T get(final Class<? extends T> clazz) | 獲取泛型結果,包含iGraph擴展的數據類型 |
Object getObject() | 獲取Object,在您不確定結果類型時可以選擇這個通用接口 |
其中,
<T> T get(final Class<? extends T> clazz)
是可以獲取多值類型、Map、Set、BulkSet等特殊數據類型,詳見以下示例:
// 獲取List
List<Result> vecValue = result.get(List.class);
// 獲取Map.Entry
Map.Entry<Result, Result> entry = result.get(Map.Entry.class);
// 獲取Set
Set<Result> setValue = result.get(Set.class);
// 獲取Map
Map<Object, Result> mapValue = result.get(Map.class);
// 獲取BulkSet
BulkSet bulkSet = result.get(BulkSet.class);
Map<Result, Long> value = bulkSet.getValue();
// 獲取多值結果
List<Byte> multiValues = result.get(MultiByte.class).getValue();
List<Short> multiValues = result.get(MultiShort.class).getValue();
List<Integer> multiValues = result.get(MultiInt.class).getValue();
List<Long> multiValues = result.get(MultiLong.class).getValue();
List<Integer> multiValues = result.get(MultiUInt8.class).getValue();
List<Integer> multiValues = result.get(MultiUInt16.class).getValue();
List<Long> multiValues = result.get(MultiUInt32.class).getValue();
List<Long> multiValues = result.get(MultiUInt64.class).getValue();
List<Float> multiValues = result.get(MultiFloat.class).getValue();
List<Double> multiValues = result.get(MultiDouble.class).getValue();
List<String> values = result.get(MultiString.class).getValue();
Path
Path
代表的是一條或多條路徑,記錄了多跳查詢時經過的頂點或者邊信息,具體由 Query 決定。Path
接口如下:調用
objects()
獲取路徑內容
接口 | 意義 |
int size() | 路徑上元素的數量 |
boolean isEmpty() | 判斷路徑是否為空 |
<A> A head() | 獲取路徑的起點 |
<A> A get(String label) | 獲取對應label的元素或元素列表 |
<A> A get(Pop pop, String label) | 獲取部分對應label的元素或元素列表 |
<A> A get(int index) | 獲取路徑上某一個元素 |
boolean hasLabel(String label) | 判斷路徑中是否存在對應label的元素 |
List<Object> objects() | 獲取路徑元素的列表 |
List<Set<String>> labels() | 獲取路徑元素的label列表 |
Path clone() | 克隆當前路徑 |
boolean isSimple() | 判斷當前路徑是不是簡單路徑 |
Iterator<Object> iterator() | 獲取路徑的迭代器 |
void forEach(BiConsumer<Object, Set<String>> consumer) | 通用接口 |
Stream<Pair<Object, Set<String>>> stream() | 獲取路徑的stream |
boolean popEquals(Pop pop, Object other) | 判斷兩個路徑是否相等 |
Path subPath(String fromLabel, String toLabel) | 獲取子路徑 |
Vertex/Edge
Vertex
是頂點,Edge
是邊,對應的是iGraph中的一條記錄,接口如下:接口
意義
String label()
獲取元素的label
Set<String> keys()
獲取元素的屬性名
<V> Property<V> property(String key)
獲取對應key值的屬性
<V> V value(String key)
獲取對應key的屬性值
<V> Iterator<V> values(String... propertyKeys)
獲取對應一組key的屬性值
<V> Iterator<VertexProperty<V>> properties(final String... propertyKeys)
獲取對應一組key的屬性
調用
value(String key)
獲取的屬性值可以是多種數據類型,具體由Query決定
Property/VertexProperty
Property
和VertexProperty
都是屬性,調用Vertex.property(String key)
獲取的頂點屬性VertexProperty
,接口如下:接口
意義
String key()
獲取屬性名
V value()
獲取屬性值
boolean isPresent()
判斷是否可用
void ifPresent(final Consumer<? super V> consumer)
如果可用,將結果傳入Consumer
V orElse(final V otherValue)
如果可用,返回value,否則返回otherValue
V orElseGet(final Supplier<? extends V> valueSupplier)
如果可用,返回value,否則從Supplier獲取結果
<E extends Throwable> V orElseThrow(final Supplier<? extends E> exceptionSupplier) throws E
如果可用,返回value,否則從Supplier獲取并拋出異常
Element element()
獲取當前屬性所屬的元素(僅支持從元素查詢得到的Property)
調用
value()
獲取的屬性值可以是多種數據類型,具體由Query決定