使用gremlin-python过滤列表的边缘作为属性值

时间:2018-07-05 16:18:55

标签: python gremlin tinkerpop3 amazon-neptune

我将列表存储为图形中某些边的属性值,类似于问题asked here。这个问题的解决方案是用JavaScript给出的,但是我正在寻找一种用Python做同样的事情的方法。

另外,请注意,Amazon Neptune不支持Lambda steps,因此该解决方案不能使用lambda。

1 个答案:

答案 0 :(得分:0)

我不确定这是否仍然是您的问题,但我想知道这是否对您不起作用:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('person').as('a').addE('self').to('a').property('x',[1,2,3]).select('a').addE('self').to('a').property('x',[10,20,30]).iterate()
gremlin> g.E().valueMap(true)
==>[x:[1,2,3],id:3,label:self]
==>[x:[10,20,30],id:4,label:self]
gremlin> g.V().outE('self').filter(local(values('x').unfold().is(2))).valueMap(true)
==>[x:[1,2,3],id:3,label:self]

基本上,您可以对列表属性进行local()展开,然后对其进行过滤。 Neptune可能不会优化此过滤器(例如,使用索引),但是如果您不过滤大量边缘,则可能是一个足够的解决方法(如果可行)。

请注意,我在Groovy中编写了以上内容,以便对其进行轻松测试。在Python中,您必须注意围绕命名冲突的某些较小的语法修改。因此,最后的遍历将在python中这样写(因为is是python中的保留字):

g.V().outE('self').filter(local(values('x').unfold().is_(2))).valueMap(true)