Gremlin - 使用 OR 步骤获取不同类型的连接顶点

Gremlin - Using an OR step to get different types of connected vertices

所以我有一个图形模式,其中顶点类型 A 可以在一对多关系中向内连接到顶点类型 B 或类型 C。我正在尝试编写一个查询来输出任何这些关系(如果它们存在),例如示例输出为:

Type A | Type B | Type C
Sample1A,'', Sample1C
Sample2A, Sample2B, ''
Sample3A, Sample3B, Sample3C
Sample4A, 'Sample4Ba, Sample4Bb', Sample4C

第四个例子是如果A连接到多个B类型。如果 B 和 C 不存在,则不输出任何内容。

到目前为止我有查询:g.V().hasLabel('A').as('A').in('connect').hasLabel('B').as('B').or().in('connect').hasLabel('C').as('C').select('A','B','C')

但此查询仅 returns 没有任何 B 或 C 的 A 顶点。

如果重要,请使用 AWS Neptune。

您的 or() 步骤未返回写入的结果。您可以按如下方式简化查询:

g.V().hasLabel('A').as('A').in('connect').hasLabel(within('B','C').as('B').select('A','B')

这避免了使用 select('A','B','C') 因为只有 'B' 或 'C' 之一会有导致 or() 情况。

这是一个仍然使用 or()

的版本
g.V().hasLabel('A').as('A').in().or(hasLabel('B'),hasLabel('C')).as('B').select('A','B')

正如 kevin 在评论中提到的,您可以在这种情况下使用 .project() 方法。

g.V().hasLabel("A").as("A").project("a","b", "c")
    .by(select("A"))
    .by(choose(in("connect").hasLabel("B").count().is(0), constant("NO_B").value(), in("connect").hasLabel("B")))
    .by(choose(in("connect").hasLabel("C").count().is(0), constant("NO_C").value() , in("connect").hasLabel("C")));