【JanusGraph】第五章:資料庫建模
第五章:資料模型
Chapter 5. Schema and Data Modeling
每個JanusGraph
圖都是由邊標籤(edge label)、屬性key、頂點標籤(vertex label)構成。JanusGraph
圖模型(schema)可以顯示定義也可以隱示定義。在實際應用開發過程中圖模型定義是強烈建議採用顯示定義的。一個顯示的圖模型定義對構建一個穩定的圖應用非常重要並且可以提升協同開發效率。值得注意的是,隨著時間的推移圖模型演進是不需要對圖進行任何中斷操作的。擴充套件圖模型定義不會使查詢變慢並且也不需要停機操作。
圖元素(邊、屬性、頂點)在圖中被第一次建立的時候其模型定義(即邊標籤、屬性key、頂點標籤)是需要明確指定的,並且指定後不可改變。這樣更容易使模型保持穩定。
除了本章介紹的模型定義選項外,將在30章高階模型中繼續討論模型定義的優化選項。
5.1 邊標籤定義
5.1. Defining Edge Labels
連線2個頂點的邊的標籤被定義為這2個頂點之間的具體關聯關係。例如頂點A和頂點B間的邊的標籤型別為朋友,則表明A、B兩人之間存在友誼。
定義邊標籤需要在一個開啟的圖或者管理事物中呼叫makeEdgeLabel(String)
方法,引數即為邊標籤名。邊標籤名在圖中必須唯一。此方法返回一個允許定義其多樣性邊標籤的生成器。多樣性標籤定義會約束所有該標籤的邊,也就是說,限制了兩個頂點最多能夠有多少條邊。JanusGraph
邊標籤多樣性
5.1.1. Edge Label Multiplicity
多樣性設定
- 多對多(MULTI): 任意2個頂點相同標籤的邊允許有多條。換句話說,這種圖是包含此類標籤的多圖。這在邊的多樣性上沒有約束。
- 簡單(SIMPLE): 任意2個頂點間相同邊標籤的邊最多有一條,換句話說,這種圖是包含此類標籤的簡單圖。這確保任意2個頂點間這類邊標籤的邊唯一。
- 多對一(MANY2ONE): 在圖中此類邊標籤在任意頂點出邊只能有一條,入邊沒有限制。++母親++邊標籤就是這種多對一的例子,一個人只能有一個母親,但是一個母親可以有多個孩子。
- 一對多(ONE2MANY): 在圖中此類邊標籤的邊一個頂點只能有一個入邊,出邊不限制。++贏得比賽++邊標籤就是這樣的例子,一場比賽最多隻能被一個人贏得比賽,但是一個人可以贏得多場比賽。
- 一對一(ONE2ONE):在圖中此類標籤只能有一條入邊和一條出邊,++結婚++邊標籤就是這樣的一對一的例子,表示一個人只能和另外一個人結婚。
預設的邊多樣性限制是多對多。在定義邊標籤的時候呼叫make()
完成邊標籤定義並返回定義的邊標籤,就像下面這個例子。
mgmt = graph.openManagement()
follow = mgmt.makeEdgeLabel('follow').multiplicity(MULTI).make()
mother = mgmt.makeEdgeLabel('mother').multiplicity(MANY2ONE).make()
mgmt.commit()
定義屬性key
5.2. Defining Property Keys
邊和頂點的屬性是鍵值對,例如屬性name='Daniel'
具有屬性鍵name
,屬性值Daniel
。屬性鍵是JanusGraph
圖模型的一部分並且只能是允許的資料型別和基準值。
定義屬性性鍵,可以在開啟的圖或者管理事物上呼叫`makePropertyKey(String)
方法,傳遞的引數就是圖屬性標籤。圖中屬性key必須唯一,建議在圖屬性名中避免使用空格和特殊字元。這個方法返回一個圖鍵構造器。
5.2.1屬性key資料型別
5.2.1. Property Key Data Type
使用dataType(Class)
定義屬性key資料型別。JanusGraph
將強制該屬性key的資料的資料型別必須是這個方法定義的。這保證如圖的資料都是有效的。例如可以定義name
key具有String型別。
資料型別定義為Object.class
允許該key可以設定任何資料型別的值。然而,應儘量使用固定型別的值。配置的資料型別必須是具體的類,不能是結構和抽象類。JanusGraph
強制類相等,所以配置資料型別是子類是不允許的。
JanusGraph
原生支援下面這些資料型別。
Table 5.1. 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 (java.util.Date) |
Geoshape | Geographic shape like point, circle or box |
UUID | Universally unique identifier (java.util.UUID) |