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

what is the best way to search with multi properties in gremlin

我想要一条从顶点 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)

谁能帮帮我

如果您的 属性 有多个值,那么值步骤将 return 所有值。假设您有两个值,您可以 select 一个或另一个使用 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 

如果您有 2 个以上的值,并且您需要 select 列表或集合中间的一个值,您可以使用 range 步骤来 select 该值。

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())