Gremlin Python:选择日期最早的顶点并按字母数字顺序

Gremlin Python: Selecting the vertex with the earliest date and by alphanumeric order

我使用 Neptune 作为我的图形数据库。

我有带 ID (UUID)、标签和日期的顶点。

我可以像这样提取多个顶点的所有属性:

g.V('633378c3-b016-433a-a3ca-c1662982f970').valueMap(True).as_('test1').V('6e5db9a0-2946-4d98-9657-07a3fe825598').valueMap(True).as_('test2').select('test1', 'test2').toList()

[{'test11': {<T.id: 1>: '633378c3-b016-433a-a3ca-c1662982f970', 'Date': [datetime.datetime(2019, 7, 7, 20, 0)], <T.label: 3>: 'sample_id'}, 'test2': {<T.id: 1>: '6e5db9a0-2946-4d98-9657-07a3fe825598', 'Date': [datetime.datetime(2019, 7, 7, 20, 0)], <T.label: 3>: 'sample_id'}}]

但我只想拉取最早日期的顶点,如果两个日期相同,我想按字母数字顺序拉取较早的那个。

如果我尝试

g.V('633378c3-b016-433a-a3ca-c1662982f970').valueMap(True).as_('test1').V('6e5db9a0-2946-4d98-9657-07a3fe825598').valueMap(True).as_('test2').select('test1', 'test2').order().by('Date').toList()

我收到错误:

gremlin_python.driver.protocol.GremlinServerError: 498: {"requestId":"101ab1d2-ced8-4a20-adc9-5deb97e1e801","code":"UnsupportedOperationException","detailedMessage":"java.util.LinkedHashMap cannot be cast to org.apache.tinkerpop.gremlin.structure.Element"}

您收到该错误的原因是因为您试图将 valueMap() 的结果作为 Map 作为图形 Element 作为 by('Date') 语法处理仅适用于 Element。鉴于你想要做什么的描述,我认为你可以将你的遍历简化为:

g.V('633378c3-b016-433a-a3ca-c1662982f970','6e5db9a0-2946-4d98-9657-07a3fe825598'). 
  order().by('Date').by(T.id).
  limit(1).
  valueMap(True).toList()

我假设 "one earlier in alphanumeric order" 你的意思是 UUID,这就是为什么我添加了第二个 by() 调制器 T.id.

如果您想保留两个顶点供以后在遍历中使用,那么您有多种选择。你可以这样做:

g.V('633378c3-b016-433a-a3ca-c1662982f970','6e5db9a0-2946-4d98-9657-07a3fe825598'). 
  order().by('Date').by(T.id).
  fold()

并分别使用 limit(local,1)tail(local) 按位置访问它们。使用相同的方法,您还可以 project() 它们到 Map:

g.V('633378c3-b016-433a-a3ca-c1662982f970','6e5db9a0-2946-4d98-9657-07a3fe825598'). 
  order().by('Date').by(T.id).
  fold().
  project('a','b').
    by(limit(local,1)).
    by(tail(local))