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))
我使用 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))