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")));
所以我有一个图形模式,其中顶点类型 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")));