OpenSearch 資料的 Neptune 資料模型 - Amazon Neptune

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

OpenSearch 資料的 Neptune 資料模型

Amazon Neptune 會使用統一的 JSON 文件結構,在 OpenSearch Service 中儲存 SPARQL 和 Gremlin 資料。OpenSearch 中的每份文件都會對應至一個實體,並儲存該實體的所有相關資訊。對 Gremlin 而言,頂點和邊緣皆視為實體,所以對應的 OpenSearch 文件會包含頂點、標籤和屬性的資訊。對 SPARQL 而言,主體可視為實體,所以對應的 OpenSearch 文件在一份文件中包含所有述詞物件對的資訊。

注意

Neptune 至 OpenSearch 的複寫實作只會儲存字串資料。但可加以修改以儲存其他資料類型。

統一的 JSON 文件結構如下所示。

{ "entity_id": "Vertex Id/Edge Id/Subject URI", "entity_type": [List of Labels/rdf:type object value], "document_type": "vertex/edge/rdf-resource" "predicates": { "Property name or predicate URI": [ { "value": "Property Value or Object Value", "graph": "(Only for Sparql) Named Graph Quad is present" "language": "(Only for Sparql) rdf:langString" }, { "value": "Property Value 2/ Object Value 2", } ] } }
  • entity_id - 代表文件的實體唯一 ID。

    • 對於 SPARQL 而言,這是主體 URI。

    • 對於 Gremlin 而言,這是 Vertex_IDEdge_ID

  • entity_type - 表示頂點或邊緣的一或多個標籤,或為主體的零或多個 rdf:type 述詞值。

  • document_type - 用來指定目前文件代表頂點、邊緣,還是 rdf 資源。

  • predicates - 若為 Gremlin,儲存頂點或邊緣的屬性和值。若為 SPARQL,則儲存述詞物件對。

    屬性名稱會在 OpenSearch 中採用格式 properties.name.value。若要查詢該屬性,則必須採用該形式加以命名。

  • value - Gremlin 的屬性值或 SPARQL 的物件值。

  • graph - SPARQL 的具名圖形。

  • language - SPARQL 中 rdf:langString 常值的語言標籤。

範例 SPARQL OpenSearch 文件

資料

@prefix dt: <http://example.org/datatype#> . @prefix ex: <http://example.org/> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . ex:simone rdf:type ex:Person ex:g1 ex:michael rdf:type ex:Person ex:g1 ex:simone ex:likes "spaghetti" ex:g1 ex:simone ex:knows ex:michael ex:g2 # Not stored in ES ex:simone ex:likes "spaghetti" ex:g2 ex:simone ex:status "La vita è un sogno"@it ex:g2 ex:simone ex:age "40"^^xsd:int DG # Not stored in ES ex:simone ex:dummy "testData"^^dt:newDataType DG ex:simone ex:hates _:bnode # Not stored in ES _:bnode ex:means "coding" DG # Not stored in ES

文件

{ "entity_id": "http://example.org/simone", "entity_type": ["http://example.org/Person"], "document_type": "rdf-resource" "predicates": { "http://example.org/likes": [ { "value": "spaghetti", "graph": "http://example.org/g1" }, { "value": "spaghetti", "graph": "http://example.org/g2" } ] "http://example.org/status": [ { "value": "La vita è un sogno", "language": "it" // Only present for rdf:langString } ] } }
{ "entity_id" : "http://example.org/michael", "entity_type" : ["http://example.org/Person"], "document_type": "rdf-resource" }

範例 Gremlin OpenSearch 文件

資料

# Vertex 1 simone label Person <== Label simone likes "spaghetti" <== Property simone likes "rice" <== Property simone age 40 <== Property # Vertex 2 michael label Person <== Label # Edge 1 simone knows michael <== Edge e1 updated "2019-07-03" <== Edge Property e1 through "company" <== Edge Property e1 since 10 <== Edge Property

文件

{ "entity_id": "simone", "entity_type": ["Person"], "document_type": "vertex", "predicates": { "likes": [ { "value": "spaghetti" }, { "value": "rice" } ] } }
{ "entity_id" : "michael", "entity_type" : ["Person"], "document_type": "vertex" }
{ "entity_id": "e1", "entity_type": ["knows"], "document_type": "edge" "predicates": { "through": [ { "value": "company" } ] } }