根据边属性选择顶点

时间:2020-04-06 18:44:22

标签: azure gremlin tinkerpop3 azure-cosmosdb-gremlinapi

我的情况很复杂。所以我尝试创建一个示例,如下所示。

g.AddV('class').property('id','1').property('name','class1').AddE('roster').to(g.AddV('student').property('id','11').property('name','student1'))
g.AddV('class').property('id','2').property('name','class2').AddE('roster').to(g.AddV('student').property('id','22').property('name','student2'))
g.AddV('class').property('id','3').property('name','class3').AddE('roster').to(g.AddV('student').property('id','33').property('name','student3'))
g.AddV('class4').property('id','4').property('name','class4').AddE('roster').to(g.V('11'))
g.V('11').AddE('logs').property('class_id','1').to(g.AddV('log').property('id','111').property('name','log1'))    

您可能已经观察到student1属于2类(1类和4类)。 student1log1中写入日志class1。但是如果我运行此查询g.V('111').as('l').in().as('s').in().as('c').project('log','student','class').by(select('l').by('name')).by(select('s').by('name')).by(select('c').by('name'))

它返回重复的数据,如下所示。

[
  {
    "log": "log1",
    "student": "student1",
    "class": "class1"
  },
  {
    "log": "log1",
    "student": "student1",
    "class": "class4"
  }
]

预期的行为是仅返回class1的日志。为此,我在class_id边添加了一个属性logs,但不确定如何应用条件以返回重复数据删除的结果,即返回属于同一类的日志。

非常感谢您对查询的任何帮助。

1 个答案:

答案 0 :(得分:1)

如果要按edge属性过滤学生,可以使用where

g.V().has('name', 'log1').as('l').
  inE().as('e').outV().as('s').
  in().where(eq('e')).by('class_id').as('c').
  project('log', 'student', 'class').
    by(select('l').by('name')).
    by(select('s').
      by('name')).
    by(select('c').by('name'))

请注意,我拆分了第一步in,以便可以使用edge属性

示例: https://gremlify.com/3q