【问题标题】:Best way to limit edges to the same group of verices using Gremlin against Azure Cosmos db graph使用 Gremlin 针对 Azure Cosmos db 图将边限制为同一组顶点的最佳方法
【发布时间】:2019-08-19 20:50:46
【问题描述】:

我需要获取由属性上的特定谓词过滤的顶点,以及它们之间存在的所有边(带有特定标签,也许还有一些关于边属性的谓词)。

这是针对 Cosmos Azure Db 图,解决方案应该是单个 Gremlin 查询。

到目前为止,我正在考虑以下几点:

g.V().has('property1', value1).has('property2', value2).select('vertices')
.outE().as('edges').inV().has('property1', value1).has('property2', value2)
.select('vertices','edges')

有没有更好的方法来实现这一点?

【问题讨论】:

  • 我认为没有真实样本很难回答你。如果这个查询给你你想要的确切结果?您看到的边是否总是连接到具有属性 1 和属性 2 的顶点?也许项目会给你一个更好的结果,但你需要举例说明你想要达到的目标。
  • 它们可能并不总是连接在一起。我想要的是选择所有具有所需属性的顶点,然后查看它们之间是否有特定的边。如果是这样,输出边以及它们连接的顶点。

标签: gremlin azure-cosmosdb-gremlinapi


【解决方案1】:

鉴于描述和您的评论,这种遍历应该适合您:

g.V().has('property1', value1).has('property2', value2).
  aggregate('v').
  outE().                   /* add edge filters here */
  inV().where(within('v')).
  path().
  union(union(limit(local, 1),
              tail (local, 1)).dedup().aggregate('vertices'),
        range(local, 1, 2).aggregate('edges')).
  cap('vertices','edges').next()

【讨论】:

  • 谢谢,这给了我一个很好的使用 inside 的解决方案。但是 path() 不是我需要的输出,我需要一个带有单独顶点数组和单独边数组的 JSON 对象。我可以通过一个查询得到吗?对于单个数组,我想我可以做 outE().as('e').... select('e').valueMap() 但我需要两者。
  • .union(select('e'),select('v')) 几乎是我需要的,但我不能这样做 select('v').valueMap() 所以它仍然没有'不要给我我需要的确切格式。
  • 您想要结果中的所有初始顶点,还是只需要那些实际上至少有 1 个输出边与条件匹配的顶点?
  • 理想情况下只有通过符合条件的边连接的顶点。
  • 好的,那么最简单的做法就是抓取路径(因为它保证符合条件),然后将其拆分为顶点和边。我会在几分钟后更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2023-03-26
  • 1970-01-01
  • 2021-09-14
  • 2019-01-04
  • 1970-01-01
相关资源
最近更新 更多