簡體   English   中英

TinkerPop3 Gremlin遍歷

[英]TinkerPop3 Gremlin traversal

在此處輸入圖片說明

首先,給定一個節點A,首先我們需要找出可以通過“朋友”邊緣到達的所有節點(A,B,C ...所有藍色節點)。 我可以通過使用下面的path()步驟來實現這一點:

 g.V().hasLabel("Person").has("name", "A")
                            .repeat(out("Friend"))
                            .until(out("Friend").count().is(0))
                            .path();

然后,我們可以使用Java代碼從路徑對象中提取垂直對象。

但是實際上,我們需要找出他們讀了哪些書(綠色的)。 但是我們不能從gremlin中的path()中提取垂直方向。

我們有什么辦法可以一次遍歷gremlin嗎?


編輯:實際上,有2種情況:

  1. 從A中找出所有通過“朋友”邊緣連接的人。 我們通過上面提到的遍歷來做到這一點。 (是否有更好的方法?即直接在gremlin中提取這些節點?)

  2. 從A中找出所有人,然后找出他們閱讀的所有書籍,然后只歸還書籍。

您可以使用並集步驟。

g.V()
 .hasLabel("person")
 .has("name", "A")
 .repeat(union(out("friend"),
               out("read")))
 .until(out("friend").count().is(0))
 .union(path(),
        out("read").path())

應該可以滿足您的需求。 圖定義為

gremlin> :> graph.addVertex(T.label, "person", "name", "A")
==>v[0]
gremlin> :> graph.addVertex(T.label, "person", "name", "B")
==>v[2]
gremlin> :> graph.addVertex(T.label, "person", "name", "C")
==>v[4]
gremlin> :> graph.addVertex(T.label, "person", "name", "D")
==>v[6]
gremlin> :> a = g.V(0).next(); b = g.V(2).next(); a.addEdge("friend", b, "is", "is");
==>e[8][0-friend->2]
gremlin> :> b = g.V(2).next(); c = g.V(4).next(); a.addEdge("friend", b, "is", "is");
==>e[9][2-friend->4]
gremlin> :> a = g.V(0).next(); d = g.V(6).next(); a.addEdge("friend", b, "is", "is");
==>e[10][0-friend->6]
gremlin> :> graph.addVertex(T.label, "book", "name", "Huck Finn")
==>v[11]
gremlin> :> graph.addVertex(T.label, "book", "name", "Tom Sawyer")
==>v[13]
gremlin> :> graph.addVertex(T.label, "book", "name", "A Tale Of Two Cities")
==>v[15]
gremlin> :> a = g.V(0).next(); b = g.V(11).next(); a.addEdge("read", b, "is", "is");
==>e[17][0-read->11]
gremlin> :> a = g.V(2).next(); b = g.V(13).next(); a.addEdge("read", b, "is", "is");
==>e[18][2-read->13]
gremlin> :> a = g.V(4).next(); b = g.V(15).next(); a.addEdge("read", b, "is", "is");
==>e[19][4-read->15]

它產生

gremlin> :> g.V().hasLabel("person").has("name", "A").repeat(union(out("friend"), out("read"))).until(out("friend").count().is(0)).union(path(), out("read").path())
==>[v[0], v[6]]
==>[v[0], v[11]]
==>[v[0], v[2], v[4]]
==>[v[0], v[2], v[4], v[15]]
==>[v[0], v[2], v[13]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM