一網打盡JanusGraph"出邊入邊無向邊雙向邊"

原由參考我以前建立圖數據表的操做,要給「劉備」和「關羽」添加【兄弟】關係,要分別輸入劉備有個兄弟叫關羽,關羽有個兄弟叫劉備,神煩!java

問題

在網上搜查了半天愣是沒找到怎麼給jg圖數據庫的2個頂點添加一個雙向的關係,無奈翻了下官網和源碼,整理分享以下:數據庫

JanusGraph有雙向邊嗎?post

先說答案:"沒有"。學習

須要雙向邊怎麼辦?測試

"若是須要雙向邊,則經過添加兩條相反方向的單向邊實現。"this

建議使用時封裝一個方法便可。spa

邊的方向

看源碼的org.janusgraph.graphdb.relations.EdgeDirection:code

public class EdgeDirection {
    public static final Direction[] PROPER_DIRS = {Direction.IN, Direction.OUT};
    ……
}
複製代碼

白紙黑字僅有INOUT兩個方向。接口

JanusGraph不存在無向邊。get

無向邊和雙向邊

通常來講,在圖數據庫中這兩個概念的表達意圖是同樣的,也就是說「雙向」和「無向」都是表示【關係】對兩個頂點均適用。如「同窗」關係,「同事」關係,「兄弟」關係,「掘友」關係等。你是我同窗,我也是你同窗。

但我愛你,你就不必定愛我,「愛」有方向:I --[love]--> you。

directed和unidirected

可是源碼org.janusgraph.core.schema.EdgeLabelMaker接口中有兩個方法:

  • directed()
  • unidirected()
/** * Configures the label to be directed. * By default, the label is directed. * @return this EdgeLabelMaker * @see org.janusgraph.core.EdgeLabel#isDirected() */
    EdgeLabelMaker directed();

    /** * Configures the label to be unidirected. * By default, the type is directed. * @return this EdgeLabelMaker * @see org.janusgraph.core.EdgeLabel#isUnidirected() */
    EdgeLabelMaker unidirected();
複製代碼

意思是說建立邊標籤時默認是「directed」(有指向的),但這個「unidirected」是無指向的意思嗎?

官網的解釋是「單向邊」(Unidirected Edges),注意這個和「入邊」,「出邊」的單個方向概念不同。單向邊佔用更低的存儲空間,但遍歷受限。出頂點能夠沿邊遍歷,但入頂點不知道它的存在。就像萬維網中的【超連接】同樣。

【請注意,刪除其入頂點( in-vertex)時,不會自動刪除未定向的邊(Unidirected Edges)。參閱 Ghost Vertices

實測

測試場景

添加【劉備】--out--【兄弟】--in--> 【關羽】

測試方法

  • 建立邊標籤時分爲directed和unidirected
  • 再分別使用addE方法(1)g.addE("brother").from(liubei).to(guanyu)和addEdge方法(2)liubei.addEdge("brother",guanyu)添加關係
  • 測試out/in查詢語句:out是查劉備的兄弟,in是查關羽的兄弟

測試結果

能正確查出結果打√

類別 directed unidirected
out (1)
in (1) ×
out (2)
in (2) ×

結論

正向的out出邊查詢均正常

使用unidirected建立邊標籤後,關係不能入邊(in)反向查詢!!

directed(默認)建立邊標籤後,關係能夠入邊反向查詢

劉備總有兄弟叫關羽,關羽卻不必定有個兄弟叫劉備~


歸檔:【JanusGraph學習筆記】

相關專欄

怎麼新建JanusGraph圖並寫入數據?

JanusGraph入門第一課-建立IDEA項目

JanusGraph學習筆記-問題與解決(一)

相關文章
相關標籤/搜索