在单个查询中将所有顶点和边作为地图获取

Get all vertices and edges as a map in a single query

我是 gremlin 的新手,我正在尝试在地图中收集所有顶点和边。这似乎是一个相对简单的操作,但是我正在努力寻找最好的方法。

我通过执行 2 个单独的查询完成了此操作:

{
    "nodes": g.V().valueMap().toList(),
    "edges": g.E().valueMap().toList()
}

是否可以使用单个查询实现上述结果?

谢谢

我不确定您是在什么情况下执行此操作的,但除了最小的图形之外,这种类型的查询将非常昂贵。也就是说,您可以通过多种方式通过单个请求执行此操作:

g.V().
  project('v','edges').
  by(valueMap()).
  by(outE().valueMap().fold())

我想如果您必须绝对必须维护您在评论中的结构,您可以这样做:

g.V().store('vertices').by(valueMap()).
  outE().store('edges').by(valueMap()).
  cap('vertices','edges')

同样,这些类型的遍历不应该轻易执行,因为它们代表了完整的图形扫描。

正如 Stephen 所提到的,这将是对大型图的昂贵查询。但是,我能够使用 Gremlin-Python 和 Neptune 运行 以下 Python 代码,没有任何问题。

mymap = (
g.V().
  project('v','edges').
  by(__.valueMap()).
  by(__.outE().valueMap().fold())).toList()
print(mymap)  

在我增加客户端可以接受的数据量或限制查询结果之前,我无法 运行 其他查询(下方),即使是从 Gremlin 控制台。即使使用我的一个小图表,您的第二个查询也会超出 Gremlin 控制台配置的默认 64K 结果帧大小。那里表明这是一个昂贵的查询!也就是说,为了简单起见,我会使用上面的查询而不是 storecap 形式,但在任何大图中,这通常是一种反模式,因为它有可能return海量数据。至于你的第二个查询的错误,当我添加一个限制步骤时,我能够在控制台上 运行 它,但仍然看到 Python 问题。

# Notice the added limit which allows it to work from the console
g.V().store('vertices').by(__.valueMap()).
        outE().limit(10).store('edges').by(__.valueMap()).
        cap('vertices', 'edges').toList() 

即使使用 limit(10),在使用来自 Python 的查询时,我仍然看到与您相同的错误。 Python 客户端似乎无法处理查询结果。这需要更多的调查。现在您可以只使用查询的 project 版本。