Gremlin 小精灵穿越3

Gremlin 小精灵穿越3,gremlin,Gremlin,首先,给定一个节点a,首先我们需要找出所有可以通过“朋友”边到达的节点(a、B、C…所有蓝色节点)。我可以通过使用path()-步骤实现这一点,如下所示: g.V().hasLabel("Person").has("name", "A") .repeat(out("Friend")) .until(out("Friend").count().is(0))

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

 g.V().hasLabel("Person").has("name", "A")
                            .repeat(out("Friend"))
                            .until(out("Friend").count().is(0))
                            .path();
然后我们可以从java代码中的path对象中提取垂直方向

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

我们有没有办法在一次小精灵穿越中做到这一点


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

  • 从A中,找出通过“朋友”边缘连接的所有人。我们通过上面提到的遍历实现了这一点。(有没有更好的方法?例如,直接在gremlin中提取这些节点?)

  • 从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]]
    

    你可以使用联合步骤

    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]]
    

    你期望的输出是什么,只有书?是的,只有书。你期望的输出是什么,只有书?是的,只有书。嗨,潘塔洛妮,有没有办法把书(只有)拿出来?当然有。这里的一切还是关于工会的<代码>g.V().hasLabel(“人”)。有(“姓名”,“A”)。重复(联合(“朋友”),联合(“阅读”)。直到(联合(“朋友”).count().is(0))。联合(“阅读”),hasLabel(“书”)应该工作吗?潘塔洛尼斯,有什么办法可以把书(只)拿出来吗?当然有。这里的一切还是关于工会的
    g.V().hasLabel(“person”).has(“name”,“A”)。重复(union(out(“friend”)),out(“read”))。直到(out(“friend”).count()为(0))。union(out(“read”),hasLabel(“book”)
    应该有效