【发布时间】:2017-06-29 03:20:18
【问题描述】:
背景:我正在尝试使用 gremlin (tinkerpop v3) 使用 this approach 实现时间序列版本数据库。
我想获取给定身份节点(蓝色)(由包含时间戳范围的“状态”边缘链接)的最新状态节点(红色),但我想返回一个聚合对象,其中包含来自身份节点的 id (cid) 和来自状态节点的所有属性,但我不想明确列出它们。 (8640000000000000 是我表示没有“到”日期的方式 - 即边缘是当前的 - 与显示的图像略有不同)。
我已经走到这一步了:
:> g.V().hasLabel('product').
as('cid').
outE('state').
has('to', 8640000000000000).
inV().
as('name').
as('price').
select('cid', 'name','price').
by('cid').
by('name').
by('price')
=>{cid=1, name="Cheese", price=2.50}
=>{cid=2, name="Ham", price=5.00}
但正如您所见,我必须列出“状态”节点的属性 - 在上面的示例中,产品的名称和价格属性。但这将适用于任何域对象,所以我不想一直列出属性。我可以在此之前运行查询来获取属性,但我认为我不需要运行 2 个查询,并且有 2 次往返的开销。我看过“聚合”、“联合”、“折叠”等,但似乎没有这样做。
有什么想法吗?
====================
编辑: 根据丹尼尔的回答(这并不能完全满足我想要的 ATM),我将使用他的示例图。在“modernGraph”人员创建-> 软件中。如果我跑:
> g.V().hasLabel('person').valueMap()
==>[name:[marko], age:[29]]
==>[name:[vadas], age:[27]]
==>[name:[josh], age:[32]]
==>[name:[peter], age:[35]]
然后结果是具有属性的实体列表。我想要的是,假设一个人只能创建一个软件(尽管希望我们稍后会看到如何为创建的软件列表打开它),将创建的软件“语言”属性包含到返回要获取的实体:
> <run some query here>
==>[name:[marko], age:[29], lang:[java]]
==>[name:[vadas], age:[27], lang:[java]]
==>[name:[josh], age:[32], lang:[java]]
==>[name:[peter], age:[35], lang:[java]]
目前最好的建议如下:
> g.V().hasLabel('person').union(identity(), out("created")).valueMap().unfold().group().by {it.getKey()}.by {it.getValue()}
==>[name:[marko, lop, lop, lop, vadas, josh, ripple, peter], lang:[java, java, java, java], age:[29, 27, 32, 35]]
我希望这更清楚。如果没有,请告诉我。
【问题讨论】:
标签: titan gremlin tinkerpop3