首页 > 解决方案 > 如何从 gremlin 中不同顶点的属性中获取结果?

问题描述

我有这个数据库:

客户 => 事件 => 文件 => 文件名

客户端有一个传出边缘到事件(报告),事件有一个传出边缘到文件(包含文件),文件有一个传出边缘到文件名(hasName)。

我必须在 gremlin 中执行什么查询才能在一个结果中获取文件名 ID、文件 ID、文件文件大小和事件报告值?

这是一些示例数据:

g.addV('client').property('id','1')
  addV('incident').property('id','11').property('reportedON'2/15/2019 8:01:19 AM')
  addV('file').property('id','100').property('fileSize', '432534')
  addV('fileName').property('id','file.pdf')
  addE('reported').from('1').to('11').
  addE('containsFile').from('11').to('100').
  addE('hasName').from('100').to('file.pdf').iterate()

标签: gremlin

解决方案


您发布的用于创建示例数据的遍历包含许多错误。不要在屁股上痛苦,仔细检查你发布的内容。

无论如何,这是您查询的固定版本:

g.addV('client').property('id','1').as('1').
  addV('incident').property('id','11').property('reportedON', '2/15/2019 8:01:19 AM').as('11').
  addV('file').property('id','100').property('fileSize', '432534').as('100').
  addV('fileName').property('id','file.pdf').as('file.pdf').
  addE('reported').from('1').to('11').
  addE('containsFile').from('11').to('100').
  addE('hasName').from('100').to('file.pdf').iterate()

获取 filename-ID、file-ID、file-fileSize 和 event-reportedOn 值

gremlin> g.V().has('client','id','1').
......1>   out('reported').as('incident').
......2>   out('containsFile').
......3>   out('hasName').
......4>   path().
......5>     from('incident').
......6>     by(union(group().
......7>                by(label).
......8>                by('id'),
......9>              valueMap()).
.....10>     unfold().
.....11>   filter(select(keys).is(neq('id'))).
.....12>   group().
.....13>     by(keys).
.....14>     by(select(values).unfold())).
.....15>   unfold().unfold().
.....16>   group().
.....17>     by(keys).
.....18>     by(select(values).unfold())
==>[fileName:file.pdf,file:100,reportedON:2/15/2019 8:01:19 AM,fileSize:432534,incident:11]

只有path().from('incident').by(valueMap())独处已经可以为您提供所需的一切。但是,我添加了一些重新分组以获得更好的格式化结果。


推荐阅读