微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在没有变量的情况下在 AWS Neptune 中进行复杂的 Gremlin 查询?

如何解决如何在没有变量的情况下在 AWS Neptune 中进行复杂的 Gremlin 查询?

我正在使用 Amazon Neptune,其中 does not support 变量。然而,对于复杂的查询,我需要在多个地方使用一个变量。如何在不对相同数据进行两次查询的情况下执行此操作?

这是我要解决的问题:

给定起点 Person,找到起点 Persons 通过 Person 关系最多连接 3 个步骤的 kNows。返回每个 Personnameemail,以及 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?