janusgraph的數據模型---》參考
1.簡介
janusgraph的數據模型,就是一數據結構中得圖結構相似。所以janusgraph的數據schema主要定義在三個要素上:頂點,邊,屬性。上面的god圖中,紅色的點就是頂點,點與點之間的線就是邊,在點和邊上的方框中寫的就是點和邊的屬性
在janusgraph中,對schema進行操作都要打開
gremlin> mgmt=graph.openManagement()
==>org.janusgraph.graphdb.database.management.ManagementSystem@2484dbb7
2.對點的標簽進行操作(Vertex Label)
2.1 vertice label描述的是vertice的語義,不過vertice label是optional的,用來區分不同類型的vertice,比如 user 和 product。
2.2 利用 makeVertexLabel(String).make() 來創建vertice label
2.3 vertice label必須保持全局唯一性
查詢出所有的vertice label
mgmt.vertexLabels
增加一個vertice label
mgmt = graph.openManagement() person = mgmt.makeVertexLabel('person').make() mgmt.commit() // Create a labeled vertex person = graph.addVertex(label, 'person') // Create an unlabeled vertex v = graph.addVertex() graph.tx().commit()
3.對Edge label進行操作
3.1在一個事務中,用makeEdgeLabel(String) 來定義一個edge label。edge label必須是唯一的,這個方法會返回一個 builder
,這個 builder
可以用來獲取這種edge label的多度關系multiplicity,這個指標限定了每對(pair)之間edge最大的數量。
3.2 創建edge label 中有一個屬性 Multiplicity ,通過設置這個屬性值來限定每對(pair)之間edge最大的數量。
MULTI,SIMPLE,MANY2ONE,ONE2MANY,ONE2ONE
3.3 如果在創建過程中不進行設置,默認使用MULTI
mgmt = graph.openManagement() follow = mgmt.makeEdgeLabel('follow').multiplicity(MULTI).make() mother = mgmt.makeEdgeLabel('mother').multiplicity(MANY2ONE).make() mgmt.commit()
4.Property keys
屬性Property的定義在頂點點和邊上,Property是key-value的形式存在
通過 makePropertyKey(String)
方法來創建Property key,屬性名應該盡可能避免使用空格和特殊字符
Native JanusGraph Data Types
Name | Description |
---|---|
String |
Character sequence |
Character |
Individual character |
Boolean |
true or false |
Byte |
byte value |
Short |
short value |
Integer |
integer value |
Long |
long value |
Float |
4 byte floating point number |
Double |
8 byte floating point number |
Date |
Specific instant in time ( |
Geoshape |
Geographic shape like point, circle or box |
UUID |
Universally unique identifier ( |
在創建Property是需要注意 Property key Data Type 和 Property Key Cardinality
Property key Data Type
每個屬性的key和value都有自己的數據類型,必須是上述表格的數據類型的一種,通過dataType(Class)來定義數據類型。
數據類型可以聲明為Object.class ,但是如果這樣使用的話,會造成空間的浪費,同時在進行數據導入時janusgraph無法幫我我們判斷數據類型是否符合要求
Property Key Cardinality
使用方法cardinality(Cardinality)方法來定義某個頂點的某個屬性的基底
在janusgraph的圖數據庫中有三個選擇
SINGLE:每一個元素對於這個key只能有一個value,比如 birthDate 就是一個single基底,因為每個人最多只能有一個生日。
LIST:每個元素對於這個key可以有任意數量的值,比如我們建模傳感器(sensor),其有一個屬性是 sensorRecords,那么,對於這個屬性,可能有一系列的值。注意,LIST是允許有重復元素的。
SET: 與LIST相同,不同的是,SET不允許有重復的元素。
默認的cardinality是single。注意,對於邊屬性來說,property key的基底始終是single。
mgmt = graph.openManagement() birthDate = mgmt.makePropertyKey('birthDate').dataType(Long.class).cardinality(Cardinality.SINGLE).make() name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SET).make() sensorReading = mgmt.makePropertyKey('sensorReading').dataType(Double.class).cardinality(Cardinality.LIST).make() mgmt.commit()
5.Relation Type
Edge labels和property keys共同稱為Relation Types。關系類型的名稱在圖形中必須是唯一的,這意味着property keys和Edge labels不能具有相同的名稱。JanusGraph API中有一些方法可以查詢是否存在或檢索包含property keys和Edge labels的關系類型
mgmt = graph.openManagement() if (mgmt.containsRelationType('name')) name = mgmt.getPropertyKey('name') mgmt.getRelationTypes(EdgeLabel.class) mgmt.commit()