如何使用 Gremlin 在一次查询中同时获取节点属性和边名?

Posted

技术标签:

【中文标题】如何使用 Gremlin 在一次查询中同时获取节点属性和边名?【英文标题】:How to use Gremlin to get both node properties and edge names in one query? 【发布时间】:2022-01-22 08:23:33 【问题描述】:

我被扔进了 golang / gremlin / Neptune 的池子中,并且能够让一些事情发挥作用。生活是美好的——足够了,但我希望有一个简单的答案(我无法找到)来解决这个看似简单的问题。

我有具有一些属性的“obs”节点,其中两个是 ('type','domain') 和 ('value','whitehouse.com)。

另一组节点是 'attack' ('type','group') 和 ('value','Emotet'),以及其他属性。

一个观察节点可以有一条边指向一个或多个攻击节点。 (实际上,其他类型的节点也是如此。)这些边具有基于时间的属性 - 当观察到的时候显示出某种类型的攻击。

我正在使用 Go,使用 gremson 与 Neptune 数据库进行通信。在这种环境中,您将查询构造为字符串并将其通过线路发送到 Neptune,然后返回名为 graphson 的东西。

因此,我构建了这个,然后发送它......

fmt.Sprintf("g.V().hasLabel('obs').has('value','%s').limit(1)", domain)

我得到了一个向量的属性,在 gremson 中。如果我使用控制台,我能得到的只是 id。去图吧。

然后我构造它,然后发送它......

fmt.Sprintf("g.V().hasLabel('obs').has('value','%s').limit(1).out()", domain)

然后我在 graphson 中取回了连接节点的属性。同样,使用控制台我只会得到 ids。没有汗水。

我想做的是以某种方式组合这两个查询,这样我就不会做看起来像两个几乎相同的查找。

在控制台方面,假设两个查询最后都添加了 valueMap()entityMap()。有没有办法将它们作为一个查询来完成?

【问题讨论】:

【参考方案1】:

您可以通过多种方式编写此查询。这里有几个选项

g.V().hasLabel('obs').
      has('value','%s').
      limit(1).as('a').
      out().as('b').
      select('a','b')

或使用project

g.V().hasLabel('obs').
      has('value','%s').
      limit(1).
      project('a','b').
        by().
        by(out().fold())

我更喜欢project 示例,因为您将在列表中重新获得连接的顶点。

【讨论】:

非常感谢,这给了我一个开始的地方。在控制台中,我得到了一组顶点。我真的需要坐下来花点时间看你的书。 :) 对于project 表单,您应该得到类似a:v1,b:[v2,v3,v4]

以上是关于如何使用 Gremlin 在一次查询中同时获取节点属性和边名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gremlin 中执行分页

如何设置虚拟用户从文件中获取数据并在一次迭代中同时命中 VSTS @ Load Test

如何使用 Gremlin 从我在 Titan 中关注的所有用户(边缘)获取帖子(顶点)

如果 gremlin 中存在边,则获取布尔值

如何使用 Adwords Api 在一次通话中获取每日费用报告

MsSQL如何在一次查询中从给定的日期和仓库号获取最近的未来值和值的总和