Console
透過 console 連線到 graph server:
remote.yaml
1
2
3
4
5
6
7
8hosts: [172.16.4.141] # graph server ip
port: 8182 # graph server port
serializer: {
className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0,
config: {
serializeResultToString: true
}
}在 console 中輸入
1
2gremlin> :remote connect tinkerpop.server conf/remote.yaml
==>Configured 172.16.4.141/172.16.4.141:8182conf/remote.yaml就是第一步設定的 remote.yaml 檔案的位置這樣只是代表有連線到 graph 而已,要把在 console 輸入的指令直接傳到 remote 還有一個步驟
1
2gremlin> :remote console
==>All scripts will now be sent to Gremlin Server - [172.16.4.141/172.16.4.141:8182] - type ':remote console' to return to local mode1
2gremlin> :remote console
==>All scripts will now be evaluated locally - type ':remote console' to return to remote mode for Gremlin Server - [172.16.4.141/172.16.4.141:8182]輸入這個指令會在
將指令傳送到 graph與將指令傳送到 local間切換注意:預設在 remote 的情況下,在 console 設定的所有變數都不會被儲存,所以所有指令都需要一行寫完,如果想要儲存變數的話,可以在
:remote connect tinkerpop.server conf/remote.yaml後加上session1
2gremlin> :remote connect tinkerpop.server conf/remote.yaml session
==>Configured 172.16.4.141/172.16.4.141:8182-[52d16fee-127d-4c60-8d13-04f7aa747ce2]
透過 submit groovy script 的方式將程式碼送到 remote graph 來執行:
由於 remote 的情況下,變數都不會儲存,這樣寫起來很麻煩,所以可以將要傳到 remote 執行的 script 先寫好,再從 local 將 script 傳到 remote 來執行
建立 cluster
1
2gremlin> cluster = Cluster.open("./conf/remote.yaml");
==>/172.16.4.141:8182建立 client
1
2gremlin> client = cluster.connect();
==>org.apache.tinkerpop.gremlin.driver.Client$ClusteredClient@4c82b5df寫 script,使用
"""可以寫多行1
2
3
4
5gremlin> script = """
......1> tg.V().count()
......2> """
==>
tg.V().count()將 script submit 到 remote 執行:
1
2gremlin> results = client.submit(script);
==>result{object=20 class=java.lang.String}
建立 graph
設定 graph.properties
1
2
3
4# backend 種類有 cassandra、hbase、inmemory 等等
=inmemory
# 選擇你的 graph server 的 ip 在哪
=localhost回到 console 建立 graph
1
graph = JanusGraphFactory.open('conf/graph.properties')
這樣這個 graph 就建立好了
開始 traversal
建立起始點
g1
g = graph.traversal()
之後就可以開始寫 gremlin 語法了,例如:
1
g.V().has('name', 'saturn').next()
schema 管理
印出目前 graph 的 schema
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21mgmt = graph.openManagement();
mgmt.printSchema()
==>------------------------------------------------------------------------------------------------
Vertex Label Name | Partitioned | Static |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
Edge Label Name | Directed | Unidirected | Multiplicity |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
Property Key Name | Cardinality | Data Type |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
Graph Index (Vertex) | Type | Unique | Backing | Key: Status |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
Graph Index (Edge) | Type | Unique | Backing | Key: Status |
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
Relation Index (VCI) | Type | Direction | Sort Key | Order | Status |
---------------------------------------------------------------------------------------------------加入 vertex label
1
2
3mgmt = graph.openManagement()
tweet = mgmt.makeVertexLabel('tweet').make()
mgmt.commit()加入 property key 到 vertex label 中
1
2
3
4
5mgmt = graph.openManagement()
tweet = mgmt.makeVertexLabel('tweet').make()
body = mgmt.makePropertyKey('body').dataType(String.class).cardinality(Cardinality.SET).make()
mgmt.addProperties(tweet, body)
mgmt.commit()加入 edge label
1
2
3mgmt = graph.openManagement()
follow = mgmt.makeEdgeLabel('follow').make()
mgmt.commit()加入 property key 到 edge label 中
1
2
3
4
5mgmt = graph.openManagement()
follow = mgmt.makeEdgeLabel('follow').make()
name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SET).make()
mgmt.addProperties(follow, name)
mgmt.commit()刪除 schema
1
2
3mgmt.getVertexLabel('vertex label you want to delete').remove()
mgmt.getEdgeLabel('edge label you want to delete').remove()
mgmt.getPropertyKey('property key you want to delete').remove()修改 schema 名稱
1
2
3tweet = mgmt.getVertexLabel('tweet') // 也可以是 getEdgeLabel、getPropertyKey
mgmt.changeName(tweet,'tweet2')
mgmt.commit();取得所有 vertex label
1
2
3
4
5gremlin> mgmt.getVertexLabels()
==>tweet
==>user
==>blog
==>message取得所有 edge label
1
2
3gremlin> mgmt.getRelationTypes(EdgeLabel.class)
==>knows
==>post取得所有 property key
1
2
3
4
5
6
7
8
9gremlin> mgmt.getRelationTypes(PropertyKey.class)
==>id
==>name
==>title
==>body
==>tweet_belong_user_id
==>belong_user_id
==>source_property
==>target_property
Graph Data (vertex、edge、property) 的 CRUD
新增 Vertex:
1  | g.addV(); // 沒給 label 的話預設的 label 就是 "vertex"  | 
新增 Vertex Property:
1  | g.addV('role').property('name','role') // 在建立 vertex 時可以順便建立 property  | 
編輯 Vertex Label:
1  | role = mgmt.getVertexLabel('role')  | 
修改完後所有 vertex 裡面如果 label 原本是 role 的就會 全部 變成 role2
編輯 Vertex Property:
假設原本 vertex 4096 裡面有 id、label、name、phone 這幾個 property
1  | gremlin> g.V(4096).elementMap()  | 
如果想要改變 property 的 value 的話,就是直接覆蓋過去就好
1  | gremlin> g.V(4096).property('phone',12345)  | 
刪除 Vertex:
g.V(vertex id).drop 可以刪掉 vertex
1  | gremlin> g.V()  | 
刪除 Vertex Property:
g.V(vertex id).properties(property key).drop()
1  | gremlin> g.V(8192).elementMap()  | 
取得 Vertex:
1  | g.V(); // 取得所有 vertex  | 
新增 Edge:
直接對兩個 vertex 新增 edge
1  | v1 = g.addV().next();  | 
從某個 vertex 新增 edge 到另一個 vertex
1  | v2 = g.V(4120).next()  | 
新增 Edge Property:
1  | v2 = g.V(4136).next()  | 
編輯 Edge Label:
1  | knows = mgmt.getEdgeLabel('knows')  | 
修改完後所有 edge 裡面如果 label 原本是 knows 的就會 全部 變成 know
編輯 Edge Property:
假設原本 edge 1l8-38g-2dx-3co 裡面有 id、label、in、out、from 這幾個 property
1  | gremlin> g.E('1l8-38g-2dx-3co').valueMap()  | 
如果想要改變 property 的 value 的話,就是直接覆蓋過去就好
1  | gremlin> g.E('1l8-38g-2dx-3co').property('from','2018/05/06')  | 
如果想要新增一個 property 的話:
1  | gremlin> g.E('1l8-38g-2dx-3co').property('at','school')  | 
刪除 Edge:
g.V(vertex id).drop 可以刪掉 vertex
1  | gremlin> g.E()  | 
刪除 Edge Property:
刪除某筆 edge 的 property:
1  | gremlin> g.E('1lr-3co-2dx-38g').valueMap()  | 
取得 Edge:
1  | g.E(); // 取得所有 edge  | 
取得 Edge Property:
1  | // 取得 edge 所有資訊  | 
在 .Net 中使用
先安裝 Gremlin.net nuget
建立 Gremlin Server
1
2
3
4
5
6
7var gremlinServer = new GremlinServer(
graph.Host,
graph.Port,
graph.EnableSsl,
graph.UserName,
graph.Password
);建立 client
1
var client = new GremlinClient(gremlinServer);
寫要傳去給 remote graph 執行的指令
1
2
3
4var script = @"
mgmt = expert.openManagement();
mgmt.getVertexLabels();
";使用 SubmitAsync 來傳送指令,並以 dynamic 接收回傳值
1
var response = await client.SubmitAsync<dynamic>(script);
traversal 的方式:
建立 remote connection
1
var remoteConnection = new DriverRemoteConnection(client, 'TraversalSource,你的 graph 名稱,ex: g');
建立 g
1
var g = AnonymousTraversalSource.Traversal().WithRemote(remoteConnection);
就可以開始寫 gremlin 語法了
1
var result = g.V().Count();