使用间接类型连接顶点

时间:2018-12-09 17:50:01

标签: gremlin tinkerpop tinkerpop3 janusgraph gremlin-server

我想使用gremlin在两个顶点类型之间进行连接

typedef struct {
    float tank_capacity;
    int tank_psi;
    const char *suit_material;
} equipment;

typedef struct scuba {
    const char *name;
    equipment kit;
} diver;

使用type1和type2作为顶点标签时,以下方法有效:

select * from type1 inner join type2 in type2.id = type1.type2_id

但是,我的图形不使用顶点标签来表示类型,而是使用通过“ hasType”边缘连接的另一个顶点。

g.V()
  .hasLabel("type2").as("t2")
  .inE("hasJoin")
  .hasLabel("type1").as("t1")
  .select("t1", "t2")

我需要做一些替换工作

g.V()//
    .addV("instance1").as("instance1")//
    .addV("instance2").as("instance2")//
    .addV("type1").as("type1")//
    .addV("type2").as("type2")//
    .addE("hasType").from("instance1").to("type1")//
    .addE("hasType").from("instance2").to("type2")//
    .addE("hasJoin").from("instance1").to("instance2")//
    .iterate();

使用

hasLabel("type2").as("t2")

这将导致

hasLabel("type2").inE("hasType").outV().as("t2"):

这适用于“ t2”,但不适用于“ t1”,因为.inE(“ hasJoin”)。hasLabel(“ type1”)确实是错误的。我需要使用什么功能来连接“ t1”和“ t2”?

1 个答案:

答案 0 :(得分:2)

您所需要的只是一个检查相邻类型顶点的过滤器。这是您的示例图(您的脚本无法正常工作):

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV("instance1").property("name","instance1").as("instance1").
......1>   addV("instance2").property("name","instance2").as("instance2").
......2>   addV("type1").as("type1").
......3>   addV("type2").as("type2").
......4>   addE("hasType").from("instance1").to("type1").
......5>   addE("hasType").from("instance2").to("type2").
......6>   addE("hasJoin").from("instance1").to("instance2").
......7>   iterate()

您要查找的查询应该是这样的:

gremlin> g.V().hasLabel("type2").in("hasType").as("t2").
           both("hasJoin").
           filter(out("hasType").hasLabel("type1")).as("t1").
           select("t1", "t2").
             by("name")
==>[t1:instance1,t2:instance2]