首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TinkerPop3 Gremlin遍历

TinkerPop3 Gremlin遍历
EN

Stack Overflow用户
提问于 2017-05-22 10:02:55
回答 1查看 271关注 0票数 1

首先,给定一个节点A,首先我们需要找到通过“朋友”边(A,B,C)可以到达的所有节点。所有的蓝色节点)。我可以使用path()-step来实现这一点,如下所示:

代码语言:javascript
复制
 g.V().hasLabel("Person").has("name", "A")
                            .repeat(out("Friend"))
                            .until(out("Friend").count().is(0))
                            .path();

然后,我们可以从java代码中的path对象中提取垂直点。

但实际上,我们需要找出他们读的是什么书(绿色的)。但是我们不能从gremlin的path()中提取垂直点。

我们能不能在一次穿越中做到这一点?

编辑:事实上,有两种情况:

  1. 从A,找出所有通过“朋友”边缘连接的人。我们通过上面提到的遍历实现了这一点。)有更好的方法吗?即。直接在gremlin中提取这些节点?)
  2. 从A中找出所有的人,然后找出他们读过的所有书,然后归还书,只归还书。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-22 14:27:17

你可以用工会的步骤。

代码语言:javascript
复制
g.V()
 .hasLabel("person")
 .has("name", "A")
 .repeat(union(out("friend"),
               out("read")))
 .until(out("friend").count().is(0))
 .union(path(),
        out("read").path())

应该给你你需要的东西。有一个定义为

代码语言:javascript
复制
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]

它产生

代码语言:javascript
复制
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]]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44110074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档