原由參考我以前建立圖數據表的操做,要給「劉備」和「關羽」添加【兄弟】關係,要分別輸入劉備有個兄弟叫關羽,關羽有個兄弟叫劉備,神煩!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};
……
}
複製代碼
白紙黑字僅有IN和OUT兩個方向。接口
JanusGraph不存在無向邊。get
通常來講,在圖數據庫中這兩個概念的表達意圖是同樣的,也就是說「雙向」和「無向」都是表示【關係】對兩個頂點均適用。如「同窗」關係,「同事」關係,「兄弟」關係,「掘友」關係等。你是我同窗,我也是你同窗。
但我愛你,你就不必定愛我,「愛」有方向:I --[love]--> you。
可是源碼org.janusgraph.core.schema.EdgeLabelMaker接口中有兩個方法:
/** * 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--> 【關羽】
g.addE("brother").from(liubei).to(guanyu)
和addEdge方法(2)liubei.addEdge("brother",guanyu)
添加關係能正確查出結果打√
類別 | directed | unidirected |
---|---|---|
out (1) | √ | √ |
in (1) | √ | × |
out (2) | √ | √ |
in (2) | √ | × |
正向的out出邊查詢均正常!
使用unidirected建立邊標籤後,關係不能入邊(in)反向查詢!!
按directed(默認)建立邊標籤後,關係能夠入邊反向查詢
劉備總有兄弟叫關羽,關羽卻不必定有個兄弟叫劉備~
歸檔:【JanusGraph學習筆記】