【问题标题】:Get all vertices and edges as a map in a single query在单个查询中获取所有顶点和边作为地图
【发布时间】:2019-04-08 10:52:47
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: python gremlin amazon-neptune


    【解决方案1】:

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

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

    我无法从 Gremlin 控制台运行其他查询(如下),直到我增加了客户端可以接受的数据量或限制了查询结果。即使使用我的小图,您的第二个查询也会超出 Gremlin 控制台配置的默认 64K 结果帧大小。那里表明这是一个昂贵的查询!也就是说,为了简单起见,我将使用上面的查询而不是 store 和 cap 形式,但在任何大图中,这通常是一种反模式,因为它有可能返回大量数据。至于第二个查询的错误,当我添加限制步骤时,我能够在控制台上运行它,但仍然看到 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 版本的查询。

    【讨论】:

    • 有趣 - 我们确实测试了“非常大”的结果,尽管在注意到有效负载大小的问题后 - github.com/apache/tinkerpop/blob/…
    • 经过更多调查后,我编辑了我的答案。似乎是第二个查询和 Python 的特定反序列化问题。这两个查询都从控制台对我有用。
    • 我认为问题出在here,因为您无法以这种方式从列表中删除重复的字典。我稍微改变了功能,它对我有用。见这里pastebin.com/kvqA9DEj。如果我的方法正确,我可以创建 PR!
    • @stephenmallette 上述解决方案可行吗?
    • 使用set() 的目的是删除重复项,但如果python 不允许这样做,那么我想我们需要一个不同的解决方案。如果您的方法有效,并且这是完成重复数据删除的最有效方法,并且如果测试全部通过,那么我将欢迎 PR。谢谢!
    【解决方案2】:

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

    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')
    

    同样,此类遍历不应轻易执行,因为它们代表完整的图扫描。

    【讨论】:

    • 非常感谢!查询只会在小图上执行!
    • 对于我感兴趣的第二个 sn-p,似乎 gremlin-python 库已损坏,因为它无法反序列化从 AWS Neptune 收到的响应。通过 HTTP 直接向 AWS Neptune 执行 sn-p 是可行的。无论如何,谢谢你的帮助。
    • hmm - 这似乎很奇怪,这不适用于 gremlin-python。您提到这是一个序列化问题,但究竟是什么错误?
    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 2020-04-10
    • 2022-11-25
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多