【问题标题】:can we relate a property with other property of same vertex我们可以将一个属性与同一顶点的其他属性相关联吗
【发布时间】:2020-06-19 07:15:13
【问题描述】:

一个样本顶点

g.addV('a').property('vehicle','v1').property('time',1000).property(list,'vehicle','v2').property(list,'time',830)

我们如何将属性“vehicle”中的值映射到属性“time”中的值。 我厌倦了下面的代码

g.V(1).hasKey('vehicle').map(hasKey('time'))

为了找到我厌倦了遵循代码的路径

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

你能帮帮我吗

【问题讨论】:

  • 我的顶点标记为 A :id,1,vehicle:[v1,v2,v4],time:[1000,800,830],B :id,2,vehicle:[v1,v3], time:[1030,830],C :id,3,vehicle:[v1,v3,v4],time:[1100,930,920],如何沿着 A 到 C 的路径显示直接路径和间接路径 (显示直接和连接车辆) [[A,10.00,v1],[B,10.30,v1],[C,11.00,v1]], [[A,8.00,v2],[B,830,v3],[ C,930,v3]], [[A,830,v4],[C,920,v4]] ,我厌倦了上面提到的以下代码
  • 正如我在您的其他问题之一中提到的,更改数据模型将使查询更易于编写。与其保留值列表(图形数据库可能无法保证的顺序)并尝试将它们本质上压缩在一起,为什么不使用节点和边对车辆和时间进行建模呢?例如:A -- time:10--> Vehicle[vehicleId:V1]
  • 如果您使用在线 Groovy lambda 语法,您可以使用当前数据模型轻松完成您需要的操作,但问题是该查询无法移植到所有图形数据库。有些不允许查询中的行代码。但同样,只有当图形数据库按照您期望的顺序保持列表的值时,这才有效。可能不会。
  • gremlin> g.V().hasLabel('a').map{a=it.get().values('vehicle');b=it.get().values('time ');[a.toList(),b.toList()].transpose()} ==>[[v1,1000],[v2,830]]
  • 您能否提供一个示例图数据模型和该模型的解决方案

标签: gremlin tinkerpop gremlin-server


【解决方案1】:

更改数据模型可使此类查询更易于编写。如果您使用顶点和边来模拟车辆和时间,而不是存储为属性的列表,那么您可以这样做。

g.addV('A').as('a').
  addV('B').as('b').
  addV('C').as('c').
  addV('vehicle').as('v1').property('time',10).property('name','V1').
  addV('vehicle').as('v2').property('time',8).property('name','V2').
  addV('vehicle').as('v3').property('time',5).property('name','V3').
  addV('vehicle').as('v4').property('time',6).property('name','V4').
  addV('vehicle').as('v5').property('time',5).property('name','V5').
  addV('vehicle').as('v6').property('time',6).property('name','V6').
  addE('route').from('a').to('b').
  addE('route').from('b').to('c').
  addE('vehicle_info').from('a').to('v1').
  addE('vehicle_info').from('a').to('v2').
  addE('vehicle_info').from('b').to('v3').
  addE('vehicle_info').from('b').to('v4').
  addE('vehicle_info').from('c').to('v5').
  addE('vehicle_info').from('c').to('v6').
  iterate()

gremlin> g.V().hasLabel('A').
......1>   repeat(out('route').simplePath()).
......2>     until(hasLabel('C')).
......3>   path().
......4>     by(union(label(),out('vehicle_info').values('name','time').fold()).fold())

==>[[A,[V1,10,V2,8]],[B,[V3,5,V4,6]],[C,[V5,5,V6,6]]]  

编辑添加:

您可以按如下时间过滤:

gremlin> g.V().hasLabel('A').
......1>   repeat(out('route').simplePath()).
......2>     until(hasLabel('C')).
......3>   path().
......4>     by(union(label(),out('vehicle_info').has('time',between(5,10)).values('name','time').fold())
.fold()) 
==>[[A,[V2,8]],[B,[V3,5,V4,6]],[C,[V5,5,V6,6]]]  

【讨论】:

  • 我们如何从顶点 'v1' 搜索 730 和 900 之间的车辆
  • 我编辑了答案,以显示适用于我创建的数据的时间的测试。
  • 这里显示5到10之间的所有车辆。只过滤第一个顶点,在其他顶点显示对应路线的车辆
  • 先生,这里的时间在 5 到 10 之间,显示路径中的所有车辆,如果一辆车超出这些时间限制,则不显示,可以应用吗单独获取顶点 A 并显示与上述相同的结果
【解决方案2】:

这可以这样完成:

g.V(18).property('time', __.values('vehicle'))

这将像这样映射列表属性:

gremlin> g.addV('a').property('vehicle','v1').property('time',1000).property(list,'vehicle','v2').property(list,'time',830)
==>v[18]
gremlin> g.V(18).valueMap()
==>[time:[1000,830],vehicle:[v1,v2]]
gremlin> g.V(18).property(list, 'time', __.values('vehicle'))
==>v[18]
gremlin> g.V(18).valueMap()
==>[time:[v1,v1],vehicle:[v1,v2]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多