如何使用 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 在一次查询中同时获取节点属性和边名?的主要内容,如果未能解决你的问题,请参考以下文章
如何设置虚拟用户从文件中获取数据并在一次迭代中同时命中 VSTS @ Load Test
如何使用 Gremlin 从我在 Titan 中关注的所有用户(边缘)获取帖子(顶点)