如果顶点的边具有属性值,请选择一个顶点,否则请选择具有不同边属性值的另一个顶点

时间:2019-11-06 22:35:35

标签: c# gremlin azure-cosmosdb-gremlinapi

我正在尝试获取将 Request 顶点连接到每个 Card 顶点的顶点。卡与请求的关系是一对多的(每张卡有许多请求)。

如果正在使用卡,则该卡可能与属性为"Status""In Use"的请求连接。每张卡还将通过属性"Status""Future Use""Past Use"连接到许多请求。

我正在尝试创建一个显示每个卡最近使用情况的表。

因此,如果将请求连接到卡的边缘具有属性"Status""In Use",我想返回一个请求。

如果该卡当前未使用,我会寻找最近使用过该卡的请求("Status""Past Use")。

如果从未使用过该卡,我会寻找即将使用该卡的最近请求("Status""Future Use")。

我尝试使用coalesce

.coalesce(
 select('request')
  .outE().hasLabel('AssignedTo}').has('Status', 'In Use'),
 select('request')
  .outE().hasLabel('AssignedTo').has('Status', 'Past Use').order().by('Timestamp', decr).limit(1),
 select('request')
  .outE().hasLabel('AssignedTo').has('Status', 'Future Use').order().by('Timestamp', incr).limit(1)
).as('status')

但这只会返回一条记录(使用中)。另一个版本:

.coalesce(
 select('card')
  .inE().hasLabel('AssignedTo}').has('Status', 'In Use'),
 select('card')
  .inE().hasLabel('AssignedTo').has('Status', 'Past Use').order().by('Timestamp', decr).limit(1),
 select('card')
  .inE().hasLabel('AssignedTo').has('Status', 'Future Use').order().by('Timestamp', incr).limit(1)
).as('status')

这仅返回两条记录(均为使用中)。

我在choose之前尝试过,也无法使其正常工作(不记得发生了什么事)。

预期:

取回具有边为"Status"的边的单个顶点:"In Use"

如果该边不存在,则获取具有边的最新顶点,其属性为"Status""Past Use"

如果没有符合条件的边,请获取具有属性"Status""Future Use"的边的最快的即将到来的顶点。

1 个答案:

答案 0 :(得分:1)

我不确定您的查询出了什么问题,因为您没有完全发布查询,但这应该可以:

g.V().hasLabel("Card").as("c").coalesce(
    outE("assigned").has("status", "In Use"),
    outE("assigned").has("status", "Past Use").order().by("Timestamp", desc).limit(1),
    outE("assigned").has("status", "Future Use").order().by("Timestamp", asc).limit(1),
).as("s").inV().as("r")
.select("c","s","r").by("name").by("status").by("name")