IRI、および空白ノードが含まれます。トリプルデータは、異なる並び順のトリプルを、
ドキュメントIDおよびポジションとともに保持します。トリプルデータは、トリプル 値をIDで参照するため、参照が非常に効率的になります。トリプルデータはディスク 上で圧縮されて格納され、トリプル値は別の圧縮値ストアに格納されます。トリプルイ ンデックスと値ストアのどちらも、圧縮された4KBのブロックに格納されます。
トリプルデータが必要になると(例えば参照時)、関連性のあるブロックがトリプル キャッシュまたはトリプル値キャッシュにキャッシュされます。他のMarkLogicキャ ッシュとは異なり、トリプルキャッシュやトリプル値キャッシュは拡大したり縮小し たりするため、メモリを消費するのはキャッシュへの追加が必要なときだけです。
注: トリプルストアのホスト用のトリプルキャッシュおよびトリプル値キャ ッシュのサイズは、「キャッシュのサイズ設定」(61 ページ)の説明に 従って設定できます。
4.1.1.1 トリプルキャッシュとトリプル値キャッシュ
トリプルキャッシュは、ディスクからの圧縮トリプルのブロックを保持します。このブ ロックは、LRU(least-recently-used:最近最も使用されなかったもの)アルゴリズムを 使用してフラッシュされます。トリプルキャッシュ内のブロックは、辞書からの値を参 照します。トリプル値キャッシュは、トリプルインデックス辞書からの非圧縮値を保持 します。トリプル値キャッシュも、LRUのキャッシュです。
トリプルインデックス内のトリプルは、クエリのタイムスタンプおよびトリプルが属し ていたドキュメントのタイムスタンプに応じて除外されます。トリプルキャッシュは、
フィルタリングが発生する前に生成された情報を保持するため、トリプルを削除して も、トリプルキャッシュには反映されません。ただし、マージ後、古いスタンドは削除 される場合があります。スタンドが削除されると、そのブロックすべてがトリプル キャッシュからフラッシュされます。
トリプルインデックスブロックが最後に使用されてから、MarkLogicサーバーでそのブ ロックをキャッシュに保持する時間は、キャッシュタイムアウトで制御します(別のブ ロックのための空間を作るためにフラッシュされていない場合)。不定期で実行される クエリに対してキャッシュを維持したい場合に、キャッシュタイムアウトを大きくす ることが有効な可能性があります。不定期のクエリが再実行される前に、頻繁に発生す る他のクエリによりブロックがキャッシュから押し出されることがあります。
4.1.2 トリプル値とタイプ情報
値は、ディスク上の別の値ストアに「値の等価性」のソート順で格納されます。つまり、
ある特定スタンドにおいて、値IDの順序は値の等価性の順序と同等ということに なります。
値の中の文字列は、レンジインデックスの文字列ストレージに格納されます。タイム ゾーンや生成されたタイプ情報など、値の等価性と関係のない部分は格納される値から
タイプ情報は別に格納されるため、トリプルはトリプルインデックスから直接返すこと ができます。この情報は、SPARQLの単純含意で必要なRDF固有の「sameTerm」比較 に使用することもできます。
4.1.3 トリプルポジション
トリプルポジションインデックスは、cts:triplesのcts:triple-range-query
およびitem-frequencyオプションを使用するクエリを正確に解決するために使用さ
れます。また、トリプルポジションインデックスは、cts:near-queryおよび
cts:element-queryコンストラクタを使用する検索を正確に解決する目的でも使用
されます。トリプルポジションインデックスは、フラグメント内でのトリプルの相対位 置をそのフラグメント内に格納します(通常、フラグメントはドキュメントです)。 トリプルポジションインデックスを有効にするとインデックスのサイズが大きくなり、
ドキュメントの読み込み速度が低下しますが、ポジション情報を必要とするクエリの精 度は向上します。
例えば以下のようになります。
xquery version "1.0-ml";
cts:search(doc(), cts:near-query((
cts:triple-range-query(sem:iri("http://www.rdfabout.com/
rdf/usgov/sec/id/cik0001075285"), (), ()),
cts:triple-range-query(sem:iri("http://www.rdfabout.com/
rdf/usgov/sec/id/cik0001317036"), (), ()) ),11), "unfiltered")
cts:near-queryは、指定された距離内でマッチしているクエリのシーケンスを返し
ます。ここで指定する距離は、2つのマッチングクエリの間の単語数です。
フィルタリングされていない検索では、指定されたcts:queryを満たす候補であるイ ンデックスからフラグメントを選択し、ドキュメントを返します。
4.1.4 インデックスファイル
メモリを効率的に使用するため、トリプルおよび値ストアのインデックスファイルは、メ モリに直接マッピングされます。タイプストアは、全体がメモリにマッピングされます。
トリプルおよび値ストアのどちらも、64バイトのセグメントで構成されたインデック スファイルを持ちます。それぞれの最初のセグメントは、チェックサム、バージョン 番号、および(トリプルまたは値の)件数が含まれたヘッダです。その後は次の要素が 続きます。
• トリプルインデックス:ヘッダセグメントの後に続くトリプルインデックスに は、最初の2つの値のインデックスと、各ブロック内の最初のトリプルの異なる 並び順(順列)のインデックスが、64バイトのセグメントに編成されて格納さ れます。これは、トリプルからの値に基づいて指定された参照の回答を返すため に必要なブロックを検索する目的で使用されます。現在、トリプルは序数でアク セスできないため、序数インデックスは必須ではありません。
• 値インデックス:ヘッダセグメントの後に続く値インデックスには、各ブロック の最初の値のインデックスが、64バイトのセグメントに編成されて格納され ます。値インデックスは、値に基づいて指定された参照の回答を返すために必要 なブロックを検索する目的で使用されます。値インデックスの後には、各ブロッ クの開始序数のインデックスが続きます。このインデックスは、値IDに基づい て指定された参照の回答を返すために必要なブロックを検索する目的で使用さ れます。
注: トリプルインデックスは、triple positionsがオンの場合にポジショ ンを格納します。「トリプルインデックスの有効化」(58 ページ)を参照 してください。
タイプストアには、格納されるタイプごとにタイプデータファイルに対するオフセット を格納するインデックスファイルが含まれています。これもメモリにマップされます。
次の表は、トリプルインデックスおよび値ストアで使用する情報を格納し、メモリに マップされるインデックスファイルについて説明したものです。
インデックスファイル 説明
TripleIndex
TripleValueIndex
TripleDataおよびTripleValueDataのブロックインデッ
クス TripleTypeData
TripleTypeIndex
トリプル値のタイプ情報 StringData
StringIndex AtomData AtomIndex
文字列ベースのレンジインデックスでも使用されます。
TripleValueFreqs
TripleValueFreqsIndex
トリプルに関する統計情報。トリプルインデックス は、データベースに保持されている各値のトリプルに 関する統計情報を保持します。
4.1.5 順列
順列として、元のトリプル内の値を異なる並び順で保持します。異なるソート順で、
またトリプルの各部分を効率的に参照できるように、3つの順列(並び順)で格納して います。順列は、3つのRDF要素(主語(Subject)、述語(Predicate)、目的語
(Object))のイニシャルから構成された略語として表現され、例えば{ SOP, PSO, OPS }のようになります。
オプションで次のいずれかのソート順を指定するには、cts:triples関数を使用 します。
• order-pso:述語、主語、目的語の順に並んだ結果を返します。
• order-sop:主語、目的語、述語の順に並んだ結果を返します。
• order-ops:目的語、述語、主語の順に並んだ結果を返します。