1.4 データベース内のRDFデータ

Oracle DatabaseのRDFデータは、1つ以上のRDFネットワークに格納されます。

すべてのトリプルが解析され、表内のエントリとしてシステムに保存されます。これはRDFネットワークであり、各RDFネットワークは通常のデータベース・ユーザー・スキーマの下にあります。{主語、プロパティ、目的語}のトリプルは、1つのデータベース・オブジェクトとして処理されます。そのため、複数のトリプルを含む単一の文書は、複数のデータベース・オブジェクトになります。

トリプルのすべての主語および目的語は、RDFデータ・ネットワークのノードにマップされます。プロパティは、主語を開始ノード、目的語を終了ノードとするネットワーク・リンクにマップされます。使用可能なノード・タイプは、空白ノード、URI、プレーン・リテラルおよび型付きリテラルです。

URIの指定とデータベースへのRDFデータの格納には、次の要件が適用されます。

  • 主語は、URIまたは空白ノードである必要があります。

  • プロパティは、URIである必要があります。

  • 目的語は、URI、空白ノードまたはリテラルのいずれのタイプでもかまいません。(ただし、NULL値およびNULL文字列はサポートされません。)

1.4.1 RDFネットワーク

RDFネットワークは、RDFデータを保持する表およびビューのセットです。RDFネットワークはインストール時に作成されません。データベース・ユーザーは、RDFデータをデータベースに格納する前に、SEM_APIS.CREATE_RDF_NETWORKを明示的にコールしてRDFネットワークを作成する必要があります。

ノート:

RDF Networksは、以前のブック・バージョン(Oracle Databaseリリース23aiより前)でSemantic Networksと呼ばれていました。詳細は、「用語とサブプログラムの変更」を参照してください。

RDFネットワークには、特にRDFトリプルまたはクワッドを格納するためのRDF_LINK$表が含まれます。デフォルトでは、RDF_LINK$表は、RDFトリプルまたはクワッドを格納するユーザー作成コンテナであるRDFグラフのセットにリストされます。

RDF_LINK$表はオプションでリスト-ハッシュ・コンポジット・パーティション化を使用し、各RDFグラフ・パーティションが述語のハッシュによってサブパーティション化されます。コンポジット・パーティション化では、より優れたデータ・セットや問合せオプティマイザ統計を改善することで、大規模なデータ・セットでSPARQL問合せのパフォーマンスを向上させることができます。

RDF_LINK$表はオプションでリスト-リスト・コンポジット・パーティション化を使用し、各RDFグラフ・パーティションがグラフIDによってサブパーティション化されます。サブパーティションは、グラフIDによって自動的に保持されます。この構成は、SPARQL更新(CLEARMOVEDROPまたはCOPY)グラフ操作のパフォーマンスを大幅に向上させるため、クワッド・データにお薦めします。

コンポジット・パーティション化を有効にする方法の詳細は、次を参照してください。

RDF_VALUE$表は、RDF値の内部数値識別子へのマッピングを格納するために使用されます。バージョン21cから、RDF_VALUE$表に格納された値は、エスケープされていない記憶域形式で格納されることがあります。つまり、Unicode文字と特殊文字は、ASCIIエスケープ・シーケンスとして格納されるのではなく、単一の文字として保存されます(ASCIIエスケープ・シーケンス'\u00F1'ではなく、単一文字'ñ'など)。このエスケープされていない記憶域形式を使用すると、記憶域コストが削減され、問合せのパフォーマンスが向上します。

ネットワークの記憶域形式は、ネットワークの作成時にSEM_APIS.CREATE_RDF_NETWORKプロシージャのoptionsパラメータで指定できます。バージョン21c以降では、エスケープされていない記憶域形式がデフォルトです。既存のRDFネットワークは、SEM_APIS.MIGRATE_DATA_TO_STORAGE_V2プロシージャを使用して移行できます。既存のアプリケーションは、ネットワーク記憶域形式の変更の影響を受けないようになっています。

Oracle Database 23ai以降では、RDF_VALUE$表に格納されるVARCHAR値の最大サイズについて、次の2つのオプションがあります:

  • 4000バイト: これはデフォルトの最大サイズです。
  • 32767バイト: データベースで拡張VARCHARが有効になっている場合(拡張データ型を参照)、デフォルトの最大サイズは、オプションで32767バイトに拡張できます。

RDF値は、この最大サイズである4Kまたは32K以下の場合はVARCHARとして格納され、それより大きい場合はCLOBとして格納されます。32Kの最大VARCHARサイズを使用すると、CLOBとして格納される値が少なくなり、大きいRDF値の問合せ、DMLおよびバルク・ロードのパフォーマンスが向上します。

ネットワークの最大VARCHARサイズは、ネットワーク作成時にSEM_APIS.CREATE_RDF_NETWORKプロシージャのoptionsパラメータで指定できます。

  • NETWORK_MAX_STRING_SIZE=STANDARD: 最大サイズとして4000バイトを指定します。これがデフォルトです。
  • NETWORK_MAX_STRING_SIZE=EXTENDED: 最大サイズとして32767バイトを指定します。

RDFネットワークのNETWORK_MAX_STRING_SIZE設定は、ネットワークのRDF_PARAMETER表に記録されます。

1つ以上のRDFネットワークが、通常のデータベース・ユーザー・スキーマによって作成および所有できます。このようなネットワークはそれぞれ、スキーマプライベートRDFネットワークと呼ばれます。このようなネットワークを、単一のデータベースまたはプラガブル・データベースに保持できます。

ノート:

Oracle Databaseリリース23ai以降、MDSYS所有のRDFネットワークは非推奨になりました。スキーマ・プライベートRDFネットワークを作成することをお薦めします。

既存のMDSYS所有のRDFネットワークは、SEM_APIS.MOVE_RDF_NETWORK_DATAおよびSEM_APIS.APPEND_RDF_NETWORK_DATAプロシージャを使用して、共有スキーマプライベートRDFネットワークに移行できます。また、詳細は、「RDFネットワークの移動、リストアおよび追加」を参照してください。

1.4.1.1 スキーマプライベートRDFネットワーク

スキーマプライベートRDFネットワークでは、関連付けられたデータベース・オブジェクトがネットワーク所有者のスキーマ内に作成され、ネットワーク所有者がそれらのオブジェクトに対する排他的な権限を持ちます。(DBAユーザーにはそのような権限もあり、ネットワーク所有者またはDBAは他のユーザーの権限を付与および取り消すことができます)。

スキーマプライベートRDFネットワークには、次のような利点があります。

  • 複数のユーザーが表および索引を共有しないため、セキュリティと分離が向上します。

    ネットワーク所有者のスキーマには、すべてのRDFネットワーク・データベース・オブジェクトが含まれ、ネットワーク所有者はデフォルトでそれらのオブジェクトに対する排他的な権限を持ちます。

    スキーマプライベートRDFネットワークは、データベース・オブジェクトが複数のデータベース・ユーザー間でデフォルトでは共有されないため、より優れた分離を提供します。ただし、適切な権限を付与した後、ネットワーク所有者は自分のスキーマプライベートRDFネットワークと他のユーザーを共有できます。

  • 通常のユーザーは、自身のネットワークにおいて、索引の作成やネットワーク全体の統計収集などの管理操作を実行できます。

    ネットワーク所有者は、DBA権限を必要とすることなくネットワーク上で管理操作を実行できます。

    1つのデータベース、PDBまたはそれ以上のスキーマに共存する複数のスキーマプライベートRDFネットワークが共存し、RDFデータの様々なセットに対してカスタム・データ型索引付けスキームを使用できます。たとえば、NETWORK1には空間データ型索引のみを含めることができますが、NETWORK2にはテキスト・データ型索引しかありません。

ほとんどのSEM_APISパッケージ・サブプログラムには、スキーマプライベートRDFネットワークをサポートするためのnetwork_ownerおよびnetwork_nameパラメータが追加されました。スキーマプライベートRDFネットワークは、ネットワーク所有者とネットワーク名の2要素の組合せで識別されます。ネットワーク名は、ネットワークを作成したSEM_APIS.CREATE_SEM_NETWORKコールの最後の2つのパラメータで指定されます。

次の表に、network_ownerおよびnetwork_nameパラメータの使用方法を、それを含むサブプログラムで示します。

表1-2 network_ownerおよびnetwork_nameのパラメータ

パラメータ名 説明
network_owner ネットワークを所有するスキーマの名前。

ネットワーク所有者は、通常のデータベース・ユーザーを指定するNULL以外の値である必要があります。

network_name ネットワーク名です。
  • ネットワーク名はNULL以外の値である必要があります。
  • ネットワーク名は、ネットワーク所有者のスキーマ内で一意である必要があります。たとえば、スキーマSCOTTはNET1という名前の2つのネットワークを持つことはできませんが、スキーマSCOTTとANNAはそれぞれNET1という名前のネットワークを持つことができます。

1.4.1.2 RDFネットワーク・ユーザーのタイプ

次の3つの主要なタイプのRDFネットワーク・ユーザーがサポートされています。

  • ネットワーク作成者: SEM_APIS.CREATE_RDF_NETWORKを起動するユーザーです。ネットワーク作成者は、DBA権限を持つデータベース・ユーザーか、ネットワーク所有者と同じユーザーです。
  • ネットワーク所有者: RDFネットワークを構成する表、トリガーおよびビューを保持するスキーマを持つユーザーです。
  • ネットワーク・ユーザー: RDFネットワーク上で操作を実行するデータベース・ユーザーです。

    このマニュアルの多くの例で、RDFUSERという名前がサンプル・ネットワーク・ユーザー名として指定されています。その名前文字列について特別なことはありません。SCOTTANNAMARKETINGなど任意のデータベース・ユーザーの名前を使用できます。

    ネットワーク所有者は、最初はネットワーク・ユーザーのみです。(ただし、他のデータベース・ユーザーにネットワークに対する権限を付与して、追加の潜在的ネットワーク・ユーザーにすることができます。)

1.4.1.3 RDFネットワーク・オブジェクトの命名規則

RDFネットワーク・データベース・オブジェクトは、特定の命名規則に従います。

スキーマプライベート・ネットワーク内のすべてのRDFネットワーク・データベース・オブジェクトに、接頭辞としてNETWORK_NAME#が付いています(たとえばUSER3.MYNET#SEM_MODEL$)。このマニュアルでは、接頭辞の後のデータベース・オブジェクト名の一部を使用して、オブジェクトを参照します。つまり、SEM_MODEL$は、スキーマプライベートRDFネットワークではNETWORK_OWNER.NETWORK_NAME#SEM_MODEL$を指します。

1.4.1.4 RDFネットワークのRDF_PARAMETER表

MDSYS.RDF_PARAMETER表は、データベース全体のRDFグラフのインストール情報を保持します。この表はインストール時に作成され、常に存在します。

スキーマプライベートRDFネットワークでは、NETWORK_NAME#RDF_PARAMETER表にネットワーク固有の情報(ネットワーク圧縮設定や、スキーマプライベート・ネットワークで使用されるRDFCTXまたはRDFOLSポリシーなど)が保持されます。

スキーマプライベートのNETWORK_NAME#RDF_PARAMETER表は、NETWORK_NAME RDFネットワークの存在に依存します。この表は、スキーマプライベートRDFネットワークの作成時に作成され、スキーマプライベート・ネットワークが削除されるときに削除されます。

1.4.1.5 MDSYSからスキーマプライベートRDFネットワークへの移行

既存のMDSYS所有のRDFネットワークは、SEM_APIS.MOVE_RDF_NETWORK_DATAおよびSEM_APIS.APPEND_RDF_NETWORK_DATAプロシージャを使用して、共有スキーマプライベートRDFネットワークに移行できます。詳細は、MDSYS所有ネットワークのスキーマプライベート・ネットワークへの移行を参照してください。

1.4.1.6 スキーマ-プライベートRDFネットワークの共有

スキーマプライベート・ネットワークの作成後、必要に応じて共有できます。つまり、ネットワーク所有者以外の他のデータベース・ユーザーが使用できるようにできます。その他のユーザーは、次のいずれかのアクセス機能を持つことができます。

  • RDFデータへの読取り専用アクセス。これにより、ネットワーク内のRDFデータを問い合せることができるようになります。
    RDFネットワークへの読取り専用アクセス権または問合せ専用アクセス権の付与は、次の方法で行うことができます。
    1. OPTIONSパラメータにQUERY_ONLY=Tを指定して単一のコマンドSEM_APIS.GRANT_NETWORK_ACCESS_PRIVSを使用してネットワーク所有者。
    2. SEM_APIS.GRANT_RDF_GRAPH_ACCESS_PRIVSをネットワーク内の個々のRDFグラフに対してQUERYSELECTなどの適切な権限とともに使用して、ネットワーク所有者またはRDFグラフ所有者。

    詳細は、例1-1を参照してください。

  • RDFグラフおよび推論グラフの作成、変更または削除、およびRDFデータの読取り、挿入、変更または削除など、ネットワーク内のRDFオブジェクトおよびデータに対する読取り/書込みアクセス権。

    読取りアクセス権と書込みアクセス権の両方を付与するステップの論理的順序は、次のとおりです。

    1. DBAが、ネットワーク所有者にネットワーク共有権限を付与する必要があります。これは、指定されたネットワーク所有者に対して1回のみ実行する必要があります。ただし、Oracle Databaseバージョン23.4を使用している場合は、このステップをスキップできます。
    2. ネットワーク所有者は、共有のための特定のネットワークを有効にする必要があります。これは、指定されたネットワークに対して1回のみ実行する必要があります。
    3. ネットワーク所有者は、ネットワークへのアクセスを許可されるユーザーにネットワーク・アクセス権限を付与する必要があります。

      これらの各付与は、その後、必要に応じて取り消すことができます。

    詳細は、例1-2を参照してください。

ノート:

ネットワークに対して前述のアクセス機能を持つユーザーは、ネットワークのディクショナリ表およびメタデータ表にのみアクセスできます。ネットワーク所有者または個々のRDfグラフの所有者がSEM_APIS.REVOKE_RDF_GRAPH_ACCESS_PRIVまたはSEM_APIS.GRANT_RDF_GRAPH_ACCESS_PRIVSサブプログラムを使用して、ネットワーク内の個々のRDFグラフまたは推論グラフに適切な権限をユーザーに付与しないかぎり、ユーザーが所有していないRDFグラフおよび推論グラフにはアクセスできません。

例1-1 ネットワークの共有と別のユーザーへの問合せ専用権限の付与

次の例では、ユーザーRDFUSERが所有するNET1というネットワークを共有しています。RDFUSERは、NET1に対する問合せ専用アクセス権をユーザーRDFQに付与します。

-- As RDFUSER, create a schema-private network owned by RDFUSER named NET1
CONNECT rdfuser/<password>;
EXECUTE SEM_APIS.CREATE_RDF_NETWORK('RDFTBS',network_owner=>'RDFUSER',network_name=>'NET1');

-- As RDFUSER, grant query only network access privilege for NET1 to RDFQ
EXECUTE SEM_APIS.GRANT_NETWORK_ACCESS_PRIVS(network_owner=>'RDFUSER',network_name=>'NET1',network_user=>'RDFQ', options=>' QUERY_ONLY=T ');

-- As RDFUSER, create an RDF graph M1 in network NET1
EXECUTE SEM_APIS.CREATE_RDF_GRAPH('M1',null,null,network_owner=>'RDFUSER',network_name=>'NET1');

-- Check metadata
SELECT *
FROM rdfuser.net1#sem_model$;

-- Insert some data
INSERT INTO rdfuser.net1#rdft_m1(triple)
VALUES (SDO_RDF_TRIPLE_S('M1','<urn:person1>','<urn:name>','"Peter"','RDFUSER','NET1'));
COMMIT;

-- Allow RDFQ to select and query an RDF graph that RDFUSER owns
EXECUTE SEM_APIS.GRANT_RDF_GRAPH_ACCESS_PRIVS('M1','RDFQ',sys.odcivarchar2list('SELECT','QUERY'),network_owner=>'RDFUSER',network_name=>'NET1');

-- As RDFQ, verify that RDF graph M1 is visible for querying
CONNECT rdfq/<password>;
SELECT * 
FROM rdfuser.net1#rdf_model$ 
WHERE model_name='M1';

-- Query with SEM_MATCH
SELECT s$rdfterm, p$rdfterm, o$rdfterm
FROM TABLE(SEM_MATCH(
'SELECT ?s ?p ?o
 WHERE { ?s ?p ?o }'
,SEM_MODELS('M1')
,null,null,null,null
,' PLUS_RDFT=VC '
,null,null
,'RDFUSER','NET1'));

例1-2 ネットワークの共有と別のユーザーへの読取りおよび書込み権限の付与

次の例では、ユーザーRDFUSERが所有するNET1という名前のネットワークをユーザーRDFUSER2と共有しています。また、RDFUSERは、NET1に対する問合せ専用アクセス権をユーザーRDFUSER3に付与します。

-- As RDFUSER, create a schema-private network owned by RDFUSER named NET1
CONNECT rdfuser/<password>;
EXECUTE SEM_APIS.CREATE_RDF_NETWORK('RDFTBS',network_owner=>'RDFUSER',network_name=>'NET1');

-- As RDFUSER, enable sharing for NET1
CONNECT rdfuser/<password>;
EXECUTE SEM_APIS.ENABLE_NETWORK_SHARING(network_owner=>'RDFUSER',network_name=>'NET1');

-- As RDFUSER, grant network access privileges for NET1 to RDFUSER2
EXECUTE SEM_APIS.GRANT_NETWORK_ACCESS_PRIVS(network_owner=>'RDFUSER',network_name=>'NET1',network_user=>'RDFUSER2');

-- As RDFUSER2, create a RDF graph M2 in network NET1
CONNECT rdfuser2/<password>;
EXECUTE SEM_APIS.CREATE_RDF_GRAPH('M2',null,null,network_owner=>'RDFUSER',network_name=>'NET1');

-- Check metadata
SELECT *
FROM rdfuser.net1#sem_model$;

-- Insert some data
INSERT INTO rdfuser.net1#rdft_m2(triple)
VALUES (SDO_RDF_TRIPLE_S('M2','<urn:person1>','<urn:name>','"John"','RDFUSER','NET1'));
COMMIT;

-- Query with SEM_MATCH
SELECT s$rdfterm, p$rdfterm, o$rdfterm
FROM TABLE(SEM_MATCH(
'SELECT ?s ?p ?o
 WHERE { ?s ?p ?o }'
,SEM_MODELS('M2')
,null,null,null,null
,' PLUS_RDFT=VC '
,null,null
,'RDFUSER','NET1'));

-- As RDFUSER, grant query only network access privileges for NET1 to RDFUSER3
CONNECT rdfuser/<password>
EXECUTE SEM_APIS.GRANT_NETWORK_ACCESS_PRIVS(network_owner=>'RDFUSER',network_name=>'NET1',network_user=>'RDFUSER3', options=>' QUERY_ONLY=T ');

-- As RDFUSER2, allow RDFUSER3 to select and query an RDF graph that RDFUSER2 owns
CONNECT rdfuser2/<password>
EXECUTE SEM_APIS.GRANT_RDF_GRAPH_ACCESS_PRIVS('M2','RDFUSER3',sys.odcivarchar2list('SELECT','QUERY'),network_owner=>'RDFUSER',network_name=>'NET1');

-- As RDFUSER3, verify that RDF graph M2 is visible for querying
CONNECT rdfuser3/<password>
SELECT * 
FROM rdfuser.net1#rdf_model$ 
WHERE model_name='M2';

-- Query with SEM_MATCH
SELECT s$rdfterm, p$rdfterm, o$rdfterm
FROM TABLE(SEM_MATCH(
'SELECT ?s ?p ?o
 WHERE { ?s ?p ?o }'
,SEM_MODELS('M2')
,null,null,null,null
,' PLUS_RDFT=VC '
,null,null
,'RDFUSER','NET1'));

1.4.1.7 エスケープされた記憶域からエスケープされていない記憶域形式への移行

SEM_APIS.MIGRATE_DATA_TO_STORAGE_V2プロシージャを使用して、既存のRDFネットワークをエスケープされた記憶域形式からエスケープされていない記憶域形式に移行できます。このプロシージャは、DBAまたはネットワーク所有者がコールする必要があります。

逆方向の移行はできないことに注意してください。つまり、RDFネットワークをエスケープされていない記憶域形式からエスケープされた記憶域形式に移行することはできません。

1.4.2 RDFグラフ

RDFグラフは、RDFトリプルまたはクワッドを格納するためのユーザー作成コンテナです。RDFネットワークには、0個以上のRDFグラフが含まれます。SEM_APIS.CREATE_RDF_GRAPHプロシージャを使用して、RDFグラフを作成できます。各グラフは、ネットワークのRDF_LINK$表にパーティションとして物理的に格納されます。各グラフは対応するRDF_LINK$パーティションに加えて、他の2つのデータベース・オブジェクトに関連付けられます。

ノート:

RDFグラフは、以前のブック・バージョン(Oracle Databaseリリース23aiより前)ではセマンティック・モデルと呼ばれていました。詳細は、「用語とサブプログラムの変更」を参照してください。

schema-private RDFネットワークでは、各グラフは、(1)グラフのRDF_LINK$パーティションのSEMM_<rdf_graph_name>ビュー、および(2)グラフのRDFT_<rdf_graph_name>アプリケーション・ビューに関連付けられます。

アプリケーション・ビューはネットワーク所有者のスキーマ内に自動的に作成され、SDO_RDF_TRIPLE_S型のTRIPLEという列が1つ含まれます。これは、関連するRDFグラフでSQL DMLを実行するために使用できる更新可能なビューです。グラフ所有者には、RDFT_<rdf_graph_name>に対するSELECT、INSERT、UPDATEおよびDELETE権限WITH GRANT OPTIONが付与されます。

SEM_APIS.TRUNCATE_RDF_GRAPHを使用してグラフを切り捨てることができます。

SEM_MODEL$ビューには、RDFネットワークに定義されているすべてのRDFグラフに関する情報が含まれます。SEM_APIS.CREATE_RDF_GRAPHプロシージャを使用してグラフを作成する場合、グラフの名前、およびRDFデータへの参照を保持する表と列を指定し、グラフIDが自動的に生成されます。

Oracleでは、グラフの作成時およびドロップ時にSEM_MODEL$ビューが自動的に管理されます。ユーザーがこのビューを直接変更することはできません。たとえば、このビューでSQLのINSERT、UPDATEまたはDELETE文を使用することはできません。

SEM_MODEL$ビューには、表1-3に示す列が含まれます。

表1-3 SEM_MODEL$ビューの列

列名 データ型 説明

OWNER

VARCHAR2(30)

RDFグラフの所有者のスキーマ。

MODEL_ID

NUMBER

一意のモデルID番号(自動生成)。

MODEL_NAME

VARCHAR2(25)

RDFグラフの名前。

TABLE_NAME

VARCHAR2(30)

この値は、スキーマプライベート・ネットワークの場合はNULLになります。

COLUMN_NAME

VARCHAR2(30)

この値は、スキーマプライベート・ネットワークの場合はNULLになります。

MODEL_TABLESPACE_NAME

VARCHAR2(30)

このRDFグラフのトリプルの格納に使用する表領域の名前。

MODEL_TYPE

VARCHAR2(40)

グラフのタイプを示す値。通常のRDFグラフの場合はM、RDFグラフ・コレクションの場合はV、セマンティク索引の内容を格納するために作成されたRDFグラフの場合はX、リレーショナル・データで作成されたRDFグラフの場合はDです。

INMEMORY

VARCHAR2(1)

iがOracle Database In-Memory RDFグラフ・コレクションであるかどうかを示す文字列値。インメモリーの場合はT、インメモリーでない場合はF

RDFグラフを作成すると、そのグラフに関連付けられたトリプルのビューもネットワーク所有者のスキーマの下に作成されます。このビューは、SEMM_<rdf_graph_name>という形式の名前を持ち、グラフの所有者および適切な権限を持つユーザーにのみ表示されます。各SEMM_<rdf_graph_name>ビューには、ネットワークにリンクとして格納されたトリプルごとに行が1つ含まれています。表1-4に、このビューの列を示します。

表1-4 SEMM_<rdf_graph_name>ビューの列

列名 データ型 説明

P_VALUE_ID

NUMBER

トリプルの述語のテキスト値に対応するVALUE_ID。主キーの一部です。

START_NODE_ID

NUMBER

トリプルの主語のテキスト値に対応するVALUE_ID。主キーの一部です。

CANON_END_NODE_ID

NUMBER

トリプルの目的語の正規形のテキスト値に対応するVALUE_ID。主キーの一部です。

END_NODE_ID

NUMBER

トリプルの目的語のテキスト値に対応するVALUE_ID

MODEL_ID

NUMBER

トリプルが属するRDFグラフに対応するID。

COST

NUMBER

(今後使用予定)

CTXT1

NUMBER

(予約済の列。ファイングレイン・アクセス制御に使用可能)

CTXT2

VARCHAR2(4000)

(今後使用予定)

DISTANCE

NUMBER

(今後使用予定)

EXPLAIN

VARCHAR2(4000)

(今後使用予定)

PATH

VARCHAR2(4000)

(今後使用予定)

G_ID

NUMBER

トリプルのグラフ名のテキスト値に対応するVALUE_ID。Nullはデフォルト・グラフを示します(「名前付きグラフ」を参照)。

LINK_ID

VARCHAR2(71)

一意のトリプル識別子の値。(現在は計算結果列ですが、将来のリリースでは定義が変更される可能性があります。)

ノート:

表1-4の列P_VALUE_ID、START_NODE_ID、END_NODE_ID、CANON_END_NODE_IDおよびG_IDでは、実際のID値は対応する字句の値から計算されます。ただし、ある字句の値が常に同じID値にマップされるとはかぎりません。

1.4.3

RDF_VALUE$表には、RDF文を表すために使用される主語、プロパティおよび目的語に関する情報が含まれます。この表には、これらの情報の3要素に対応するテキスト値(URIまたはリテラル)が、各トリプルの要素ごとに用意された個別の行を使用して一意に格納されます。

Oracleでは、RDF_VALUE$表が自動的に管理されます。ユーザーがこのビューを直接変更することはできません。たとえば、このビューでSQLのINSERT、UPDATEまたはDELETE文を使用することはできません。

表1-5に、RDF_VALUE$表の列を示します。

表1-5 RDF_VALUE$表の列

列名 データ型 説明

VALUE_ID

NUMBER

一意の値ID番号(自動生成)。

VALUE_TYPE

VARCHAR2(10)

VALUE_NAME列に格納されたテキスト情報のタイプ。使用される値は、UR(URI)、BN(空白ノード)、PL(プレーン・リテラル)、PL@(言語タグ付きのプレーン・リテラル)、PLL(プレーン・ロング・リテラル)、PLL@(言語タグ付きのプレーン・ロング・リテラル)、TL(型付きリテラル)またはTLL(型付きロング・リテラル)です。ロング・リテラルは、4000バイトを超えるリテラルです。

VNAME_PREFIX

VARCHAR2(NETWORK_MAX_STRING_SIZE)

字句値の長さがNETWORK_MAX_STRING_SIZEのバイト数以下の場合は、この列に、字句値の一部である接頭辞が格納されます。接頭辞の計算には、SEM_APIS.VALUE_NAME_PREFIXファンクションを使用できます。たとえば、山カッコを除く字句値<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>の一部である接頭辞は、http://www.w3.org/1999/02/22-rdf-syntax-ns#です。

VNAME_SUFFIX

VARCHAR2(512)

字句値の長さがNETWORK_MAX_STRING_SIZEのバイト数以下の場合は、この列に、字句値の一部である接尾辞が格納されます。接尾辞の計算には、SEM_APIS.VALUE_NAME_SUFFIXファンクションを使用できます。VNAME_PREFIX列の説明で示されている字句値の場合、接尾辞はtypeです。

LITERAL_TYPE

VARCHAR2(4000)

型付きリテラルの場合は型情報、それ以外の場合はNULL。たとえば、1999-08-16という作成日を示す行の場合、VALUE_TYPE列にはTLが格納され、LITERAL_TYPE列にはhttp://www.w3.org/2001/XMLSchema#dateが格納されます。

LANGUAGE_TYPE

VARCHAR2(80)

言語タグ付きのリテラル(つまり、VALUE_TYPEがPL@またはPLL@の場合)の言語タグ(フランス語の場合のfrなど)。それ以外の場合、この列はNULL値です。

CANON_ID

NUMBER

現在の字句の値に対応する正規形の字句の値のID。(この列の使用は将来のリリースで変更される可能性があります。)

COLLISION_EXT

VARCHAR2(64)

字句の値の衝突処理に使用されます。(この列の使用は将来のリリースで変更される可能性があります。)

CANON_COLLISION_EXT

VARCHAR2(64)

正規形の字句の値の衝突処理に使用されます。(この列の使用は将来のリリースで変更される可能性があります。)

ORDER_TYPE

NUMBER

データ型に基づくオーダーを表します。ORDER BY問合せのパフォーマンスを向上させるために使用します。

ORDER_NUM

NUMBER

数の型に対するオーダーを表します。ORDER BY問合せのパフォーマンスを向上させるために使用します。

ORDER_DATE

TIMESTAMPWITHTIMEZONE

日付の型に基づいたオーダーを表します。ORDER BY問合せのパフォーマンスを向上させるために使用します。

LONG_VALUE

CLOB

字句値の長さがNETWORK_MAX_STRING_SIZEのバイト数を超えている場合の文字列。それ以外の場合、この列はNULL値です。

GEOM

SDO_GEOMETRY

空間索引が定義されている場合はジオメトリ値。

VALUE_NAME

VARCHAR2(NETWORK_MAX_STRING_SIZE)

これは計算結果列です。字句値の長さがNETWORK_MAX_STRING_SIZEのバイト数以下の場合、この列の値は、VNAME_PREFIX列とVNAME_SUFFIX列の値を連結したものになります。

1.4.3.1 トリプルの一意性とリテラルのデータ型

重複するトリプルはRDFネットワークに格納されません。あるトリプルが既存のトリプルと重複していないかどうかをチェックするため、新規トリプルの主語、プロパティおよび目的語は、指定したRDFグラフのトリプル値と照合されます。新規の主語、プロパティおよび目的語がすべてURIの場合、それらの値が完全に一致した場合に重複であると判定されます。ただし、新規トリプルの目的語がリテラルの場合、主語とプロパティが完全に一致し、目的語の値が(正規化したときに)一致した場合に重複であると判定されます。たとえば、次の2つのトリプルは重複しています。

<eg:a> <eg:b> <"123"^^http://www.w3.org/2001/XMLSchema#int>
<eg:a> <eg:b> <"123"^^http://www.w3.org/2001/XMLSchema#unsignedByte>

2番目のトリプルは、1番目のトリプルの重複と判定されます。"123"^^<http://www.w3.org/2001/XMLSchema#int>には、(正規化したときに"123"^^<http://www.w3.org/2001/XMLSchema#unsignedByte>と等価の値が含まれるためです。2つのエンティティを同じ値に簡略化できる場合、それらのエンティティは正規化後に等価となります。

RDF以外の例をあげると、A*(B-C)A*B-C*A(B-C)*Aおよび-A*C+A*Bは、すべて同じ正規形に変換されます。

ノート:

重複したトリプルとクワッドはRDFM_<rdf_graph_name>ビューの基礎となる表パーティションには格納されませんが、重複した行がアプリケーション表に含まれることはあります。たとえば、トリプルがアプリケーション表に複数回挿入された場合、RDFM_<rdf_graph_name>ビューには1つしか表示されませんが、アプリケーション表内では複数行を占めます。

字句形式の値ベースの一致は、次のデータ型でサポートされます。

  • STRING: プレーン・リテラル、xsd:stringとその一部のXMLスキーマ・サブタイプ

  • NUMERIC: xsd:decimalとそのXMLスキーマ・サブタイプ、xsd:floatおよびxsd:double。(float/double INF、-INFおよびNaN値はサポートされません。)

  • DATETIME: タイムゾーンのサポート付きのxsd:datetime。(タイムゾーンなしの場合も、単一値に対して"2004-02-18T15:12:54""2004-02-18T15:12:54.0000"などの複数の表現が存在します。)

  • DATE: タイムゾーン付きまたはタイムゾーンなしのxsd:date

  • OTHER: その他すべて。(異なる表現を一致する試みは行われません。)

xsd:time型とxsd:dateTime型のリテラルにタイムゾーンが存在する場合、正規化が実行されます。

次の名前空間定義にはxmlns:xsd="http://www.w3.org/2001/XMLSchema"が使用されます。

RDF_VALUE$表で最初に出現するロング・リテラルは、正規形として扱われ、それぞれCPLLCPLL@またはCTLLというVALUE_TYPE値が適切に割り当てられます(つまり、正規形の場合は実際の値タイプにCという接頭辞が付けられます)。以前挿入されたロング・リテラルと同じ正規形を持つ(ただし異なる字句表現の)ロング・リテラルがRDF_VALUE$表に挿入されると、その新しい挿入に対してそれぞれPLLPLL@またはTLLというVALUE_TYPE値が適切に割り当てられます。

したがって、正規化後に等価となる異なる字句表現を持つテキスト値は、RDF_VALUE$表に格納されますが、正規化後に等価となるトリプルはデータベースに格納されません。

1.4.4 主語と目的語

RDFの主語と目的語は、RDFネットワークのノードにマップされます。主語のノードはリンクの開始ノードで、目的語のノードはリンクの終了ノードです。リテラル以外のノード(URIや空白ノード)は、主語および目的語のノードとして使用できます。リテラルは、目的語のノードとしてのみ使用できます。

1.4.5 空白ノード

空白ノードは、RDFネットワークのサブジェクト・ノードおよびオブジェクト・ノードとして使用できます。空白ノード識別子は、1つのRDFグラフ内を有効範囲とする点において、URIとは異なります。つまり、単一のRDFグラフ内に同じ空白ノード識別子が複数出現した場合、それらは常に同じリソースを示しますが、異なる2つのRDFグラフ内に同じ空白ノード識別子が出現した場合、それらは同じリソースを示しません。

Oracle RDFネットワークでは、この動作は、RDFグラフ内で常に空白ノードが再使用され、2つの異なるRDFグラフ間では再使用されない(つまり、同じ空白ノード識別子が使用される場合は同じリソースを表すために使用される)ように要求することによって、モデル化されます。このため、空白ノードを含むトリプルをRDFグラフに挿入する場合、空白ノードの再利用をサポートするSDO_RDF_TRIPLE_Sコンストラクタを使用する必要があります。

1.4.6 プロパティ

プロパティは、開始ノード(主語)と終了ノード(目的語)を備えたリンクにマップされます。したがって、1つのリンクは完全なトリプルを表します。

トリプルがRDFグラフに挿入されると、主語、プロパティおよび目的語のテキスト値について、それらがすでにデータベースに存在するかどうかがチェックされます。他のRDFグラフの以前の文に基づくテキスト値がすでに存在する場合、新規エントリは作成されません。テキスト値が存在しない場合、RDF_VALUE$表(「文」を参照)に新しい3行が挿入されます。

1.4.7 推論: ルールとルールベース

推論は、ルールに基づいて論理的な推測を行う機能です。推論により、文字列などの値に基づく構文的な一致機能ではなく、データの各要素間の意味的な関係に基づいてセマンティクな一致機能を実行する問合せを作成できます。推論では、ルールベースに格納されたルールを使用し、ルールには、Oracleに付属するものとユーザーが定義するものがあります。

図1-2 に、RDFグラフ・データと1つ以上のルールベースにおけるルールの適用から推論されたトリプル・セットを示します。この図の場合、データベースには任意の数のRDFグラフ、ルールベース、および推論されたトリプル・セットがあり、推論されたトリプル・セットは1つ以上のルールベースのルールを使用して導出されます。

ルールは、RDFデータから推論を導く際に適用できるオブジェクトです。ルールは、名前で識別され、次の要素で構成されます。

  • 前件に対応するIF側パターン

  • 後件に対応するTHEN側パターン

たとえば、「会議の議長は会議のレビューアでもある」というルールは、次のように表現されます。

('chairpersonRule', -- rule name
 '(?r :ChairPersonOf ?c)', -- IF side pattern
 NULL,  -- filter condition
 '(?r :ReviewerOf ?c)', -- THEN side pattern
 SEM_ALIASES (SEM_ALIAS('', 'http://some.org/test/'))
)

パフォーマンスを最大化するには、ルールのTHEN側に単一のトリプル・パターンを使用します。ルールのTHEN側に複数のトリプル・パターンが含まれる場合、THEN側でそれぞれ単一のトリプル・パターンを含むようにそれを複数のルールに簡単に分割できます。

ルールベースは、ルールを含むオブジェクトです。Oracleには、次のルールベースが付属しています。

  • RDFS

  • RDF (RDFSのサブセット)

  • OWLSIF (空)

  • RDFS++ (空)

  • OWL2EL (空)

  • OWL2RL (空)

  • OWLPrime (空)

  • SKOSCORE (空)

RDFSおよびRDFルールベースは、SEM_APIS.CREATE_RDF_NETWORKプロシージャをコールしてRDFサポートをデータベースに追加すると作成されます。RDFSルールベースでは、RDFS推論ルールを実装します。詳細は、http://www.w3.org/TR/rdf-mt/にあるWorld Wide Web Consortium (W3C)のドキュメント「RDF Semantics」を参照してください。RDFルールベースは、RDF伴意ルールのサブセットであるRDF推論ルールを表します。これらのルールベースの内容は、SEMR_RDFSおよびSEMR_RDFビューで確認できます。

SEM_APIS.CREATE_RULEBASEプロシージャを使用してユーザー定義のルールベースを作成することも可能です。ユーザー定義のルールベースを使用すると、特殊化された推論機能を追加できます。

ルールベースごとに、ルールベースのルールを保持するための表と、SEMR_rulebase-nameという形式の名前を持つビューが作成されます(たとえば、FAMILY_RBというルールベースの場合、SEMR_FAMILY_RBという名前になります)。ルールベースのルールを挿入、削除および変更するには、このビューを使用する必要があります。表1-6に、各SEMR_rulebase-nameビューの列を示します。

表1-6 SEMR_rulebase-nameビューの列

列名 データ型 説明

RULE_NAME

VARCHAR2(30)

ルールの名前

ANTECEDENTS

VARCHAR2(4000)

前件に対応するIF側パターン

FILTER

VARCHAR2(4000)

(サポートされていません。)

CONSEQUENTS

VARCHAR2(4000)

後件に対応するTHEN側パターン

ALIASES

SEM_ALIASES

使用される1つ以上の名前空間。(SEM_ALIASESデータ・タイプの説明は、「SEM_MATCH表関数を使用したRDFデータの問合せ」を参照してください。)

すべてのルールベースに関する情報は、SEM_RULEBASE_INFOビューに保持されます。表1-7に、このビューの列を示します(1つの行が1つのルールベースに対応します)。

表1-7 SEM_RULEBASE_INFOビューの列

列名 データ型 説明

OWNER

VARCHAR2(30)

ルールベースの所有者

RULEBASE_NAME

VARCHAR2(25)

ルールベースの名前

RULEBASE_VIEW_NAME

VARCHAR2(30)

ルールベースのルールを挿入、削除または変更する任意のSQL文で使用する必要のあるビューの名前

STATUS

VARCHAR2(30)

VALID(ルールベースが有効の場合)、INPROGRESS(ルールベースが作成中の場合)またはFAILED(ルールベースの作成中にシステム障害が発生した場合)が含まれます。

例1-3 ルールベースへのルールの挿入

例1-3では、family_rbというルールベースを作成し、そのfamily_rbルールベースにgrandparent_ruleというルールを挿入します。このルールは、ある人物がある子の親であり、その子がさらに別の子の親である場合、その人物が自分の子供の子供に対する祖父母である(つまり、自分の子供の子供に関してgrandParentOf関係を持つ)ことを示します。また、使用する名前空間も指定します。(この例は、例: 家系の情報例1-130からの抜粋です。)

EXECUTE SEM_APIS.CREATE_RULEBASE('family_rb', network_owner=>'RDFUSER', network_name=>'NET1');

INSERT INTO rdfuser.net1#semr_family_rb VALUES(
  'grandparent_rule',
  '(?x :parentOf ?y) (?y :parentOf ?z)',
  NULL,
  '(?x :grandParentOf ?z)', 
  SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')));

例1-3に示されている祖父母ルールのようなものは、OWL 2プロパティ・チェーン構成要素を使用して実装できることに注意してください。プロパティ・チェーンの処理の詳細は、「プロパティ・チェーンの処理」を参照してください。

例1-4 推論でのルールベースの使用

SEM_MATCH表関数(「SEM_MATCH表関数を使用したRDFデータの問合せ」を参照)をコールするときに1つ以上のルールベースを指定して、RDFデータに対する問合せの動作を制御できます。例1-4では、family_rbルールベースと、例1-3で作成したgrandParentOf関係を参照して、すべての祖父(祖父母の男性の方)とその孫を検索します。(この例は、例: 家系の情報例1-130からの抜粋です。)

-- Select all grandfathers and their grandchildren from the family RDF graph.
-- Use inferencing from both the RDFS and family_rb rulebases.
SELECT x$rdfterm grandfather, y$rdfterm grandchild
  FROM TABLE(SEM_MATCH(
    'PREFIX  rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
     PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
     PREFIX     : <http://www.example.org/family/>
     SELECT ?x ?y
     WHERE {?x :grandParentOf ?y . ?x rdf:type :Male}',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'), 
    null,  null, null,
    ' PLUS_RDFT=VC ',
    null, null,
    'RDFUSER', 'NET1'));

ネイティブOWL推論のサポートの詳細は、「OWL推論の使用方法」を参照してください。

1.4.8 推論グラフ

推論グラフは、指定したルールベースのセットを指定したRDFグラフのセットに適用することで推論できる計算済のトリプルを含むオブジェクトです。SEM_MATCH問合せで任意のルールベースを参照する場合、問合せ内のルールベースとRDFのグラフの組合せごとに推論グラフが存在している必要があります。

ノート:

推論グラフは、以前のブック・バージョン(Oracle Databaseリリース23aiより前)では「伴意」と呼ばれていました。詳細は、「用語とサブプログラムの変更」を参照してください。

推論グラフを作成するには、SEM_APIS.CREATE_INFERRED_GRAPHプロシージャを使用します。推論グラフを削除するには、SEM_APIS.DROP_INFERRED_GRAPHプロシージャを使用します。

推論グラフを作成すると、ネットワーク所有者のスキーマの下に、推論グラフに関連付けられたトリプルのビューも作成されます。このビューは、SEMI_inferred-graph-nameという形式の名前を持ち、推論グラフの所有者および適切な権限を持つユーザーにのみ表示されます。各SEMI_inferred-graph-nameビューには、ネットワークにリンクとして格納されたトリプルごとに1つの行が含まれます。また、SEMM_rdf-graph-nameビューと同じ列が含まれます(「モデルのメタデータ」表1-4を参照)。

すべての推論グラフに関する情報は、表1-8に示す列と推論グラフごとに1つの行を含むSEM_RULES_INDEX_INFOビューに保持されます。

表1-8 SEM_RULES_INDEX_INFOビューの列

列名 データ型 説明

OWNER

VARCHAR2(30)

推論グラフの所有者。

INDEX_NAME

VARCHAR2(25)

推論グラフの名前。

INDEX_VIEW_NAME

VARCHAR2(30)

ビューの名前。推論グラフのルールを挿入、削除または変更するSQL文で使用する必要があります。

STATUS

VARCHAR2(30)

推論グラフが有効な場合はVALID、推論グラフが無効な場合はINVALID、推論グラフが不完全な場合はINCOMPLETE(INVALIDと似ていますが、再作成にかかる時間が短い)、推論グラフが作成中の場合はINPROGRESS、推論グラフの作成中にシステム障害が発生した場合はFAILEDが含まれます。

MODEL_COUNT

NUMBER

推論グラフに含まれるRDFグラフの数。

RULEBASE_COUNT

NUMBER

推論グラフに含まれるルールベースの数。

推論グラフに関連するすべてのデータベース・オブジェクト(RDFグラフやルールベースなど)に関する情報は、SEM_RULES_INDEX_DATASETSビューに保持されます。表1-9に、このビューの列を示します(1つの行がすべての列の値の一意の組合せに対応します)。

表1-9 SEM_RULES_INDEX_DATASETSビューの列

列名 データ型 説明

INDEX_NAME

VARCHAR2(25)

推論グラフの名前

DATA_TYPE

VARCHAR2(8)

推論グラフに含まれるデータのタイプ。たとえば、RDFグラフの場合はMODEL、ルールベースの場合はRULEBASEです。

DATA_NAME

VARCHAR2(25)

DATA_TYPE列に含まれるタイプのオブジェクトの名前

例1-5では、familyグラフとRDFSおよびfamily_rbルールベースを使用して、family_rb_rix_familyという推論グラフを作成します。(この例は、例: 家系の情報例1-130からの抜粋です。)

例1-5 推論グラフの作成

BEGIN
  SEM_APIS.CREATE_INFERRED_GRAPH(
    'rdfs_rix_family',
    sem_models('family'),
    sem_Rulebases('RDFS','family_rb'), 
    network_owner=>'RDFUSER', network_name=>'NET1');
END;
/

1.4.9 RDFグラフ・コレクション

RDFグラフ・コレクションは、SEM_MATCH問合せで使用できる論理グラフです。RDFグラフ・コレクションは、1つ以上のRDFグラフまたは推論グラフ(あるいはその両方)に対するUNIONまたはUNION ALL操作の結果です。RDFグラフ・コレクションを使用すると、開発プロセスを簡素化できます。ただし、本番の業務ワークロードでは、可能な場合は単一のRDFグラフを使用することをお薦めします。

ノート:

RDFグラフ・コレクションは、以前のブック・バージョン(Oracle Databaseリリース23aiより前)では仮想モデルと呼ばれていました。詳細は、「用語とサブプログラムの変更」を参照してください。

単一のRDFグラフに対する問合せでは、RDFグラフ収集に対する問合せと比較して、パーティション・プルーニングをより効果的に使用し、単一グラフのパーティションに対してローカル・オプティマイザ統計を使用できます。RDFグラフ収集に対する問合せでは、RDFネットワーク全体のグローバル・オプティマイザ統計が使用されます。これは、ローカルのグラフ・レベルの統計より正確でない可能性があります。したがって、可能な場合は、問い合せたデータセットを1つのRDFグラフに結合する必要があります。

開発にRDFグラフ・コレクションを使用する以外に、1つの問合せで複数のRDFグラフのデータにアクセスする必要がある場合や、他の問合せで個々のRDFグラフを分離しておく必要がある場合にも、RDFグラフ・コレクションを使用できます。ただし、可能な場合は、問い合せたデータセットを1つのRDFグラフに結合する必要があります。

プロジェクトの開発フェーズでRDFグラフ・コレクションを使用すると、次の利点があります。

  • RDFデータのアクセス権限の管理を簡素化できます。たとえば、3つのグラフとOWLPrimeルールベースに基づいて、3つのRDFグラフと1つの推論グラフを作成したとします。RDFグラフ・コレクションを使用しない場合は、各RDfグラフおよび推論グラフに対するアクセス権限を個別に付与および取り消す必要があります。しかし、3つのRDFグラフと推論グラフを含むRDFグラフ・コレクションを作成する場合、1つのRDFグラフ・コレクションに対するアクセス権限の付与および取消しのみが必要です。

  • これにより、RDFグラフの迅速な更新が容易になります。たとえば、RDFグラフVM1にRDFグラフM1と推論グラフR1が含まれるとし(つまり、VM1 = M1 UNION ALL R1)、また、RDFグラフM1_UPDは、追加のトリプルで更新されたM1のコピーであり、R1_UPDはM1_UPDに作成された推論グラフであるとします。この場合、VM1に対するユーザー問合せで更新済みのRDFグラフおよび推論グラフが使用されるように、RDFグラフ・コレクションVM1を再定義できます(つまり、VM1 = M1_UPD UNION ALL R1_UPD)。

  • RDFグラフ・コレクションの問合せは、SEM_MATCH問合せでの複数のRDFグラフの問合せと同等であるため、問合せの指定を簡素化できます。たとえば、RDFグラフm1、m2およびm3がすでに存在し、OWLPrimeルールベースを使用してm1、m2およびm3に対して推論グラフが作成されているとします。RDFグラフ・コレクションvm1は、次のように作成できます。

    EXECUTE sem_apis.create_rdf_graph_collection('vm1', sem_models('m1', 'm2', 'm3'), 
                                          sem_rulebases('OWLPRIME'),
                                          network_owner=>'RDFUSER',
                                          network_name=>'NET1');
    

    RDFグラフ・コレクションを問い合せるには、SEM_MATCH問合せでRDFグラフであるかのように、RDFグラフ・コレクション名を使用します。たとえば、RDFグラフ・コレクションに対する次の問合せです。

    SELECT * FROM TABLE (sem_match('{…}', sem_models('vm1'), null, …));
    

    これは、すべての個別RDFグラフに対する次の問合せと同じです。

    SELECT * FROM TABLE (sem_match('{…}', sem_models('m1', 'm2', 'm3'), 
                                          sem_rulebases('OWLPRIME'), …));
    

    RDFグラフ・コレクションに対するSEM_MATCH問合せでは、各RDFグラフおよび推論グラフのUNIONまたはUNION ALLを問い合せることなく、SEMVまたはSEMUビューを問い合せます(デフォルトではSEMU、ALLOW_DUP=Tオプションが指定されている場合はSEMV)。これらのビューおよびオプションの詳細は、SEM_APIS.CREATE_RDF_GRAPH_COLLECTIONプロシージャのリファレンスの項を参照してください。

RDFグラフ・コレクションは、ビューを使用し(この項の後半を参照)、いくつかのメタデータ・エントリを追加しますが、システム記憶域要件が大幅に増大することはありません。

RDFグラフ・コレクションを作成するには、SEM_APIS.CREATE_RDF_GRAPH_COLLECTIONプロシージャを使用します。RDFグラフ・コレクションを削除するには、SEM_APIS.DROP_RDF_GRAPH_COLLECTIONプロシージャを使用します。RDFグラフ・コレクションは、そのコンポーネントのRDFグラフ、ルールベースまたは推論グラフのいずれかが削除されると自動的に削除されます。RDFグラフ・コレクションを削除せずに置換するには、SEM_APIS.CREATE_RDF_GRAPH_COLLECTIONプロシージャをREPLACE=Tオプションとともに使用します。RDFグラフ・コレクションを置換すると、それを再定義しながら、任意のアクセス権限を保持できます。

RDFグラフ・コレクションを問い合せるには、例1-6に示すように、SEM_MATCH表関数のmodelsパラメータでRDFグラフ・コレクション名を指定します。

SEM_MATCH表関数の詳細は、「SEM_MATCH表関数を使用したRDFデータの問合せ」を参照してください。この項に、RDFグラフ・コレクションの問合せ時の特定の属性の使用方法が示されています。

RDFグラフ・コレクションを作成すると、そのエントリがSEM_MODEL$ビューに作成されます(RDFグラフ表1-3を参照)。ただし、表1-10に示すように、いくつかの列の値はRDFグラフではなくRDFグラフ・コレクションで異なります。

表1-10 SEM_MODEL$ RDFグラフ・コレクションのビュー列の説明

列名 データ型 説明

OWNER

VARCHAR2(30)

RDFグラフ・コレクションの所有者のスキーマ

MODEL_ID

NUMBER

一意のモデルID番号(自動生成)。これがRDFグラフ・コレクションであることを示すマイナスの数値になります。

MODEL_NAME

VARCHAR2(25)

RDFグラフ・コレクションの名前

TABLE_NAME

VARCHAR2(30)

RDFグラフ・コレクションのNull

COLUMN_NAME

VARCHAR2(30)

RDFグラフ・コレクションのNull

MODEL_TABLESPACE_NAME

VARCHAR2(30)

RDFグラフ・コレクションのNull

すべてのRDFグラフ・コレクションに関する情報は、表1-11に示す列と、RDFグラフ・コレクションごとに1行を含むSEM_VMODEL_INFOビューに保持されます。

表1-11 SEM_VMODEL_INFOビューの列

列名 データ型 説明

OWNER

VARCHAR2(30)

RDFグラフ・コレクションの所有者

VIRTUAL_MODEL_NAME

VARCHAR2(25)

RDFグラフ・コレクションの名前

UNIQUE_VIEW_NAME

VARCHAR2(30)

RDFグラフ・コレクション内に一意のトリプルを含むビューの名前。ビューが作成されていない場合はNULL。

DUPLICATE_VIEW_NAME

VARCHAR2(30)

RDFグラフ・コレクションに重複するトリプル(存在する場合)を含むビューの名前

STATUS

VARCHAR2(30)

関連する推論グラフが有効な場合はVALID、推論グラフが無効な場合はINVALID、推論グラフが不完全な場合はINCOMPLETEが含まれます(INVALIDと同様ですが、再作成にかかる時間は少なくなります)。推論グラフを作成する場合はINPROGRESS、推論グラフの作成中にシステム障害が発生した場合はFAILED、推論グラフがRDFグラフ・コレクションに関連付けられていない場合はNORIDX

複数の推論グラフの場合、すべてのコンポーネント推論グラフの最下位ステータスがRDFグラフ・コレクションのステータスとして使用されます(INVALID < INCOMPLETE < VALID)。

MODEL_COUNT

NUMBER

RDFグラフ・コレクションのRDFグラフの数

RULEBASE_COUNT

NUMBER

RDFグラフ収集に使用されるルールベース数

RULES_INDEX_COUNT

NUMBER

RDFグラフ収集の推論グラフの数

RDFグラフ・コレクションに関連するすべてのオブジェクト(RDFグラフ、ルールベースおよび推論グラフ)に関する情報は、SEM_VMODEL_DATASETSビューに保持されます。表1-12に、このビューの列を示します(1つの行がすべての列の値の一意の組合せに対応します)。

表1-12 SEM_VMODEL_DATASETSビューの列

列名 データ型 説明

VIRTUAL_MODEL_NAME

VARCHAR2(25)

RDFグラフ・コレクションの名前

DATA_TYPE

VARCHAR2(8)

RDFグラフ・コレクションに含まれるオブジェクトのタイプ。例: RDFグラフの場合はMODEL、ルールベースの場合はRULEBASE、推論グラフの場合はRULEIDX

DATA_NAME

VARCHAR2(25)

DATA_TYPE列に含まれるタイプのオブジェクトの名前

例1-6 RDFグラフ・コレクションの問合せ

SELECT COUNT(protein)
  FROM TABLE (SEM_MATCH (
    'SELECT ?protein
     WHERE {
      ?protein rdf:type :Protein .
      ?protein :citation ?citation . 
      ?citation :author "Bairoch A."}',
    RDF_MODELS('UNIPROT_VM'), 
    NULL, 
    SEM_ALIASES(SEM_ALIAS('', 'http://purl.uniprot.org/core/')),
    NULL, 
    NULL, 
    'ALLOW_DUP=T',
    NULL,
    NULL,
    'RDFUSER','NET1'));

1.4.10 名前付きグラフ

RDFグラフは名前付きグラフの使用をサポートしており、これについてはW3C勧告の「SPARQL Query Language for RDF」のRDFデータセットに関する項(http://www.w3.org/TR/rdf-sparql-query/#rdfDataset)で説明されています。

このサポートは、従来の主語、述語、目的語で構成されるRDFトリプルを、グラフ名を表す追加の構成要素を含めるように拡張することで実現されます。拡張されたRDFトリプルは、4つの構成要素を含みますが、このドキュメントでは引き続きRDFトリプルと呼びます。また、次の用語が使用されることもあります。

  • N-Triple: 拡張トリプルを許可しない形式です。したがって、n-tripleは3つのコンポーネントを持つトリプルのみを含むことができます。

  • N-Quad: 通常のトリプル(3つのコンポーネント)と拡張トリプル(グラフ名を含む4つのコンポーネント)を許可する形式です。詳細は、http://www.w3.org/TR/2013/NOTE-n-quads-20130409/を参照してください。

    拡張トリプルを含むファイル(通常は標準トリプルが混在)をOracle Databaseにロードする場合、入力ファイルはN-Quad形式である必要があります。

RDFトリプルのグラフ名の構成要素は、NULLまたはURIである必要があります。これがNULLの場合、RDFトリプルはデフォルト・グラフに属していると言われます(それ以外の場合、URIで指定された名前を持つ名前付きグラフに属していると言われます)。

また、SDO_RDF_TRIPLE_Sオブジェクト型(「セマンティク・データの型、コンストラクタおよびメソッド」を参照)の名前付きグラフに対応するため、モデル-グラフ、つまりモデル(RDFグラフ)と名前付きグラフ(存在する場合)の組合せを指定するための新しい構文が用意されるとともに、RDF_M_ID属性には、モデル-グラフ、つまりモデル(RDFグラフ)と名前付きグラフ(存在する場合)の組合せのモデルIDと値IDの組合せが保持されます。モデル-グラフの名前をrdf_graph_nameとして指定し、グラフが存在する場合は、その後にコロン(:)デリミタと名前付きグラフの名前が続きます(これはURIであり、山カッコ< >で囲まれる必要があります)。

たとえば、医療データセットでは、各RDFトリプルの名前付きグラフの構成要素は患者の識別子に基づくURIになるため、一意の患者と同じ数の名前付きグラフが存在することになります(それぞれの名前付きグラフは特定の患者のデータで構成されます)。

名前付きグラフに特定の操作を実行する方法の詳細は、次の項を参照してください。

1.4.10.1 名前付きグラフ・サポートに関連したデータ形式

TriGおよびN-QUADSの2つは、グラフ名(またはコンテキスト)をトリプル・データに与えるための一般的なデータ形式です。グラフ名(コンテキスト)は様々な方法で使用できます。典型的な使用方法には、管理、ローカライズされた問合せ、ローカライズされた推論および来歴を容易にするためのトリプルのグループ化がありますが、これに限定されるものではありません。

例1-7 TriG形式でエンコードされたRDFデータ

例1-7は、TriG形式でエンコードされるRDFデータセットを示しています。デフォルト・グラフと名前付きグラフが含まれます。

@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
 
# Default graph
{
  <http://my.com/John> dc:publisher <http://publisher/Xyz> .
}
 
# A named graph
<http://my.com/John> {
  <http://my.com/John> foaf:name "John Doe" .
}

例1-7のTriGファイルをDatasetGraphOracleSemオブジェクトにロード(たとえば、RDF Semantic Graph Support for Apache Jenaを使用したバルク・ロード例7-12を使用)する場合に、定数"N-QUADS""TRIG"に置き換えると、デフォルト・グラフ内のトリプルは、トリプルとしてnullのグラフ名とともにOracle Databaseにロードされ、名前付きグラフ内のトリプルは指定されたグラフ名とともにOracle Databaseにロードされます。

例1-8 N-QUADS形式の表現

N-QUADS形式は、オプションの4番目の列(グラフ名またはコンテキスト)を追加することで既存のN-TRIPLES形式を単純に拡張したものです。例1-8に、例1-7に基づくTriGファイルのN-QUADS形式の表現を示します。

<http://my.com/John> <http://purl.org/dc/elements/1.1/publisher> <http://publisher/Xyz> .
<http://my.com/John> <http://xmlns.com/foaf/0.1/name> "John Doe" <http://my.com/John>

N-QUADSファイルをDatasetGraphOracleSemオブジェクトにロードすると(例7-12を参照)、4つ目の列のない行はnullグラフ名を持つトリプルとしてOracle Databaseにロードされ、4つ目の列がある行は指定されたグラフ名でOracle Databaseにロードされます。

1.4.11 RDFデータ・セキュリティの考慮事項

RDFデータを使用する場合、次のデータベース・セキュリティの考慮事項が適用されます。

  • RDFグラフまたは推論グラフが作成されると、所有者は、関連付けられたビューでGRANTオプションを指定したSELECT権限を取得します。これらのビューに対するSELECT権限を持つユーザーは、関連するRDFグラフまたは推論グラフに対してSEM_MATCH問合せを実行できます。

  • ルールベースを作成すると、ルールベースに対するGRANTオプション付きのSELECT、INSERT、UPDATEおよびDELETE権限が所有者に付与されます。ルールベースに対してSELECT権限を持つユーザーは、ルールベースを含む推論グラフを作成できます。INSERT、UPDATEおよびDELETE権限により、ルールベースを変更できるユーザーと、その変更方法が制御されます。

  • RDFグラフでデータ操作言語(DML)の操作を実行する場合、ユーザーは対応する実表に対するDML権限を持っている必要があります。

  • RDFグラフに対応する実表の作成者は、他のユーザーに権限を付与できます。

  • ルールベースに対してデータ操作言語(DML)の操作を実行する場合、ユーザーは対応するデータベース・ビューに対する適切な権限を持っている必要があります。

  • RDFグラフの作成者は、他のユーザーに対し、対応するデータベース・ビューのSELECT権限を付与できます。

  • ユーザーは、対応するデータベース・ビューに対するSELECT権限を持っているRDFグラフのみを問い合せることができます。

  • RDFグラフまたはルールベースを削除できるのは、RDFグラフまたはルールベースの作成者のみです。

1.4.12 RDFの権限に関する考慮事項

RDFネットワークを使用する場合は、データベース権限に関して次の考慮事項があります。

  • RDFネットワークの表およびビューを保持するスキーマを持つネットワーク所有者ユーザーには、次のロールおよび権限が必要です。

    GRANT CONNECT, RESOURCE, CREATE VIEW TO <network_owner_user>;

  • ネットワーク所有者は、ネットワークを含む表領域の割当て制限が必要です。