如何从 Amazon Neptune 获得与从 Cosmos DB 获得的结果相同的结果?

How can I get the same results from Amazon Neptune that I do from Cosmos DB?

使用 Gremlin.Net 3.3.2 我从 Neptune 和 Cosmos DB 得到了非常不同的结果。图形数据在两个平台上是相同的。 Cosmos DB 为我提供了所需的一切(顶点 ID、标签和属性)。

当使用 Gremlin.Net 查询 Neptune 时,我只得到顶点 ID 和标签。这是 Neptune 和 Gremlin.net 的错误吗?海王星有问题?

如果在 gremlin 控制台 Neptune returns 中执行查询所有数据,那么问题似乎仅限于 Gremlin.Net。

query = g.V().has('name',within('wind'))

Amazon Neptune results
{
  "Id": "14b15642-842f-888a-a28e-3ed117a07d5b",
  "Label": "keyword"
}

Cosmos DB results
{
  "id": "wind",
  "label": "keyword",
  "type": "vertex",
  "properties": {
    "popularity": [
      {
        "id": "8f9967f1-cead-41d6-a432-de025d9dc14b",
        "value": "16"
      }
    ],
    "name": [
      {
        "id": "fb90af3f-828b-4cc0-b9f8-b571a30c6b14",
        "value": "wind"
      }
    ]
  }
}

Neptune 更符合 TinkerPop 本身提供的预期输出,而 CosmosDB return 是一种较旧的方法。 TinkerPop 推荐 return 或 "references" 来绘制元素(即 id 和标签而不是属性),这似乎是 Neptune 提供的。我不知道 Neptune 是否可以配置为不同的行为。

虽然看起来不太方便,但 TinkerPop 推荐这种方法的原因是用户应该只 return 他们请求的数据。例如,您通常不会对 SQL 查询执行 SELECT * FROM table - 您会在 SELECT 子句中包含您想要 returned 的字段。出于与您在 SQL 中执行此操作相同的原因,您将在 Gremlin 中执行此操作。

此外,return在一个元素上设置所有属性可能会非常昂贵。由于 multi-properties,TinkerPop 很难推荐 return 引用以外的任何内容。如果 Vertex 可以包含数百万个属性,我们最不想看到的是元素默认序列化所有这些属性。

不幸的是,当我们开始定义 IO 格式的道路时,TinkerPop 社区中的大部分想法并不清楚。 OLAP 仍然是一个实验,GLV 不是一个想法,等等,所以 "reference elements as a default" 的想法直到后来的版本才出现。希望有一天我们能让 TinkerPop 4.x 的 IO 更加一致。

获得相同结果的方法是遵循 TinkerPop 的建议并避免 returning 图形元素。最好的方法可能是以某种形式使用 project()valueMap()

g.V().valueMap('popularity','name')
g.V().
  project('popularity','name').
    by('popularity').
    by('name')

请注意,虽然 project() 在示例中有点冗长,但它确实提供了更紧凑的输出,因为它没有像 [=15] 那样将每个键的值嵌入 List =] 确实如此。以上将强制结果为 Map,以便它们在所有平台上保持一致。