如何解决如何在没有变量的情况下在 AWS Neptune 中进行复杂的 Gremlin 查询?
我正在使用 Amazon Neptune,其中 does not support 变量。然而,对于复杂的查询,我需要在多个地方使用一个变量。如何在不对相同数据进行两次查询的情况下执行此操作?
这是我要解决的问题:
给定起点 Person
,找到起点 Persons
通过 Person
关系最多连接 3 个步骤的 kNows
。返回每个 Person
的 name
和 email
,以及 distance
(1-3)。
如果没有变量,我将如何在 Gremlin 中编写此查询,因为 Neptune 不支持变量?
解决方法
我看不出有什么理由让您的遍历需要变量,而且您可以通过多种方式获得答案。假设这个图:
g = TinkerGraph.open().traversal()
g.addV('person').property('name','A').property('age',20).as('a').
addV('person').property('name','B').property('age',21).as('b').
addV('person').property('name','C').property('age',22).as('c').
addV('person').property('name','D').property('age',19).as('d').
addV('person').property('name','E').property('age',22).as('e').
addV('person').property('name','F').property('age',24).as('f').
addE('next').from('a').to('b').
addE('next').from('b').to('c').
addE('next').from('b').to('d').
addE('next').from('c').to('e').
addE('next').from('d').to('e').
addE('next').from('e').to('f').iterate()
你可以这样做:
gremlin> g.V().has('person','name','A').
......1> repeat(out().
......2> group('m').
......3> by(loops()).
......4> by(valueMap('name','age').by(unfold()).fold())).
......5> times(3).
......6> cap('m')
==>[0:[[name:B,age:21]],1:[[name:C,age:22],[name:D,age:19]],2:[[name:E,[name:E,age:22]]]
按名称查找特定的“人物”顶点,在本例中为“A”,然后重复遍历 out()
并将您遇到的顶点按 loops()
分组,即您遍历的深度。在这种情况下,我使用 valueMap()
来提取您想要的属性。 times(3)
是搜索深度的限制。最后,您从我们的 cap()
中Map
消除了在“m”中的副作用 group()
。该方法旨在为您提供一些基本结构,以了解如何完成此操作。您或许可以通过这种方式进一步完善它:
gremlin> g.V().has('person','A').
......1> repeat(out().
......2> group('m').
......3> by(loops())).
......4> times(3).
......5> cap('m').unfold().select(values).unfold().
......6> dedup().
......7> valueMap('name','age').by(unfold())
==>[name:B,age:21]
==>[name:C,age:22]
==>[name:D,age:19]
==>[name:E,age:22]
上面的例子,从“m”中的Map
中提取值,用dedup()
去掉重复的值,然后转换成你想要的结果。也许您一开始就不需要 Map
(我只是因为 this answer 而想到它) - 您可以将结果简化为 store()
如下:
gremlin> g.V().has('person','A').
......1> repeat(out().store('m')).
......2> times(3).
......3> cap('m').unfold().
......4> dedup().
......5> valueMap('name',age:22]
您也可以考虑使用 simplePath()
之类的东西来帮助避免一遍又一遍地重新遍历相同的路径。您可以在 Reference Documentation 中阅读有关该步骤的信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。