在gremlin中搜索多属性的最佳方法是什么

时间:2020-06-14 17:21:26

标签: gremlin tinkerpop gremlin-server

我想要一条从顶点A,C,D,E,G,H,

的路径

我对以下代码感到厌倦

 g.V().hasLabel('a').repeat(out().simplePath()).until(hasLabel('h')).
     path().by(values('vehicle','time').fold()) 

我收到的输出

[[10.00,8.30,v1,v2],[10.30,9.00,9.30,v1,v2,v3],[11.00,9.30,10.00,v1,v2,v3],[1
1.30,10.00,10.30,v1,v2,v3],[12.00,11.00,v1,v3],[12.30,11.30,v1,v3]]

预期产量

[a:[10.00,v1],c:[11.00,v1],d:[11.30,v1],e:[12.00,v1],g:[12.30,v1],h:[1.00,v1]],[a:[8.30,v2],c:[9.00,v2],d:[9.30,v2],e:[10.00,v2],g:[11.00,v3],h:[11.30,v3]]

以下是示例图

    v1 = graph.addVertex(id,1,label,'a','vehicle','v1','time',10.00)
    v2 = graph.addVertex(id,2,label,'b','vehicle','v1','time',10.30)
    v3 = graph.addVertex(id,3,label,'c','vehicle','v1','time',11.00)
    v4 = graph.addVertex(id,4,label,'d','vehicle','v1','time',11.30)
    v5 = graph.addVertex(id,5,label,'e','vehicle','v1','time',12.00)
    v7 = graph.addVertex(id,7,label,'g','vehicle','v1','time',12.30)
    v8 = graph.addVertex(id,8,label,'h','vehicle','v1','time',1.00)

    v1.addEdge('traveles',v3)
    v3.addEdge('traveles',v4)
    v4.addEdge('traveles',v5)
    v5.addEdge('traveles',v7)
    v7.addEdge('traveles',v8)

 g.V(1).property(list,'vehicle','v2').property(list,'time',8.30)

  g.V(3).property(list,'vehicle','v2').property(list,'time',9.00).property(list,'vehicle','v3').property(list,'time',9.30)

    g.V(4).property(list,'vehicle','v2').property(list,'time',9.30).property(list,'vehicle','v3').property(list,'time',10.00)

    g.V(5).property(list,'vehicle','v2').property(list,'time',10.00).property(list,'vehicle','v3').property(list,'time',10.30)

    g.V(7).property(list,'vehicle','v3').property(list,'time',11.00)

  g.V(8).property(list,'vehicle','v3').property(list,'time',11.30)

有人可以帮我吗

1 个答案:

答案 0 :(得分:1)

如果您的媒体资源有多个值,则“值”步骤将全部返回。假设您有两个值,则可以使用limittail选择一个或另一个。

gremlin> g.addV('test').property(list,'x',1).property(list,'x',2)
==>v[61316]
gremlin> g.V(61316).values('x')
==>1
==>2
gremlin> g.V(61316).values('x').tail(1)
==>2
gremlin> g.V(61316).values('x').limit(1)
==>1 

如果您有两个以上的值,并且需要从列表中间或设置中选择一个,则可以使用range步骤来选择该值。

gremlin> g.V(61316).property(list,'x',5)
==>v[61316]
gremlin> g.V(61316).values('x')
==>1
==>2
==>5
gremlin> g.V(61316).values('x').range(1,2)
==>2  

所有这些都说明,如果您可以使用一些示例数据来编辑问题,这将有助于给出更好的答案,因为您的数据模型似乎每个属性都有很多值,因此Gremlin可以按照您的要求进行操作。

此外,在您的示例中,您正在按其标签查找顶点,而根本没有测试这些值。您可以像测试单个属性一样测试多属性

gremlin> g.V().has('x',2)
==>v[61316

编辑添加:

使用这些技术,您可以将path语句更改为以下形式:

path().
   by(union(label,
            values('time').limit(1),
            values('vehicle').limit(1)).fold())
相关问题