0%

JanusGraph Cheat Sheet

Console

  1. 透過 console 連線到 graph server:

    1. remote.yaml

      1
      2
      3
      4
      5
      6
      7
      8
      hosts: [172.16.4.141] # graph server ip
      port: 8182 # graph server port
      serializer: {
      className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0,
      config: {
      serializeResultToString: true
      }
      }
    2. 在 console 中輸入

      1
      2
      gremlin> :remote connect tinkerpop.server conf/remote.yaml
      ==>Configured 172.16.4.141/172.16.4.141:8182

      conf/remote.yaml 就是第一步設定的 remote.yaml 檔案的位置

    3. 這樣只是代表有連線到 graph 而已,要把在 console 輸入的指令直接傳到 remote 還有一個步驟

      1
      2
      gremlin> :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 mode
      1
      2
      gremlin> :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 間切換

    4. 注意:預設在 remote 的情況下,在 console 設定的所有變數都不會被儲存,所以所有指令都需要一行寫完,如果想要儲存變數的話,可以在 :remote connect tinkerpop.server conf/remote.yaml 後加上 session

      1
      2
      gremlin> :remote connect tinkerpop.server conf/remote.yaml session
      ==>Configured 172.16.4.141/172.16.4.141:8182-[52d16fee-127d-4c60-8d13-04f7aa747ce2]
  2. 透過 submit groovy script 的方式將程式碼送到 remote graph 來執行:

    由於 remote 的情況下,變數都不會儲存,這樣寫起來很麻煩,所以可以將要傳到 remote 執行的 script 先寫好,再從 local 將 script 傳到 remote 來執行

    1. 建立 cluster

      1
      2
      gremlin> cluster = Cluster.open("./conf/remote.yaml");
      ==>/172.16.4.141:8182
    2. 建立 client

      1
      2
      gremlin> client = cluster.connect();
      ==>org.apache.tinkerpop.gremlin.driver.Client$ClusteredClient@4c82b5df
    3. 寫 script,使用 """ 可以寫多行

      1
      2
      3
      4
      5
      gremlin> script = """
      ......1> tg.V().count()
      ......2> """
      ==>
      tg.V().count()
    4. 將 script submit 到 remote 執行:

      1
      2
      gremlin> results = client.submit(script);
      ==>result{object=20 class=java.lang.String}
  3. 建立 graph

    1. 設定 graph.properties

      1
      2
      3
      4
      # backend 種類有 cassandra、hbase、inmemory 等等
      storage.backend=inmemory
      # 選擇你的 graph server 的 ip 在哪
      storage.hostname=localhost
    2. 回到 console 建立 graph

      1
      graph = JanusGraphFactory.open('conf/graph.properties')
    3. 這樣這個 graph 就建立好了

  4. 開始 traversal

    1. 建立起始點 g

      1
      g = graph.traversal()
    2. 之後就可以開始寫 gremlin 語法了,例如:

      1
      g.V().has('name', 'saturn').next()
  5. schema 管理

    1. 印出目前 graph 的 schema

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      mgmt = 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 |
      ---------------------------------------------------------------------------------------------------
    2. 加入 vertex label

      1
      2
      3
      mgmt = graph.openManagement()
      tweet = mgmt.makeVertexLabel('tweet').make()
      mgmt.commit()
    3. 加入 property key 到 vertex label 中

      1
      2
      3
      4
      5
      mgmt = graph.openManagement()
      tweet = mgmt.makeVertexLabel('tweet').make()
      body = mgmt.makePropertyKey('body').dataType(String.class).cardinality(Cardinality.SET).make()
      mgmt.addProperties(tweet, body)
      mgmt.commit()
    4. 加入 edge label

      1
      2
      3
      mgmt = graph.openManagement()
      follow = mgmt.makeEdgeLabel('follow').make()
      mgmt.commit()
    5. 加入 property key 到 edge label 中

      1
      2
      3
      4
      5
      mgmt = graph.openManagement()
      follow = mgmt.makeEdgeLabel('follow').make()
      name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SET).make()
      mgmt.addProperties(follow, name)
      mgmt.commit()
    6. 刪除 schema

      1
      2
      3
      mgmt.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()
    7. 修改 schema 名稱

      1
      2
      3
      tweet = mgmt.getVertexLabel('tweet') // 也可以是 getEdgeLabel、getPropertyKey
      mgmt.changeName(tweet,'tweet2')
      mgmt.commit();
    8. 取得所有 vertex label

      1
      2
      3
      4
      5
      gremlin> mgmt.getVertexLabels()
      ==>tweet
      ==>user
      ==>blog
      ==>message
    9. 取得所有 edge label

      1
      2
      3
      gremlin> mgmt.getRelationTypes(EdgeLabel.class)
      ==>knows
      ==>post
    10. 取得所有 property key

      1
      2
      3
      4
      5
      6
      7
      8
      9
      gremlin> 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
2
g.addV(); // 沒給 label 的話預設的 label 就是 "vertex"
g.addV('role'); // 如果有給 label 的話 label 就是 "role"

新增 Vertex Property:

1
2
3
4
g.addV('role').property('name','role') // 在建立 vertex 時可以順便建立 property
g.addV('role'). // 也可以一次加多個 property
property('name','role').
property('qwe','qwe')

編輯 Vertex Label:

1
2
3
role = mgmt.getVertexLabel('role')
mgmt.changeName(role,'role2')
mgmt.commit();

修改完後所有 vertex 裡面如果 label 原本是 role 的就會 全部 變成 role2

編輯 Vertex Property:

假設原本 vertex 4096 裡面有 id、label、name、phone 這幾個 property

1
2
gremlin> g.V(4096).elementMap()
==>[id:4096,label:user,name:admin,phone:00002002]

如果想要改變 property 的 value 的話,就是直接覆蓋過去就好

1
2
3
4
gremlin> g.V(4096).property('phone',12345)
==>v[4096]
gremlin> g.V(4096).elementMap()
==>[id:4096,label:user,name:admin,phone:12345]

刪除 Vertex:

g.V(vertex id).drop 可以刪掉 vertex

1
2
3
4
5
6
7
8
9
10
11
12
gremlin> g.V()
==>v[4096]
==>v[8192]
==>v[12288]
==>v[4104]
==>v[4120]
gremlin> g.V(4096).drop()
gremlin> g.V()
==>v[8192]
==>v[12288]
==>v[4104]
==>v[4120]

刪除 Vertex Property:

g.V(vertex id).properties(property key).drop()

1
2
3
4
5
gremlin> g.V(8192).elementMap()
==>[id:8192,label:role,name:admin]
gremlin> g.V(8192).properties('name').drop()
gremlin> g.V(8192).elementMap()
==>[id:8192,label:role]

取得 Vertex:

1
2
3
g.V(); // 取得所有 vertex
g.V(vertex id) // 透過 vertex id 取得一個 vertex
g.V().hasLabel(label name) // 取的某個 label 下的所有 vertex

新增 Edge:

直接對兩個 vertex 新增 edge

1
2
3
v1 = g.addV().next();
v2 = g.addV().next();
e = g.addE('firend').from(v1).to(v2)

從某個 vertex 新增 edge 到另一個 vertex

1
2
v2 = g.V(4120).next()
g.V(4334).addE('knows').to(v2)

新增 Edge Property:

1
2
v2 = g.V(4136).next()
g.V(4334).addE('knows').to(v2).property('from','2020/01/01')

編輯 Edge Label:

1
2
3
knows = mgmt.getEdgeLabel('knows')
mgmt.changeName(knows,'know')
mgmt.commit();

修改完後所有 edge 裡面如果 label 原本是 knows 的就會 全部 變成 know

編輯 Edge Property:

假設原本 edge 1l8-38g-2dx-3co 裡面有 id、label、in、out、from 這幾個 property

1
2
gremlin> g.E('1l8-38g-2dx-3co').valueMap()
==>[from:2021/01/01]

如果想要改變 property 的 value 的話,就是直接覆蓋過去就好

1
2
3
4
gremlin> g.E('1l8-38g-2dx-3co').property('from','2018/05/06')
==>e[1l8-38g-2dx-3co][4192-friend->4344]
gremlin> g.E('1l8-38g-2dx-3co').valueMap()
==>[from:2018/05/06]

如果想要新增一個 property 的話:

1
2
3
4
gremlin> g.E('1l8-38g-2dx-3co').property('at','school')
==>e[1l8-38g-2dx-3co][4192-friend->4344]
gremlin> g.E('1l8-38g-2dx-3co').valueMap()
==>[from:2018/05/06,at:school]g.

刪除 Edge:

g.V(vertex id).drop 可以刪掉 vertex

1
2
3
4
5
6
gremlin> g.E()
==>e[1l8-38g-2dx-3co][4192-friend->4344]
==>e[1lr-3co-2dx-38g][4344-friend->4192]
gremlin> g.E('1l8-38g-2dx-3co').drop()
gremlin> g.E()
==>e[1lr-3co-2dx-38g][4344-friend->4192]

刪除 Edge Property:

刪除某筆 edge 的 property:

1
2
3
4
5
gremlin> g.E('1lr-3co-2dx-38g').valueMap()
==>[from:2020/01/01]
gremlin> g.E('1lr-3co-2dx-38g').properties('from').drop()
gremlin> g.E('1lr-3co-2dx-38g').valueMap()
==>[]

取得 Edge:

1
2
3
g.E(); // 取得所有 edge
g.E(edge id) // 透過 edge id 取得一個 edge
g.E().hasLabel(label name) // 取的某個 label 下的所有 edge

取得 Edge Property:

1
2
3
4
5
6
7
// 取得 edge 所有資訊
gremlin> g.E('2dh-36w-6c5-360').elementMap()
==>[id:2dh-36w-6c5-360,label:knows,IN:[id:4104,label:vertex],OUT:[id:4136,label:user],from:2020/01/01]

// 取得 property 就好
gremlin> g.E('2dh-36w-6c5-360').valueMap()
==>[from:2020/01/01]

在 .Net 中使用

  1. 先安裝 Gremlin.net nuget

  2. 建立 Gremlin Server

    1
    2
    3
    4
    5
    6
    7
    var gremlinServer = new GremlinServer(
    graph.Host,
    graph.Port,
    graph.EnableSsl,
    graph.UserName,
    graph.Password
    );
  3. 建立 client

    1
    var client = new GremlinClient(gremlinServer);
  4. 寫要傳去給 remote graph 執行的指令

    1
    2
    3
    4
    var script = @"
    mgmt = expert.openManagement();
    mgmt.getVertexLabels();
    ";
  5. 使用 SubmitAsync 來傳送指令,並以 dynamic 接收回傳值

    1
    var response = await client.SubmitAsync<dynamic>(script);
  6. traversal 的方式:

    1. 建立 remote connection

      1
      var remoteConnection = new DriverRemoteConnection(client, 'TraversalSource,你的 graph 名稱,ex: g');
    2. 建立 g

      1
      var g = AnonymousTraversalSource.Traversal().WithRemote(remoteConnection);
    3. 就可以開始寫 gremlin 語法了

      1
      var result = g.V().Count();