如何从 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
,以便它们在所有平台上保持一致。
使用 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
,以便它们在所有平台上保持一致。