【问题标题】:what is the best way to search with multi properties in gremlin在 gremlin 中搜索多个属性的最佳方法是什么
【发布时间】:2020-06-14 17:21:26
【问题描述】:

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

谁能帮帮我

【问题讨论】:

标签: gremlin tinkerpop gremlin-server


【解决方案1】:

如果您的属性有多个值,那么值步骤将全部返回它们。假设您有两个值,您可以使用 limit 或 tail 选择一个或另一个。

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 个值并且需要从列表或集合的中间选择一个,您可以使用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())

【讨论】:

  • 我有多个车辆和时间的财产。我应该如何获得车辆和时间以及上述输出的路径?
  • 正如我在之前的评论中提到的那样,如果您可以分享一些 Gremlin addV 和 addE 步骤,这些步骤可以使您的图表变得有点,这将真正有助于为您提供更准确的答案。当您使用path 步骤时,您可以执行path().by(union(label,values('time').limit(1),values('vehicle').limit(1)).fold()) 之类的操作,我会将其添加到答案中。
  • limit(1) 显示带有 v1 的路径属性,不显示带有其他属性 v2 或 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]]
  • 我试图生成一个反映您问题中非常有限的示例的解决方案。我认为,如果您希望生成反映相同精确图遍历但具有不同值的多条路径,您有两个选择。更改您的数据模型以将列表提升为节点和边 - 或者 - 在每个路径上逐步使用一个项目来投影所有可用的列表值。如前所述,如果您可以共享一个示例图表,这将使更多的答案更容易产生。
  • 我需要从 A 到 H 的路径,以下是顶点及其属性 A:label,a,vehicle:[v1,v2,v4],time:[10.00,8.30,9.00],C :label,c,车辆:[v1,v2,v3],时间:[10.30,9.00,9.30],D:label,d,车辆:[v1,v2,v3],时间:[11.00,9.30,10.00] ,E:label,e,车辆:[v1,v2,v3,v4],时间:[11.30,10.00,10.30,10.00],G:label,g,车辆:[v1,v3,v4],时间:[ 12.00,11.00,10.30],H:label,h,vehicle:[v1,v3,v4],时间:[12.30,11.30,11.00]
猜你喜欢
  • 1970-01-01
  • 2010-12-18
  • 2016-08-21
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2018-06-07
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多