获取顶点的属性及其 child 个顶点的属性 [Gremlin]

Getting properties of a vertex along with the properties of its child vertices [Gremlin]

我正在使用 Gremlin 查询图形数据库,但我无法弄清楚如何检索特定顶点的所有属性以及特定 child 顶点的所有属性。我知道 valueMap() 通常是用于公开节点属性的操作,但我不确定我是否正确使用它。

这是我正在使用的图形的可视化表示。在该图中有 author 个节点,这些节点可以与由 wrote 条边连接的多个 book 节点相关。一个 book 节点可以通过一条 hasChapter 边连接到多个章节节点。 book 节点具有标题和年份作为附加属性,而 chapter 节点具有名称和长度作为附加属性:

生成上图的数据如下:

g.addV('author').property(id, 'author1').as('a1').
  addV('book').
     property(id,'book1').
     property('title', 'Book 1').
     property('year', '1999').
     as('b1').
  addV('book').
     property(id,'book2').
     property('title', 'Book 2').
     property('year', '2000').
     as('b2').
  addV('book').
     property(id,'book3').
     property('title', 'Book 3').
     property('year', '2002').
     as('b3').
  addE('wrote').from('a1').to('b1').
  addE('wrote').from('a1').to('b2').
  addE('wrote').from('a1').to('b3').
  addV('chapter').
     property(id,'b1chapter1').
     property('name', 'The Start').
     property('length', '350').
     as('b1c1').
  addV('chapter').
     property(id,'b1chapter2').
     property('name', 'Trees').
     property('length', '500').
     as('b1c2').
 addV('chapter').
     property(id,'b2chapter1').
     property('name', 'Chapter 1').
     property('length', '425').
     as('b2c1').
 addV('chapter').
     property(id,'b2chapter2').
     property('name', 'Chapter 2').
     property('length', '650').
     as('b2c2').
 addV('chapter').
     property(id,'b2chapter3').
     property('name', 'Chapter 3').
     property('length', '505').
     as('b2c3').
 addE('hasChapter').from('b1').to('b1c1').
 addE('hasChapter').from('b1').to('b1c2').
 addE('hasChapter').from('b2').to('b2c1').
 addE('hasChapter').from('b2').to('b2c2').
 addE('hasChapter').from('b2').to('b2c3').
 iterate()

我想形成一个查询,该查询能够 return author1 撰写的所有书籍的属性,以及每本书章节的所有属性,最好按日期排序(上升)。我想知道是否可以按以下方式进行查询 return 结果(或类似的东西,我可以在客户端解析):

 1 {'year': ['1999'], 'title': ['Book 1'], 'chapters': [{'name': ['The Start'], 'length': ['350']}, {'name': ['Trees'], 'length': ['500']}]}
 2 {'year': ['2000'], 'title': ['Book 2'], 'chapters': [{'name': ['Chapter 1'], 'length': ['425']}, {'name': ['Chapter 2'], 'length': ['650']}, {'name': ['Chapter 3'], 'length': ['505']}]}
 3 {'year': ['2002'], 'title': ['Book 3'], 'chapters': []}

到目前为止,我已经尝试了这个查询的几个变体,但没有成功:

g.V('author1').as('writer')
  .out('wrote').as('written')
  .order().by('year', asc)
  .out('hasChapter').as('chapter')
  .project('written', 'chapter')
  .by(valueMap())

其中 returns:

1   {'written': {'name': ['The Start'], 'length': ['350']}, 'chapter': {'name': ['The Start'], 'length': ['350']}}
2   {'written': {'name': ['Trees'], 'length': ['500']}, 'chapter': {'name': ['Trees'], 'length': ['500']}}
3   {'written': {'name': ['Chapter 1'], 'length': ['425']}, 'chapter': {'name': ['Chapter 1'], 'length': ['425']}}
4   {'written': {'name': ['Chapter 2'], 'length': ['650']}, 'chapter': {'name': ['Chapter 2'], 'length': ['650']}}
5   {'written': {'name': ['Chapter 3'], 'length': ['505']}, 'chapter': {'name': ['Chapter 3'], 'length': ['505']}}

上面的查询只 return 所有有章节的书的章节属性,而我正在寻找一个查询,它会给我 all book属性(不管这本书是否有章节)每本书的所有chapter属性。任何人对跨多个遍历级别使用 valueMap() 有任何建议。理想情况下希望避免对 Graph DB 进行多次查询,但对涉及这样做的解决方案持开放态度。

下面的查询给出了您所需要的结果。 我认为关键是将值投射到 by 调制器中。

gremlin> g.V('author1').
......1>   out('wrote').
......2>   order().by('year', asc).
......3>   project('year', 'title', 'chapters').
......4>     by('year').
......5>     by('title').
......6>     by(out('hasChapter').valueMap().fold())
==>[year:1999,title:Book 1,chapters:[[name:[Trees],length:[500]],[name:[The Start],length:[350]]]]
==>[year:2000,title:Book 2,chapters:[[name:[Chapter 1],length:[425]],[name:[Chapter 2],length:[650]],[name:[Chapter 3],length:[505]]]]
==>[year:2002,title:Book 3,chapters:[]]