IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ ダッソー システムズの特許一覧

特開2024-86706効率的なグラフデータベースストレージのためのデータ構造
<>
  • 特開-効率的なグラフデータベースストレージのためのデータ構造 図1
  • 特開-効率的なグラフデータベースストレージのためのデータ構造 図2
  • 特開-効率的なグラフデータベースストレージのためのデータ構造 図3A
  • 特開-効率的なグラフデータベースストレージのためのデータ構造 図3B
  • 特開-効率的なグラフデータベースストレージのためのデータ構造 図4
  • 特開-効率的なグラフデータベースストレージのためのデータ構造 図5
  • 特開-効率的なグラフデータベースストレージのためのデータ構造 図6A
  • 特開-効率的なグラフデータベースストレージのためのデータ構造 図6B
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024086706
(43)【公開日】2024-06-27
(54)【発明の名称】効率的なグラフデータベースストレージのためのデータ構造
(51)【国際特許分類】
   G06F 16/22 20190101AFI20240620BHJP
【FI】
G06F16/22
【審査請求】未請求
【請求項の数】14
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2023212807
(22)【出願日】2023-12-18
(31)【優先権主張番号】22306928.7
(32)【優先日】2022-12-16
(33)【優先権主張国・地域又は機関】EP
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.PYTHON
(71)【出願人】
【識別番号】500102435
【氏名又は名称】ダッソー システムズ
【氏名又は名称原語表記】DASSAULT SYSTEMES
(74)【代理人】
【識別番号】110001243
【氏名又は名称】弁理士法人谷・阿部特許事務所
(72)【発明者】
【氏名】エリック ヴァレ グレニッソン
(72)【発明者】
【氏名】ジャン-フィリップ サウト ディザーン
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175KA07
5B175KA12
(57)【要約】
【課題】RDFタプルのセットを含むグラフデータベースにRDFグラフデータを格納するための改良された方法を提供する。
【解決手段】本開示は、特に、RDFタプルのセットを含むグラフデータベースにRDFグラフデータを格納するコンピュータ実装方法に関する。この方法は、1つまたは複数の隣接行列を取得するステップであって、各隣接行列は、同じ述語を含むグラフデータベースのタプルのグループを表す、ステップを含む。この方法は、1つまたは複数の隣接行列の各々について、配列を含むデータ構造を格納するステップをさらに含む。配列は、各々が隣接行列の小区分を指す1つもしくは複数のインデックス、および/または各々が隣接行列のそれぞれの小区分のRDFグラフデータベースのタプルのグループを表す1つもしくは複数の要素を含む。
【選択図】図1
【特許請求の範囲】
【請求項1】
RDFタプルのセットを含むグラフデータベースにRDFグラフデータを格納するコンピュータ実装方法であって、前記方法は、
1つまたは複数の隣接行列を取得するステップであって、各隣接行列は、同じ述語を含む前記グラフデータベースのタプルのグループを表す、ステップと、
前記1つまたは複数の隣接行列の各々について、配列(NV)を含むデータ構造を格納するステップであって、前記配列は、
各々が前記隣接行列の小区分を指す1つもしくは複数のインデックス、および/または
各々が前記隣接行列のそれぞれの小区分の前記RDFグラフデータベースのタプルのグループを表す1つもしくは複数の要素を含む、ステップと
を含む方法。
【請求項2】
前記配列の前記1つまたは複数の要素の各々は、
1つまたは複数の座標ペアのセットを含み、各ペアは、前記隣接行列におけるそれぞれの座標を表す、請求項1に記載の方法。
【請求項3】
前記1つまたは複数の要素のうちの要素は、32ビットインデックスのデータ構造(V32)を備え、そのレイアウトが、
前記データ構造の前記サイズおよび/またはタイプを表すタグと、
前記隣接行列の行および列を含む座標の1つまたは複数のペアとを含む、請求項2に記載の方法。
【請求項4】
前記1つまたは複数の要素のうちの要素は、16ビットインデックスのデータ構造(V16)を備え、そのレイアウトは、
前記データ構造の前記サイズおよび/またはタイプを表すタグと、
前記隣接行列のベース列、ベース行、オフセット列、およびオフセット行を含む座標の1つまたは複数のペアとを含む、請求項2または3に記載の方法。
【請求項5】
前記1つまたは複数の要素のうちの要素は、8ビットインデックスのデータ構造(V8)を備え、そのレイアウトは、
前記データ構造の前記サイズおよび/またはタイプを表すタグと、
前記隣接行列のベース列、ベース行、オフセット列、およびオフセット行を含む座標の1つまたは複数のペアとを含む、請求項2乃至4のいずれか一項に記載の方法。
【請求項6】
前記1つまたは複数の要素のうちの要素は、mビットインデックスのデータ構造(Vm)を備え、前記方法は、
前記要素に対応するタグを、前記座標の1つまたは複数のペアに基づいて決定するステップであって、前記タグは、データ構造の前記サイズおよび/またはタイプを表す、ステップをさらに含む、請求項2に記載の方法。
【請求項7】
前記格納されたデータ構造は、前記隣接行列のそれぞれの小区分におけるRDFタプルのグループのビットマップ表現のビット配列(BM)をさらに含む、請求項1乃至6のいずれか一項に記載の方法。
【請求項8】
前記格納されたデータ構造の前記配列は、サイズ2×2の2次元配列またはサイズ22nの1次元配列であり、nは正の整数である、請求項1乃至7のいずれか一項に記載の方法。
【請求項9】
前記データ構造を格納する前記ステップは、
スロットを割り当て、それにより、ルートインデックスを取得するステップであって、前記ルートインデックスはメモリ内の前記ツリーデータ構造の位置を表す、ステップと、
前記ルートインデックスにおける前記配列を座標ペアの配列に設定するステップと
を含む、請求項1乃至8のいずれか一項に記載の方法。
【請求項10】
RDFグラフを格納する前記方法は、前記RDFグラフデータベース上で以下の関数、
前記隣接行列の所与のセルが第1の指定された値に設定されているかどうかをチェックするように構成された関数(Test)、
前記隣接行列の所与のセルを第1の指定された値に設定するように構成された関数(Set)、
前記隣接行列の所与のセルを第2の指定された値に設定するように構成された関数(Reset)、
第1の指定された値で前記隣接行列のすべてのセルのそれぞれの座標を出力するように構成された関数(ScanAll)、
第1の指定された値で前記隣接行列の所与の行のセルのそれぞれの座標を出力するように構成された関数(ScanRow)、および/もしくは
第1の指定された値で前記隣接行列の所与の列のセルのそれぞれの座標を出力するように構成された関数(ScanColumn)
のうちの1つまたは複数を実装するステップをさらに含み、各関数は、前記1つまたは複数の隣接行列の各隣接行列に適用されるように構成される、請求項1乃至9のいずれか一項に記載の方法。
【請求項11】
1つまたは複数の隣接行列を取得する前記ステップは、前記グラフデータベースの各述語について垂直分割を実行するステップを含む、請求項1乃至10のいずれか一項に記載の方法。
【請求項12】
請求項1乃至11のいずれか一項に記載の方法を実行するための命令を含むコンピュータプログラム。
【請求項13】
請求項12に記載のコンピュータプログラムを記録したコンピュータ可読記憶媒体。
【請求項14】
メモリに結合されたプロセッサを備えたシステムであって、前記メモリが、請求項12に記載のコンピュータプログラムを記録したシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、コンピュータプログラムおよびシステムの分野に関し、より具体的には、RDFタプルのセットを含むグラフデータベースにRDFグラフデータを格納するための方法、システム、およびプログラムに関する。
【背景技術】
【0002】
複数のシステムおよびプログラムが、オブジェクトの設計、エンジニアリング、および製造の市場に提供されている。CADは、コンピュータ支援設計(Computer-Aided Design)の頭字語であり、例えば、オブジェクトを設計するためのソフトウェアソリューションに関する。CAEはコンピュータ支援エンジニアリング(Computer-Aided Engineering)の頭字語であり、例えば、将来の製品の物理的挙動をシミュレートするためのソフトウェアソリューションに関する。CAMはコンピュータ支援製造(Computer-Aided Manufacturing)の頭字語であり、例えば、製造処理および動作を定義するためのソフトウェアソリューションに関する。このようなコンピュータ支援設計システムでは、グラフィカルユーザインターフェースが技術の効率に関して重要な役割を果たす。これらの技術は、製品ライフサイクル管理(PLM)システム内に組み込まれることがある。PLMとは、会社が、拡張された企業の概念にわたって、製品データを共有し、共通のプロセスを適用し、製品の開発について着想から寿命の終末まで企業知識を活用するのに役立つ事業戦略のことである。Dassault Systemesによって(商標CATIA、ENOVIA、およびDELMIAのもとに)提供されるPLMソリューションは、製品エンジニアリング知識を編成するエンジニアリングハブ、製造エンジニアリング知識を管理する製造ハブ、およびエンジニアリングハブと製造ハブとの両方への企業の統合および接続を可能にする企業ハブを提供する。これらを合わせて、システムは、最適化された製品定義、製造準備、生産、およびサービスを促進する動的な知識ベースの製品作成および意思決定サポートを可能にするために、製品、プロセス、リソースをリンクするオープンオブジェクトモデルを提供する。
【0003】
さらに、ディスクまたはSSDにデータを格納するデータベースとは対照的に、インメモリデータベース、すなわち、データ格納を主にメモリに依存する専用データベースにおいて、上記の設計システムおよびプログラムを適用するために、いくつかのデータベース管理用のソリューションが提供されている。そのようなデータベース管理ソリューションのうち、グラフデータベース、例えば、RDFグラフデータベースに関係付けられたソリューションは、データモデリングおよびデータ格納におけるそれらの柔軟性が大きいために特に興味深い。一般的なアプリケーションでは、RDFグラフデータベースは、数十億タプルでテラバイトのサイズの大きなデータセットを扱える必要がある(例えば、2022年5月10日に非特許文献1から取得されたMicrosoft Academic Knowledge Graphは、標準的TTLフォーマットで1.2TBのストレージを必要とする80億を超えるトリプルを有する)。当技術分野における既知のソリューションは、そのようなグラフのための(例えば、メモリ内またはディスク上の)ストレージの必要とされるサイズを低減するためのデータ圧縮技術(非特許文献2)を提案する。そのような圧縮技術は、様々な用途、特にクラウド展開において、ストレージコスト(例えば、ハードウェアコストなど)および環境フットプリントを削減するのに役立つ。
【0004】
非特許文献3は、圧縮空間におけるSPARQLソリューションをサポートするRDFインデックス技術を開示している。k2トリプル(k2-triples)と呼ばれる開示された技術は、述語(predicate)を使用して、データセットを垂直に分割して、述語ごとに1つのペア(主語(subject)、目的語(object))の互いに素なサブセットを作る。これらのサブセットは、主語×目的語のバイナリ行列として表現され、そこでは、1ビットが、データセットに対応するトリプルが存在することを意味する。このモデルは、k2ツリー(k2-trees)を使用して効率的に圧縮された非常に疎な行列をもたらす。
【0005】
非特許文献4は、グラフの特性を考慮し、四分木に基づいて圧縮を実行するアルゴリズムを開示している。さらに、データを圧縮すると共に、圧縮されたデータ自体に対してクエリを実行する技術が紹介され、詳細に論じられている。
【0006】
非特許文献5は、一時的な格納構造を使用せずにグラフを直接構築する圧縮されたバイナリツリーのインデックス付き配列に基づくストリーミンググラフのための新規なデータ構造の使用を開示している。このデータ構造は、エッジの存在(2つのノード間にエッジが存在するか?)、近傍クエリ(ノードの近傍を列挙する)、およびストリーミング操作(ノード/エッジの追加/削除)のための高速アクセス方法を提供する。
【0007】
この文脈において、RDFタプルのセットを含むグラフデータベースにRDFグラフデータを格納するための改良された方法が依然として必要である。
【先行技術文献】
【特許文献】
【0008】
【特許文献1】欧州特許出願公開第21306839.8号明細書
【非特許文献】
【0009】
【非特許文献1】https://makg.org/rdf-dumps
【非特許文献2】https://en.wikipedia.org/wiki/Data_compression
【非特許文献3】ALVAREZ-GARCIA,S.,et al.,“Compressed vertical partitioning for efficient RDF management.”,Knowledge and Information Systems,2015,vol.44,no 2,p.439-474
【非特許文献4】CHATTERJEE,A.,et al.,“Exploiting topological structures for graph compression based on quadtrees.”,In:2016 Second International Conference on Research in Computational Intelligence and Communication Networks(ICRCICN).IEEE,2016.p.192-197
【非特許文献5】NELSON,M.,et al.,“Queryable compression on streaming social networks.”,In: 2017 IEEE International Conference on Big Data(Big Data).IEEE,2017.p.988-993
【非特許文献6】“RDF 1.1 Concepts and Abstract Syntax”,W3C Recommendation 25 February 2014(or additionally the draft version RDF-star)
【非特許文献7】“RDF 1.1 N-Quads,A line-based syntax for RDF datasets”,W3C Recommendation 25 February 2014
【非特許文献8】https://www.w3.org/TR/rdf-sparql-query/#rdfDataset
【非特許文献9】Abadi,D.J.,et al.,“Scalable semantic web data management using vertical partitioning.”,In Proceedings of the 33rd international conference on Very large databases,September 2007,pp.411-422
【非特許文献10】https://en.wikipedia.org/wiki/Quadtree
【非特許文献11】https://en.wikipedia.org/wiki/Data_compression
【非特許文献12】https://en.wikipedia.org/wiki/Dictionary_coder
【非特許文献13】https://en.wikipedia.org/wiki/Radix_tree#PATRICIA
【非特許文献14】https://en.wikipedia.org/wiki/Z-order_curve
【非特許文献15】KERSTEN,T.,et al.,“Everything you always wanted to know about compiled and vectorized queries but were afraid to ask.”,Proceedings of the VLDB Endowment,2018,vol.11,no 13,p.2209-2222
【非特許文献16】https://en.wikipedia.org/wiki/Iterator
【非特許文献17】https://en.wikipedia.org/wiki/Visitor_pattern
【非特許文献18】https://en.cppreference.com/w/cpp/numeric/rotl
【非特許文献19】https://en.cppreference.com/w/cpp/numeric/popcount
【非特許文献20】https://en.wikipedia.org/wiki/Memory_management#HEAP
【非特許文献21】https://en.wikipedia.org/wiki/Iterator_pattern
【非特許文献22】https://en.wikipedia.org/wiki/Breadth-first_search
【非特許文献23】https://en.wikipedia.org/wiki/Mask_(computing)
【非特許文献24】https://www.microsoft.com/en-us/research/project/open-academic-graph/
【非特許文献25】BRISABOA,Nieves R.et al.“Compressed representation of dynamic binary relations with applications.”Information Systems,2017,vol.69,p.106-123
【非特許文献26】https://www.ebi.ac.uk/rdf/documentation/chembl/
【発明の概要】
【0010】
したがって、RDFタプルのセットを含むグラフデータベースにRDFグラフデータを格納するコンピュータ実装方法が提供される。この方法は、1つまたは複数の隣接行列を取得するステップであって、各隣接行列は、同じ述語を含むグラフデータベースのタプルのグループを表す、ステップを含む。この方法は、1つまたは複数の隣接行列の各々について、配列を含むデータ構造を格納するステップをさらに含む。配列は、各々が隣接行列の小区分を指す1つもしくは複数のインデックス、および/または各々が隣接行列のそれぞれの小区分のRDFグラフデータベースのタプルのグループを表す1つもしくは複数の要素を含む。
【0011】
この方法は、以下のうちの1つまたは複数を含み得る:
- 配列の1つまたは複数の要素の各々は、1つまたは複数の座標ペアのセットを含み、各ペアは、隣接行列におけるそれぞれの座標を表す;
- 1つまたは複数の要素のうちの要素は、32ビットインデックスのデータ構造を備え、そのレイアウトが、データ構造のサイズおよび/またはタイプを表すタグと、隣接行列の行および列を含む座標の1つまたは複数のペアとを含む;
- 1つまたは複数の要素のうちの要素は、16ビットインデックスのデータ構造を備え、そのレイアウトは、データ構造のサイズおよび/またはタイプを表すタグと、隣接行列のベース列、ベース行、オフセット列、およびオフセット行を含む座標の1つまたは複数のペアとを含む;
- 1つまたは複数の要素のうちの要素は、8ビットインデックスのデータ構造を備え、そのレイアウトは、データ構造のサイズおよび/またはタイプを表すタグと、隣接行列のベース列、ベース行、オフセット列、およびオフセット行を含む座標の1つまたは複数のペアとを含む;
- 1つまたは複数の要素のうちの要素は、mビットインデックスのデータ構造を備え、この方法は、要素に対応するタグを、座標の1つまたは複数のペアに基づいて決定するステップをさらに含み、タグは、データ構造のサイズおよび/またはタイプを表す;
- 格納されたデータ構造は、隣接行列のそれぞれの小区分におけるRDFタプルのグループのビットマップ表現のビット配列(BM)をさらに含む;
- 格納されたデータ構造の配列は、サイズ2×2の2次元配列またはサイズ22nの1次元配列であり、nは正の整数である;
- データ構造を格納するステップは、スロットを割り当て、それにより、ルートインデックスを取得するステップであって、ルートインデックスはメモリ内のツリーデータ構造の位置を表す、ステップと、ルートインデックスにおける配列を座標ペアの配列に設定するステップとを含む;
- RDFグラフを格納する方法は、RDFグラフデータベース上で以下の関数のうちの1つまたは複数を実装するステップをさらに含み、各関数は、1つまたは複数の隣接行列の各隣接行列に適用されるように構成される:
○ 隣接行列の所与のセルが第1の指定された値に設定されているかどうかをチェックするように構成された関数(Test)、
○ 隣接行列の所与のセルを第1の指定された値に設定するように構成された関数(Set)、
○ 隣接行列の所与のセルを第2の指定された値に設定するように構成された関数(Reset)、
○ 第1の指定された値で隣接行列のすべてのセルのそれぞれの座標を出力するように構成された関数(ScanAll)、
○ 第1の指定された値で隣接行列の所与の行のセルのそれぞれの座標を出力するように構成された関数(ScanRow)、および/もしくは
○ 第1の指定された値で隣接行列の所与の列のセルのそれぞれの座標を出力するように構成された関数(ScanColumn);ならびに/または
- 1つまたは複数の隣接行列を取得するステップは、グラフデータベースの各述語について垂直分割を実行するステップを含む。
【0012】
さらに、本方法を実行するための命令を含むコンピュータプログラムが提供される。
【0013】
さらに、コンピュータプログラムを記録したコンピュータ可読記憶媒体が提供される。
【0014】
さらに、メモリに結合されたプロセッサと、コンピュータプログラムを記録したメモリとを備えるシステムが提供される。
【図面の簡単な説明】
【0015】
次に、非限定的な例が添付図面を参照して説明される。
図1】本方法の例のフローチャートである。
図2】システムの例を示す図である。
図3A】本方法による32バイトデータ構造の例を示す図である。
図3B】本方法による32バイトデータ構造の例を示す図である。
図4】本方法による16バイトデータ構造の例を示す図である。
図5】本方法による8バイトデータ構造の例を示す図である。
図6A】最大容量に対するインデックスサイズの比較効果を示す図である。
図6B】最大容量に対するインデックスサイズの比較効果を示す図である。
【発明を実施するための形態】
【0016】
図1のフローチャートを参照して、RDFタプルのセットを含むグラフデータベースにRDFグラフデータを格納するコンピュータ実装方法が提案される。この方法は、1つまたは複数の隣接行列を取得するステップと、1つまたは複数の隣接行列の各々について、配列を含むデータ構造を格納するステップとを含む。各隣接行列は、同じ述語(predicate)を含むグラフデータベースのタプルのグループを表す。配列は、各々が隣接行列の小区分(sub-division)を指す1つもしくは複数のインデックス、および/または各々が隣接行列のそれぞれの小区分のRDFグラフデータベースのタプルのグループを表す1つもしくは複数の要素を含む。以下に詳細に論じられる方法の例では、この方法は、ツリーの中間ノードが2次元固定サイズ配列として見られ得るツリー状のデータ構造を提示することができる。この配列は、それぞれの葉を識別するための値を含むことができる。
【0017】
そのような方法は、まず、RDFグラフデータベースのタプルを表す1つまたは複数の隣接行列を取得する取得によって、RDFグラフデータベースを格納する際の改良された解決策を提供する。具体的には、各隣接行列が1つのグラフのみを表し得るので、タプルはトリプルであり得る。1つまたは複数の隣接行列のそのような取得が、データベースの垂直分割を構成する。それ自体知られているように、隣接行列は、主語、述語、および/または目的語の数に関係付けられたサイズのバイナリ行列(すなわち、2つの値、例えば、0および1を有する要素を持つ行列)であり、1ビットは、(例えば、隣接行列のそれぞれの述語の)対応するトリプルがRDFデータセットに存在することを意味する。述語についての隣接行列のサイズは、述語のRDFタプルの主語に目的語を乗じるサイズであり得る。第2に、本方法は、各インデックスが隣接行列の小区分を指す1つもしくは複数のインデックス、および/または各々が隣接行列のそれぞれの小区分のRDFグラフデータベースのタプルのグループを表す1つもしくは複数の要素の配列を含むデータ構造として、1つまたは複数の隣接行列の各々を格納することによって、改良された解決策を提供する。そのような配列により、本方法は、各隣接行列の1つまたは複数の小区分に関係付けられたデータを格納することができる。それにより、本方法は、グラフデータベースにRDFグラフデータを格納することを、効率的に隣接行列を圧縮するデータ構造をデータベースに格納することによって改善する。「グラフデータベースにRDFグラフデータを格納すること」は、RDFグラフとしてモデル化されたデータ(すなわち、RDFデータセット)をグラフデータベースに格納することを意味する。RDFグラフは、それぞれのデータを表現/モデル化するデータの1つまたは複数のグラフであり得る。データベースおよびRDFについては、以下でさらに説明される。他方で、本方法は、単に静的すなわち読取り専用メモリのために設計された方法とは対照的に、動的(すなわち、格納されたデータベース上で読取り/書込み操作ができる)を可能にしながら、そのような能力を提供する。
【0018】
本方法がツリー状データ構造を提示する例では、上述されたように、各中間ノードは2次元固定サイズ配列であり得る。中間ノードに対するそのような固定サイズ2次元配列は、データ構造に含まれる配列を少なくとも部分的に形成することができる。より具体的には、そのような固定サイズ2次元配列は、それぞれが隣接行列の小区分を指す1つまたは複数のインデックスを含むことができる。「データベース」は、検索および取出しのために編成されたデータ(すなわち情報)の任意のコレクション(例えば、グラフ指向データベース)を意味する。当技術分野で知られているように、グラフ指向データベースは、グラフ理論を使用したオブジェクト指向データベースであり、したがって、ノードおよび弧を有し、データが表現および格納されることを可能にする。グラフは、ストア内のデータアイテムを、ノードとエッジのコレクションに関係付け、エッジは、ノード間の関係を表している。この関係は、ストア内のデータが互いに直接リンクされることを可能にし、多くの場合、1つの操作でデータが取り出されることを可能にする。グラフデータベースは、暗黙の接続によってデータをリンクする他のデータベースモデル(例えば、リレーショナルデータベース)とは対照的に、データ間の関係を優先的に保持する。メモリ(例えば、永続メモリ)上に格納された場合、グラフデータベースは、コンピュータによる迅速な検索および取出しを可能にする。特に、グラフデータベースは、様々なデータ処理操作と関連して、関係の高速な取出し、修正、および削除をするために構造化されている。グラフ指向データベースはグラフデータベースとも呼ばれ、「グラフ指向データベース」と「グラフデータベース」という表現は同義語である。
【0019】
例では、グラフデータベースはRDFグラフデータベースであり得る。RDFグラフは、グラフの格納および取出しに使用される従来のデータモデルである。RDFグラフは、有向のラベル付きグラフデータフォーマットである。そのようなフォーマットは、ウェブにおいて情報を表現するために広く使用されている。グラフとして情報のRDF表現を指定するための標準仕様がW3Cによって公表されている(例えば、非特許文献6参照)。RDFグラフデータベースは何十億のタプルを有することがあり、例えば、Uniprotデータセットはタンパク質配列および機能情報のリソースである。
【0020】
使用される抽象構文のコア構造は、タプルのセットであり、各タプルは述語を含む。そのようなRDFタプルのセットはRDFグラフと呼ばれる。
【0021】
例では、RDFタプルは、ノードおよびエッジを含む3つまたは4つの要素を含むことがある。例では、各RDFタプル(または各RDFタプルの要素)は、主語、述部、および目的語を含むトリプルであり得る。そのような例では、RDFグラフは、ノードおよび有向弧図として視覚化されてよく、そこでは、各トリプルは、ノード-弧-ノードリンクとして表される。あるいは、RDFトリプルは、主語と目的語である2つのノードと、それらを接続する述語である弧によって視覚化されてよい。
【0022】
例では、RDFタプルは、RDFクワッドであり得る。RDFクワッドは、RDFトリプルにグラフラベルを加えることによって得られる場合がある。そのような例では、RDFタプルはRDFグラフを含む。RDFクワッド(N-Quadsとも呼ばれる)を指定するための標準仕様がW3Cによって公表されている(例えば、非特許文献7参照)。RDFクワッドは、RDFトリプルにグラフ名を追加することで得られる場合がある。グラフ名は、空(すなわち、デフォルトもしくは無名グラフ)またはIRI(すなわち、グラフIRIのいずれかであってよい。例では、グラフの述語はグラフIRIと同じIRIを有することがある。各クワッドのグラフ名は、それぞれのRDFデータセットにおいてそのクワッドが部分であるグラフである。RDFデータセットは、それ自体知られているように、グラフのコレクションを表す(例えば、非特許文献8参照)。以下では、RDFタプル(またはタプル)という用語は、一方または他方の使用が明示的に言及されていない限り、RDFトリプルまたはRDFクワッドを無差別に指す。
【0023】
グラフデータベースのクエリエンジンについて可能な最適化は、グラフデータベースが開世界(Open World)または閉世界(Closed World)と相互作用しているという仮定に影響される。それ自体知られているように、知識表現に使用される論理の形式的システムにおいて、開世界仮説(OWA)とは、文の真理値は、それが真であると知られているかどうかにかかわらず真であり得るという仮定である。これは、真であるいかなる文も真であることが知られていることが成り立つ閉世界仮説の逆である。他方で、閉世界システムでは、すべてのものを配置するために場所を必要とする(例えば、フレーム上のスロット、OOクラス上のフィールド、またはDB内の列)。OWAは、デフォルトで不完全な情報を仮定しており、意図的に不完全な指定をして、他者が再利用および拡張することを可能にする。セマンティックウェブは、再利用可能な形式の分散された知識およびデータである、コンピュータに理解可能なウェブの構想であり、RDFは、セマンティックウェブについてのW3C勧告であり、開世界仮説に従っている。それは、データモデル化およびデータ格納における柔軟性を高めることを可能にする。しかし、SQLを用いた関係モデルと同様に、閉世界仮説の制約は、どのようにデータが格納されるかについてより多くの情報を提供するので、クエリ最適化にとって有用である。例では、クエリはSPARQLクエリである。SPARQLは、RDFデータの問い合わせについてのW3C勧告であり、RDFトリプルのパターン上に構築されたグラフマッチング言語である。「RDFタプルのパターン」は、RDFグラフによって形成されるパターン/テンプレートを意味する。言い換えれば、RDFタプルのパターンは、RDFグラフ(すなわち、RDFトリプルのセット)であり、そこでは、グラフの主語、述部、目的語、またはラベルが(クエリのための)変数で置き換えられることが可能である。SPARQLは、データがRDFとしてネイティブに格納されるか、またはミドルウェアを介してRDFとして見られるかにかかわらず、多様なデータソースわたってクエリを表現することができるRDFデータ用のクエリ言語である。SPARQLは主にグラフ準同型に基づいている。グラフ準同型は、2つのグラフの間のそれらの構造を尊重するマッピングである。より具体的には、隣接する頂点を隣接する頂点に対してマッピングする、2つのグラフの頂点セット間の関数である。
【0024】
SPARQLは、必要とされるグラフパターンおよび任意選択のグラフパターンをそれらの論理積および論理和と共に問い合わせる能力を含む。SPARQLはまた、集約、サブクエリ、否定、式による値の生成、拡張可能な値テスト、およびソースRDFグラフによるクエリの制約もサポートする。これは、SPARQLクエリが、SPARQLにおいて可能な8つの異なるトリプルパターンに対して応答する必要があることを意味する。そのような8つのトリプルパターンは、(S,P,O)、(S,?P,O)、(S,P,?O)、(S,?P,?O)、(?S,P,O)、(?S,?P,O)、(?S,P,?O)、および(?S,?P,?O)を含み、パターンにおいて変数に記号?が先行する。変数は、トリプルパターンの出力であり、SPARQLクエリの出力であり得る。いくつかの例では、変数は、SELECTクエリの出力であり得る。SPARQLクエリの出力は、変数(例えば、合計などのアグリゲータ)を使用して構築され得る。クエリにおける変数は、グラフ準同型(すなわち、クエリの結果を得るために必要な中間ノード)を構築するために使用され得る。いくつかの例では、クエリにおける変数は、出力にも中間結果にも使用されなくてよい。基本グラフパターン(BGP)は、上記で説明された8つのトリプルパターンのうちの1つであってよい。さらに、BGPは、クエリ変数としてグラフのラベルをさらに有するクワッドパターンであってもよい。本方法がタプルのグループの表現として1つまたは複数の隣接行列をそれぞれ取得する特定の例では、主語と目的語が1つの隣接行列上で問い合わされ得る。言い換えれば、これらの特定の例では、BGPは、(S,O)、(S,?O)、(?S,O)、および(?S,?O)のいずれかであり得る。SPARQLは、いくつかのBGPおよび場合によっては他の演算子の結果を結合することによって、より複雑なクエリを構築し得る。したがって、競争力のあるSPARQLエンジンは、少なくとも、高速なトリプルパターン解法および効率的な結合方法を必要とする。さらに、BGPにおいて結合される中間結果の量を最小化する効率的な実行プランを構築するために、クエリオプティマイザが必要とされる。
【0025】
例では、グラフデータベースが既存のトリプルストアを有する。トリプルストア(RDFストアとも呼ばれる)は、当技術分野で知られているように、セマンティッククエリを介したトリプルの格納および取出しのための専用データベースである。トリプルストアは、少なくとも、上述されたSPARQLの8つの基本トリプルパターンに対して応答することができる。それは、トリプルパターンと共にフィルタリング制約(例えば、「x>5」)にも応答し得る。そのようなトリプルストアは、クエリエンジンによりSPARQLクエリが実行されるストレージエンジンであると考えられる。ストレージエンジン(「データベースエンジン」とも呼ばれる)は、当技術分野で知られているように、データベースからデータの作成(Create)、読取り(Read)、更新(Update)および削除(Delete)(CRUD)をするためにデータベース管理システム(DBMS)が使用する基本的ソフトウェアコンポーネントである。
【0026】
図1に戻ると、ステップS10において、本方法は、1つまたは複数の隣接行列を取得するステップであって、各隣接行列は、同じ述語を含むグラフデータベースのタプルのグループを表す、ステップを含んでいる。例では、1つまたは複数の隣接行列を取得するステップは、グラフデータベースの各述語について垂直分割を実行するステップを含む。本方法は、当分野で知られているように、例えば、非特許文献9に説明されているように、垂直分割を実行することができる。垂直分割を実行することによって1つまたは複数の隣接行列を取得するステップは、グラフデータベースを取得するステップ、および取得されたグラフデータベース上で垂直分割を実行するステップを含むことができる。「グラフデータベースを取得するステップ」は、このデータベースを本方法に提供することを意味する。例では、そのような取得することまたは提供することは、データベースを(例えば、オンラインデータベースもしくはオンラインクラウドから)ダウンロードすること、またはこのデータベースをメモリ(例えば、永続メモリ)から取り出すことのいずれかを意味することができるか、または含むことができる。
【0027】
ステップS20において、本方法は、1つまたは複数の隣接行列の各々について、配列を含むデータ構造を格納する。例では、格納されたデータの配列は、サイズ2×2の2次元配列またはサイズ22nの1次元配列であり、nは正の整数である。特定の例では、nの値は2に等しいことがある。このnの選択により、現代のプロセッサのキャッシュラインサイズに容易に合わせられる比較的小さいサイズのノードを作り、それによって、キャッシュラインに適合されるデータ構造の適用を改善する。さらに、そのような選択は、n=1の場合のlog4の複雑さではなくlog16の複雑さを有するアルゴリズム(後述されるようなTest、Set、Resetなど)を提供する。
【0028】
例では、データ構造を格納するステップが、スロットを割り当て、それにより、ルートインデックスを取得するステップを含むことができる。ルートインデックスはメモリ内のツリーデータ構造の位置を表す。格納するステップは、ルートインデックスにおける配列を座標ペアの配列に設定するステップをさらに含むことができる。言い換えれば、これらの例によれば、(下記で説明される)タイプV32の空のルートノードと共に空のデータ構造が(例えば、メモリ内に)作成されてよく、一方、この第1のノードの位置は、本方法がメモリ内でこの第1のノードの位置を特定することが可能なように、「ルートインデックス」によって表される。
【0029】
上記に論じられたように、格納された配列は、各々が隣接行列の小区分を指す1つもしくは複数のインデックス、および/または各々が隣接行列のそれぞれの小区分のRDFグラフデータベースのタプルのグループを表す1つもしくは複数の要素を含む。言い換えれば、格納された配列は、各隣接行列の小区分の相対的位置を定義するインデックス、および/または隣接行列のそれぞれの小区分のRDFグラフデータベースのタプルのグループの直接的表現を格納することができる。例では、1つまたは複数のインデックスの各々が32ビットサイズであってよい。そのような例では、上述された正の整数nの値が2に等しいとき、格納された配列は、2×2×32ビット=64バイトの最大サイズとなる。そのような格納された配列は、後述されるツリー状構造で同等に呼ばれることがある。
【0030】
例では、本方法による格納されたデータベースは、各隣接行列を表すように構成されたツリー状データ構造を表すことができる。そのような例では、データ構造は、1つまたは複数のノードを含むことができ、ここで、各ノードは、1つもしくは複数のノードおよび/または1つもしくは複数の葉に接続されている。ツリー状データ構造は、四分木データ構造である(それに類似する)ことがある。四分木は、各内部ノードが正確に4つの子を有するツリーデータ構造である。四分木は、八分木の2次元アナログであり、ほとんどの場合、2次元空間を4つの象限または領域に再帰的に細分化することによって分割するために使用される(非特許文献10参照)。
【0031】
例では、本方法は、RDFグラフデータベース上で以下の関数のうちの1つまたは複数を実装するステップをさらに含むことができる。以下の関数の各々は、1つまたは複数の隣接行列の各隣接行列に適用されるように構成され得る:隣接行列の所与のセルが第1の指定された値に設定されているかをチェックするように構成された(「Test」関数と呼ばれる)関数、隣接行列の所与のセルを第1の指定された値に設定するように構成された(「Set」関数と呼ばれる)関数、隣接行列の所与のセルを第2の指定された値に設定するように構成された(「Reset」関数と呼ばれる)関数、第1の指定された値で隣接行列のすべてのセルのそれぞれの座標を出力するように構成された(「ScanAll」関数と呼ばれる)関数、第1の指定された値で隣接行列の所与の行のセルのそれぞれの座標を出力するように構成された(「ScanRow」関数と呼ばれる)関数、および/または第1の指定された値で隣接行列の所与の列のセルのそれぞれの座標を出力するように構成された(「ScanColumn」と呼ばれる)関数。
【0032】
例では、配列の1つまたは複数の要素の各々は、1つまたは複数の座標ペアのセットを含み、各ペアは、隣接行列におけるそれぞれの座標を表す。隣接行列におけるそれぞれの座標のそのような表現は、(例えば、V32サブタイプにおける)座標の直接的表現であってよく、または(例えば、ベースおよびベースに対するオフセットを使用する、V16およびV8における)座標の間接的表現であってもよい。
【0033】
上述された要素のメモリレイアウトの例がここで論じられる。「メモリレイアウト」または「レイアウト」は、データがメモリまたはファイルに格納される組織的な様式を意味する。本明細書で以下に論じられるように、メモリレイアウトの各例(または種類)は、メモリレイアウトの別の例とは異なるサイズのインデックス、例えば32、16、または8ビットのインデックスを使用してよい。各インデックスは、座標のペアにおける1つの座標に関連付けられ得る。格納されたデータ構造がツリーデータ構造(例えば、四分木データ構造)を表す例では、メモリレイアウトの各種類は、ツリーにおける葉ノードの種類を表し得る。格納されたデータベースに異なるメモリレイアウト(各々が異なるインデックスサイズを有する)を統合することは、格納されたデータ構造(または同等に、対応するツリーの葉ノード)を、挿入されたデータのボリューム(すなわちサイズ)に適合させ、したがって、スペース効率を犠牲にすることなく良好なクエリ時間を維持することによって、グラフデータをグラフデータベースに格納するための改良された解決策を構成する。本方法は、順序に従って、例えば、当分野で知られているように、モートン順序(またはモートン符号/エンコード)に基づいて、最適化された挿入順序に従って、データ構造を格納するための順序付けを設定することができる。モートン符号化による挿入(すなわち、主語および目的語の挿入)は、中間ノードの修正の回数を最小限にする。
【0034】
例では、1つまたは複数の要素のうちの要素は、V32レイアウトと呼ばれるレイアウトを有する32ビットインデックスのデータ構造を備える。各32ビットインデックスは32ビットのサイズである。サイズは、本明細書では、幅またはビットフィールド幅と同等に呼ばれることがある。「32ビットインデックスのデータ構造」は、各々がインデックスの役割をする複数の32ビット整数のベクトル/配列を含むデータ構造を意味する。V32レイアウトは、特に、隣接行列の行および列を含む座標の1つまたは複数のペアを含み得る。そのような場合、32ビットインデックスの各々は、座標のペアにおける座標であり、すなわち、インデックスは隣接行列の行または列を表す。さらに言い換えれば、各行インデックスは32ビットのサイズであり、各列インデックスは32ビットのサイズである。
【0035】
V32レイアウトは、データ構造の最大サイズを示す固定最大容量または同等の複数の整数の数によってさらに定義され得る。例では、レイアウトのサイズは、例えば上述のような(1次元/2次元)配列の形式で、格納された1つまたは複数のインデックスのサイズ(すなわち、中間ノードのサイズ)よりも小さくてよい。
【0036】
いくつかの例では、V32レイアウトは、データ構造のサイズおよび/または(固定最大サイズに対応する)最大サイズ(すなわち、データ構造を表すベクトル)を表すタグを含むことができる。タグはさらに、データ構造のタイプ(すなわち、V32タイプ)を表すことができる。あるいは、本方法は、要素に対応するタグを決定することができる。例えば、ツリー状構造において、本方法は、ツリー内の要素に対するそれぞれのノードのそれぞれの深さに基づいて、タグを決定することができる。そのような代替形態は、タグをV32レイアウト(例えばヘッダ)に格納するために割り当てられたサイズを解放し、それにより、必要なストレージの最適化と同等であるレイアウトの最大容量の増加をすることによって、さらに改良された解決策を構成する。
【0037】
図3Aおよび図3Bを参照して後述されるV32データ構造の例では、格納される配列のサイズは64バイトであり、メモリレイアウトは、第1の行に格納されるメタデータ(すなわち、VECTOR_LEAF、V32TAG、サイズ(size)、最大サイズ(maxSize))のために8バイトを予約する。それにより、メモリレイアウトは、各ペアが64ビットである7つまでのペアの座標を格納することができる。
【0038】
例では、1つまたは複数の要素の要素は、V16レイアウトと呼ばれるレイアウトを有する16ビットインデックスサイズのデータ構造を備える。各16ビットインデックスは16ビットのサイズであってよい。上述されたように、「16ビットインデックスのデータ構造」は、各々がインデックスの役割をする複数の16ビット整数のベクトル/配列を含むデータ構造を意味する。V16レイアウトは、特に、隣接行列のベース列、ベース行、オフセット列、およびオフセット行を含む座標の1つまたは複数のペアを含み得る。そのような場合、16ビットインデックスの各々は、座標のペアにおける1つの座標を表し、すなわち、隣接行列のベース列、ベース行、オフセット列、またはオフセット行を表す。さらに言い換えれば、ベース列インデックス、ベース行インデックス、オフセット列インデックス、およびオフセット行インデックスの各々は、16ビットのサイズである。
【0039】
V16レイアウトは、データ構造の最大サイズを示す固定最大容量または同等の複数の整数の数によってさらに定義され得る。V16レイアウトの最大容量は、上述されたV32レイアウトの最大容量と同じであり得る。
【0040】
いくつかの例では、V16レイアウトは、データ構造のサイズおよび/または(固定最大サイズに対応する)最大サイズを表すタグを含むことができる。タグはさらに、データ構造のタイプ(すなわち、V16タイプ)を表すことができる。あるいは、本方法は、要素に対応するタグを決定することができる。例えば、ツリー状構造において、本方法は、ツリー内の要素に対するそれぞれのノードのそれぞれの深さに基づいて、タグを決定することができる。V32に関して上述されたように、そのような代替形態が改良された解決策を構成する。
【0041】
図4を参照して後述されるV16データ構造の例では、メモリレイアウトは、24ペアまでの座標および/または2×2サイズの変換された部分行列内に制約され得る座標のペアのそれぞれの値を格納することができる。メモリレイアウトは、13ペアまでの座標および/または216×216サイズの変換された部分行列内に制約され得る座標のペアのそれぞれの値を格納することができる。言い換えれば、変換された部分行列の場合、座標ペアr,cは(Rbase*216)+Ro,(Cbase*216)+Coとして計算される。ここで、RoおよびCoは16ビットに制約され、すなわち、RoおよびCoは、0と216-1との間である。さらに、部分行列変換は、2アライメントされる。
【0042】
例では、1つまたは複数の要素のうちの要素は、V8レイアウトと呼ばれるレイアウトを有する8ビットインデックスのデータ構造を備える。各8ビットインデックスは8ビットのサイズである。上述されたように、「8ビットインデックスのデータ構造」は、各々がインデックスの役割をする複数の8ビット整数のベクトル/配列を含むデータ構造を意味する。V8レイアウトは、特に、隣接行列のベース列、ベース行、オフセット列、およびオフセット行を含む座標の1つまたは複数のペアを含み得る。V8レイアウトの各葉について、1つのベース行、1つのベース列、ならびに1つまたは複数のオフセット行およびオフセット列ペアがある。そのような場合、8ビットインデックスの各々は、座標のペアにおける1つの座標を表し、すなわち、隣接行列インデックスのベース列、ベース行、オフセット列、またはオフセット行を表す。さらに言い換えれば、ベース列インデックス、ベース行インデックス、オフセット列インデックス、およびオフセット行インデックスの各々は、8ビットのサイズである。
【0043】
V8レイアウトは、データ構造の最大サイズを示す固定最大容量、または同等の複数の整数の数によってさらに定義され得る。V8レイアウトの最大容量は、上述されたV32およびV16レイアウトの最大容量と同じであり得る。
【0044】
いくつかの例では、V8レイアウトは、データ構造のサイズおよび/または(固定最大サイズに対応する)最大サイズを表すタグを含むことができる。タグはさらに、データ構造のタイプ(すなわち、V8タイプ)を表すことができる。あるいは、本方法は、要素に対応するタグを決定することができる。例えば、ツリー状構造において、本方法は、ツリー内の要素に対するそれぞれのノードのそれぞれの深さに基づいて、タグを決定することができる。V32およびV16に関して上述されたように、そのような代替形態が改良された解決策を構成する。
【0045】
図5を参照して後述されるV8データ構造の例では、V8レイアウトは、データ構造のサイズを表すタグと、隣接行列のベース列、ベース行、オフセット列、およびオフセット行を含む座標の1つまたは複数のペアとを含む。V8レイアウトの各葉について、1つのベース行、1つのベース列、ならびに1つまたは複数のオフセット行およびオフセット列ペアがある。V16の場合で説明したように、V8では、座標のペアのそれぞれの値は、2×2サイズの変換された部分行列内に制約され得る。
【0046】
具体的には、V32、V16、およびV8レイアウトは、同じ最大容量を有する同じパターンの変形、すなわち、V<nn>、ここで、nnは32、16、または8と考えられ得る。パラメータnnは単にmと表示されてもよい。32、16、および8以外のnnの他の値が使用されてもよい。V<nn>は座標のベクトルであり、1つまたは複数の座標オフセットがnnビットを使用して格納され、ベース座標が32-nnビットを使用して格納される。32ビット座標は、(すなわち、ビット単位演算(base<<nn)|offsetに従って、)ベースとオフセットを組み合わせることによって抽出される。V<nn>レイアウトの例では、行と列のペア(それぞれ32ビットインデックス)が与えられると、行および列の最下位nnビットがオフセットとして格納されると共に、行および列の上位ビットが共有される(すなわち、ベース)。V32レイアウトの場合、共有すべきビットが0であるため、上位ビットを格納する必要がない。
【0047】
nnがデータ構造に格納されるインデックスのビットである、一般的なV<nn>タイプの例では、データ構造は、上述されたV32、V16、およびV8の例と同じサイズ、最大サイズ、および/またはデータ構造のタイプ(すなわち、V<nn>タイプまたはnnの値)を表すタグをさらに含むことができる。あるいは、本方法は、要素に対応するタグを決定することができる。(上述されたV32、V16、およびV8のいずれにも適用可能な)例では、タグの決定は座標のペアに基づいてよい。例では、本方法は、ノードによって保持できる変換された部分行列のサイズ、および/またはノードに格納されるべき座標のペアの数によって、タグを決定することができる。例えば、ツリー状構造において、本方法は、(上記された変換された部分行列および/または格納されるべき座標のペアの数に関係付けられ得る)ツリー内の要素に対するそれぞれのノードのそれぞれの深さに基づいて、タグを決定することができる。上述されたように、そのような代替形態は、タグを(例えばヘッダに)格納するために割り当てられたサイズを解放し、それにより、必要なストレージの最適化と同等であるレイアウトの最大容量の増加をすることによって、さらに改良された解決策を構成する。
【0048】
上述された例のいずれかと組み合わせ可能な例では、格納されたデータ構造は、隣接行列のそれぞれの小区分におけるRDFタプルのグループのビットマップ表現のビット配列をさらに含むことができる。それ自体知られているように、「ビットマップ」は、整数などの1つのシステムからビットへのマッピングを意味する。それは、ビットマップインデックスまたはビット配列としても知られている。これは、ビットマップ表現がより小さなサイズで1つまたは複数の要素の表現を形成するため、改良された解決策を構成する。したがって、ビット配列を含む本方法の例は、メモリコストをさらに最適化する。
【0049】
本方法は、コンピュータに実装される。これは、本方法のステップ(または実質的にすべてのステップ)が、少なくとも1つのコンピュータまたは任意の同様のシステムによって実行されることを意味する。したがって、本方法のステップは、コンピュータによって、場合によっては完全に自動的に、または半自動的に実行される。例では、本方法の少なくともいくつかのステップのトリガは、ユーザとコンピュータの対話を通じて実行され得る。必要とされるユーザとコンピュータの対話のレベルは、予測される自動化のレベルに応じ得、ユーザの希望を実装する必要性とバランスがとられてよい。例では、このレベルはユーザ定義および/または事前定義され得る。
【0050】
方法のコンピュータ実装の典型的な例は、この目的に適合されたシステムで方法を実行することである。システムは、メモリおよびグラフィカルユーザインターフェース(GUI)に結合されたプロセッサを備えることができ、メモリは、本方法を実行するための命令を含むコンピュータプログラムを記録している。メモリはデータベースを格納することもできる。メモリは、そのような格納に適合された任意のハードウェアであり、場合によっては、いくつかの物理的に異なる部品(例えば、プログラム用に1つ、および場合によってはデータベース用に1つ)を備える。
【0051】
図2は、システムの例を示し、システムは、クライアントコンピュータシステム、例えば、ユーザのワークステーションである。
【0052】
この例のクライアントコンピュータは、内部通信バス1000に接続された中央処理装置(CPU)1010、さらにバスに接続されたランダムアクセスメモリ(RAM)1070を含む。クライアントコンピュータは、バスに接続されたビデオランダムアクセスメモリ1100に関連付けられたグラフィック処理装置(GPU)1110がさらに設けられている。ビデオRAM1100は、当技術分野でフレームバッファとしても知られている。マスストレージデバイスコントローラ1020は、ハードドライブ1030などのマスメモリデバイスへのアクセスを管理する。コンピュータプログラム命令およびデータを有形に具現化するのに適したマスメモリデバイスは、すべての形態の不揮発性メモリを含み、例として、EPROM、EEPROM、およびフラッシュメモリデバイスなどの半導体メモリデバイス、内蔵ハードディスクおよび取外し可能ディスクなどの磁気ディスク、ならびに光磁気ディスクを含む。上記のいずれも、特別に設計されたASIC(特定用途向け集積回路)に補完され、または組み込まれ得る。ネットワークアダプタ1050は、ネットワーク1060へのアクセスを管理する。クライアントコンピュータは、カーソル制御デバイスまたはキーボードなどのハプティックデバイス1090を含むこともできる。カーソル制御デバイスは、クライアントコンピュータにおいて、ユーザがディスプレイ1080上の任意の所望の位置にカーソルを選択的に配置できるように使用される。加えて、カーソル制御デバイスは、ユーザが様々なコマンドを選択し制御信号を入力することを可能にする。カーソル制御デバイスは、システムに制御信号を入力するためのいくつかの信号生成デバイスを含む。典型的には、カーソル制御デバイスはマウスであり、マウスのボタンが、信号を生成するために使用されることがある。代替的または追加的に、クライアントコンピュータシステムは、センシティブパッドおよび/またはセンシティブスクリーンを備えることができる。
【0053】
コンピュータプログラムは、コンピュータによって実行可能な命令を含むことができ、命令は、上記システムに本方法を実行させるための手段を含む。プログラムは、システムのメモリを含む任意のデータ記憶媒体に記録可能であり得る。プログラムは、例えば、デジタル電子回路、もしくはコンピュータハードウェア、ファームウェア、ソフトウェア、またはそれらの組み合わせに実装され得る。プログラムは、装置として、例えば、プログラマブルプロセッサによる実行のために機械可読ストレージデバイスに有形に具現化された製品として実装され得る。方法ステップは、入力データを操作して出力を生成することによって本方法の機能を実行する命令のプログラムをプログラム可能なプロセッサが実行することによって実行され得る。したがって、プロセッサは、データストレージシステム、少なくとも1つの入力デバイス、および少なくとも1つの出力デバイスからデータおよび命令を受信し、またそれらにデータおよび命令を送信するように、プログラム可能に結合され得る。アプリケーションプログラムは、高水準手続きプログラミング言語もしくはオブジェクト指向プログラミング言語で、または必要に応じてアセンブリ言語もしくは機械言語で実装され得る。いずれの場合も、言語はコンパイル言語またはインタプリタ言語であり得る。プログラムは、完全インストールプログラムまたは更新プログラムであり得る。いずれの場合も、システムへのプログラムの適用が、本方法を実行するための命令をもたらす。あるいは、コンピュータプログラムは、クラウドコンピューティング環境のサーバに格納され実行されてもよく、サーバは、1つまたは複数のクライアントとネットワークを介して通信する。そのような場合、処理ユニットは、プログラムに含まれる命令を実行し、それにより、クラウドコンピューティング環境上で本方法が実行されるようにする。
【0054】
ここで、本方法の上述された例の実装が論じられる。
【0055】
実装は、非常に大きなデータセットを扱える必要があるRDFデータベースに関係付けられる。RDFはナレッジグラフを表現するためのW3C標準である。ナレッジグラフは、何十億個ものトリプルを有することができる(例えば、MAG、Uniprot)。利用可能なRDFデータの量の爆発的な増大、および結果としてのグラフデータベースのサイズの増大が、そのようなデータソースを探索、問い合わせ、理解する必要性をもたらしている。
【0056】
そのようなグラフの格納サイズを(メモリ内またはディスク上で)縮小することは、クラウド展開におけるコストおよび環境フットプリントを低減するために重要である。そのため、データ圧縮(非特許文献11参照)、より正確にはグラフの圧縮(すなわち、RDFトリプルによって表現されるグラフデータの圧縮)が、実装を活用する際に重要な概念となる。
【0057】
実装は、グラフを表現するために垂直分割を使用することを含む。この方式を使用したRDFグラフの表現では、各述語はそれ自体がグラフであり、このとき、主語および目的語がノードであり、述語がエッジである、表現となる。これらのグラフは、n個の隣接行列と見なされ得る。したがって、グラフを圧縮することは、効率的に圧縮された隣接行列に対するデータ構造を使用することを意味する。この方向において、実装はさらに、入力値がデータ圧縮の最初のステップとして整数キーに符号化される辞書符号化(非特許文献12参照)を含む。これは、隣接行列が文字列の代わりに整数を操作することを意味する。
【0058】
実装は、非常に大きなRDFグラフを圧縮する目的で整数の隣接行列を表すために使用されるデータ構造の分野に特に関係付けられる。これは、スペース効率的なグラフ表現の分野で行われる。実装において、グラフ(すなわちグラフデータベース)は、特に動的なことがあり、それは修正されることが可能であり、読取り専用ではないことを意味する。実装による格納されたデータベースは、データベースに格納されたデータを解凍することなく問い合わされ得る。
【0059】
より具体的には、実装は、非常に大きな行列にスケールする整数の隣接行列として表現される動的RDFグラフのスペース効率的な表現を提供する。これは、そのような格納されたグラフデータベースの走査の経過時間が悪化せず、(読取り最適化されたデータ構造と比較して)表現が依然としてスペース効率的であることを意味する。
【0060】
特に実装は、XAMTreeと呼ばれるデータ構造を開示し、これは(2次元スペースを4つの象限に細分化することにより分割するという意味で)四分木データ構造の一般的分野で行われ、非特許文献3に記載されているK2-Treeのようなパトリシアトライ(非特許文献13参照)のいくつかの特徴を共有する。四分木は、効率的空間検索に関して興味深く、パトリシアツリーはそれらの内部ノードの変動性に関して興味深い。
【0061】
実装によるXAMTreeは、隣接行列の2つの次元(行と列)にわたって扇形に広がるノードで構成される。各ノードは2×2のセルで構成され、2軸にわたってnビットを消費する。実装は、XAMTree用のいくつかの種類の葉ノードと、挿入されたデータのボリュームに従って各種類を活用するツリーの最適化された構造とを提供する。したがって、実装は、スペース効率を犠牲にすることなく良好なクエリ時間を提供する。そのような最適化された挿入順序(すなわち、各種類の葉ノードが使用されるべきかによる順序)は、モートン順序(非特許文献14参照)に従う。実装はまた、例えば非特許文献15に記載されているように、リレーショナルクエリエンジンにおけるAVXと呼ばれる新規のCPU命令を利用する。これはさらに、実装におけるクエリ経過時間を改善する。
【0062】
実装によるデータ構造は、それが書込みによって修正されるメモリ領域の数を制限し、(キャッシュミスを避けるために)キャッシュラインを尊重するように編成されている。さらに、XAMTreeは最適化された挿入順序(すなわち、モートン符号化)を有し、その理想的に最適化された状態でXAMTreeを再構築することが簡単である。動的K2Treeとは対照的に、XAMTreeのアルゴリズムの複雑さは最悪のO(n log n)でスペース使用の上限を有し、ここで、nは隣接行列に設定されたビットの数であり、挿入の順序は、動的K2と比べてXAMTreeにペナルティを与えない。基本的アクセス方法は、アルゴリズムの複雑さについて静的K2Treeと同じ最悪ケースを有するが、隣接行列のトポロジーは、XAMTreeがバランスのとれたツリーではないので、XAMTreeデータ構造の性能をさらに改善する。さらに、XAMTreeは、動的K2Tree(DK2)よりも隣接行列のトポロジーに対して敏感ではない。
【0063】
実装によれば、XAMTReeは、四分木に類似したツリーと、座標ペアベクトルを格納する葉、およびビットマップを表す葉とを混合するデータ構造である。知られているように(例えば、非特許文献10から)、四分木は、各内部ノードが正確に4つの子を有するツリーデータ構造である。四分木は、ほとんどの場合、2次元空間を4つの象限または領域に再帰的に細分化することによって分割するために使用される。葉セルに関連付けられたデータはアプリケーションによって異なるが、葉セルは「興味深い空間情報の単位」を表す。
【0064】
実装は、RDFグラフのデータを表すためにそれを使用する必要がある以下の関数に応答する隣接行列を実装する。
【0065】
「r,c」が、四分木で表される隣接行列の座標であるとき、ビットを設定することは、行列の対応するセルが「true」(真)の値を有することを意味する(そして「false」(偽)の値をリセットする):
・ set(r,c) r,c座標におけるビットをtrueに設定する
・ reset(r,c) r,c座標におけるビットをfalseにリセットする
・ test(r,c)→Boolean r,c座標におけるビットの状態を返す
・ それ自体知られているように、任意の状態変化の通知を可能にするオブザーバ。そのようなオブザーバは、イテレータ(非特許文献16参照)またはビジター(非特許文献17参照)として実装され得る。オブザーバの例は以下の通りであり得る:
○ scanRow(r)→{c} これは、test(r,c)がtrueであるcのセットを返す。scanRowは、rが不変であるr,cセットを返すこともある。
【0066】
○ scanColumn(c)→{r} これは、test(r,c)がtrueであるrのセットを返す。ScanColumnは、cが不変であるr,cセットを返すこともある。
【0067】
○ scanAll()→{r,c} これは、test(r,c)がtrueであるr,cのセットを返す。
【0068】
以下のアルゴリズムで使用されるビット演算
実装はさらに、以下の表1に列挙されるような符号なし整数に対するいくつかのビット演算を含む。
【0069】
【表1】
【0070】
XAMTreeの要素の説明
XAMTreeは、中間(すなわち、非終端)ノードと、ベクトル葉または座標のベクトルを有する葉と、ビットマップ葉またはビットマップを有する葉との3種類のノードから構成されるツリーデータ構造である。3つのノードの各々が以下に論じられる。
【0071】
中間ノード(TN)
XAMTreeの中間ノードTNは、任意選択のサブ要素を指すサイズ2×2のインデックスの2次元配列からなる。この配列の各スロットは、サブアイテムを指定し得る。nは厳密に正の整数でなければならない。TNは、サイズ22nの1次元配列で表現され得、ここで、TNに対する行および列は、((行*2)+列)または((列*2)+行)規則を使用して符号化され得る。実装は、1次元配列表現を利用し、((行*2)+列)として表現を符号化する。
【0072】
以下では、nは定数であり、δと呼ばれる。さらに、実装は、2つの定数、すなわち、2δのショートカットとして(または同等にビット単位左シフト演算子1<<δとして)のTNWIDTHと、TNWIDTHまたは22δのショートカットとしてのTNSIZEとを使用する。
【0073】
実装は、δ=2に設定する。そのような値は、XAMTreeのノードを、現代のプロセッサのキャッシュラインサイズに容易に合わせられる比較的小さいサイズのノードとし、δ=1についてlogではなくlog16の複雑さを有するアルゴリズムをもたらすような、最適化された値である。変形例では、実装はδに他の値を設定することがある。
【0074】
実装は、TNに32ビットインデックスを設定して、64バイト(512ビット=2×2×32)という限られたサイズのノードを有しながらも、数十億ビットの隣接行列を作成することができる。変形例では、実装は64ビットインデックスを使用することがあるが、これはストレージの増大につながる。
【0075】
慣例的に、実装は、割り当てられていないノードを指定するためにインデックスを0に設定し、これにより、行列を分割するときに「true」に評価されたセルを有する隣接行列のサブ要素がもはや存在しないことを示すことを意味する(例えば、既に引用された非特許文献3から当分野で知られている)。変形例では、実装は、割り当てられていないノードを指定するためのインデックス値として0以外の値を設定することがある。以下では、値(0または他の変形例のいずれか)はUNALLOCATED_NODEと呼ばれる。
【0076】
座標ベクトルを有する葉(Vnn)
ベクトル葉Vnnは、上述された中間ノードTNと正確に同じサイズを有するXAMTreeの要素である。実装は、XAMTreeにおけるVnn葉の対応する要素の構造の先頭において特定の値の整数で各Vnn葉を識別する。例えば、実装は、XAMTreeにおける各Vnn葉の対応する構造の先頭において値0xffffffffの32ビット整数を有するVnn葉を識別するように設定することができる。変形例では、実装は、他の任意の値に設定することがある。以下では、任意のインデックス値はVECTOR_LEAFと呼ばれる。実装は、中間ノードTNについての無効なインデックスとして値VECTOR_LEAFを設定することがある。
【0077】
ベクトル葉は、ツリーノードに適合する固定最大容量隣接行列である。言い換えれば、Vnn葉は、最大容量までr,cペアを格納し得る。実装は、Vnnノードに対して異なるレイアウト(すなわち、メモリレイアウト)を設定することができる。各レイアウトは、実装がTNに対して等しいまたは小さい(すなわち、TNのサイズに適合できる)サイズのVnnを必要とするという事実によって課されるサブタイプ間で共有される最大容量を有するベクトル葉のためのサブタイプを定義する。
【0078】
実装は、3つのサブタイプをV32、V16、およびV8として定義し、それぞれ32ビット、16ビット、または8ビットのインデックスサイズ(すべてのサブタイプの共有される最大サイズと組み合わせて、各サブタイプに格納されるr,cペアの最大容量に対応する)、および(使用中のスロット数に対応する)現在のサイズを有する。実装によれば、各サブタイプは、サブタイプに応じて、ベースペアr,cおよび/または可変長のベクトル(V32、V16、およびV8の各々について、それぞれ64ビット、32ビット、および16ビット)を有することができる。長さは、データ構造内の使用される行-列座標の数を指す。長さは、V<nn>データ構造のタイプによって異なる。理論的には、長さは1とVnnの最大長との間で変化する。言い換えれば、64バイト葉ノードサイズの場合、実装に応じて、V32では7まで、V16では13まで、V8では24または25までとなる。ベースペアr,c(または明示的にrbase,cbase)は、例えば、レイアウトにおけるオフセット値(例えば、roffset,coffset)と組み合わせて(例えば、rbase+roffset,cbase+coffsetを含む操作を使用して)、座標の各ペアを定義するために使用される。
【0079】
図6Aは、いくつかのVnnデータ構造のための方法の例に従って上述されたベクトルの長さを計算するための、Python言語のサンプルコードを提示する。そのような例では、各葉ノードは、64*8ビットのサイズ(node_size)であり、ヘッダが64ビット(header_size)である。さらに、各中間ノードのサイズは32ビット(index_bitsize)である。n(またはデルタ)が2に設定され、ツリーの各レベルが2ビットを消費するので、偶数のビットサイズのみが報告される。
【0080】
図6Bは、異なるタイプ、すなわち、nnの値によるVnnタイプに対するPythonコードの結果の表を提示する。「インデックス(index)」はVnnにおけるrおよびcのインデックスビットサイズを意味し、「ベース(base)」はVnnにおけるrおよびcの最小ベースビットサイズであり、「最大容量(max capacity)」はVnnに格納され得るr,cペアの最大数である。
【0081】
図6A図6Bによれば、ベース値は、式index_bitsize-nによって計算され、最大容量は、式((node_size-header_size)-(2*(index_bitsize-n)))//(2*n)によって計算される。図6Bに提示された結果は、さらに、異なるインデックスサイズの最大容量の間の比較が実現できることを示唆している。例えば、V6は、V8より32%大きい最大容量を有し、良好な候補である。さらに、V10およびV12はそれぞれ、V16よりも54%および30%大きい最大容量を有するが、V24容量はV32よりも28%大きい。一方、V16と比較したV14、V24と比較したV20およびV22、V24およびV32と比較したV26は、より大きい容量という点で利益が小さい。さらに、V24はV16ノードを挿入するために必須の中間ノードの数を最小化するための興味深いフォーマットであり、V12はV8ノードに関してであるが同じ理由で興味深い。
【0082】
上述されたタグの決定は、特に、少なくとも部分的に、図6Aと同様の計算を含むことができる。
【0083】
実装は、ベクトル葉の深さによって、32ビット、16ビット、または8ビットのr,cの各々を使用することができる。言い換えれば、VECTOR_LEAFがより深く作成されるほど、2つのr,cペアの間の差はより小さくなり、したがって、実装がこの値を表すために必要とするビット数がより少ない。一方、8ビット、16ビット、および32ビット基本演算を使用することにより、実装はデータの抽出を簡単かつ効率的に維持する。
【0084】
次に、δ=2および32ビットインデックスおよび232×232行列についての様々な座標ベクトル葉のメモリレイアウトの例が、図3Aから図5を参照して論じられる。
【0085】
図3Aは、8バイトの8行の64バイトデータ構造(V32)のレイアウトを模倣した8×8表を提示する。実装は、図3Aに提示されたレイアウトに7個までのr,cペアを格納することができ、各r,cの抽出は、レイアウト内の格納された値を読み取ることによってなされる。
【0086】
図3Bは、図3Aに提示されたV32レイアウトの変形例を提示する。この変形によると、実装は、r,cペアを符号化するために(後述される)符号化δ(r,c)を使用する。これらのr,cペアが順序付けられた場合、実装は、走査アルゴリズムをK2Treeのように挙動するように維持し得る。
【0087】
図4は、V16のメモリレイアウトの例を提示する。実装は、図4に提示されたレイアウトでは13個までのr,cペアを格納することができる。実装は、r,cのペア、r=Rbase<<16|Roおよびc=Cbase<<16|Coを抽出し得る。このレイアウトによれば、r,cペア値は、216×216サイズの変換された部分行列に制約される。言い換えれば、本方法は、r=(Rbase*216)+Roおよびc=(Cbase*216)+Conとして、ペアr,cを計算してよく、ここで、x<<nは、x*2と等価である。最下位16ビットはすべてゼロにされるので、ビット単位OR演算は加算によって置き換えられ得る。しかし、<<演算子(すなわち、ビット単位左シフト演算子)、および|演算子(すなわち、ビット単位OR演算子)は、整数値にのみ適用できるので、それにより、正しい最適化のためにコンパイラをより良く導く。
【0088】
図5は、V8のメモリレイアウトの例を提示する。実装は、図5に提示されたレイアウトでは24個までのr,cペアを格納することができる。実装は、ベース値とオフセットを加算することによってペアを抽出することができる。このレイアウトによれば、r,cペア値は、2×2サイズの変換された部分行列内に制約される。
【0089】
実装の変形例では、上述された1つのVECTOR_LEAFタグの代わりに、VECTOR_LEAVES範囲を使用し、V16およびV8サブタイプ容量を増大させるために、この範囲のサブタイプおよびサイズを符号化することも可能である。
【0090】
ビットマップを有する葉(BL)
実装では、ツリー(すなわち、XAMTree)で特定の深さを超えると、ツリーノードまたはベクトル葉のストレージコストは、データのビットマップ表現のコストよりも大きい。実装では、BLだけが見つけられるXAMTree深さとしてBLDEPTH値を設定することがある。
【0091】
例えば、δ=2でインデックスが32ビットのとき、TNのコストは64バイトであるが、ツリーの最後の2レベルは16×16ビットの部分行列を表す。それにより、ビットマップ葉を使用してストレージサイズを改善する。実装は、ツリーの最後の2レベルを表現するために、32バイトに収まる256ビットのビットマップを使用し得る。ベクトル葉の代わりにBLを使用してこの部分行列に設定されたビットが数ビット未満である場合、実装はメモリコストを2分の1に削減し得るが、最後から3番目のベクトル(antepenultimate vector)(すなわち、ツリーの最後のレベルに対応するベクトル)が飽和された場合、実装は16個までの葉を作成することがある。実装はビットマップ葉をTNおよびVnnと同じ方法で割り当てないので、最後のTNのインデックスはビットマップ葉と同じものを指していない。特に、実装は、均質な方法でタグ付けなしでビットマップレイヤ(すなわち、ビットマップによって表現されるレイヤ)を割り当てる。実装は、膨大なメモリ使用を防止するセーフガードとしてビットマップ葉を活用している。
【0092】
実装は、δおよびインデックス幅の各場合について、TNのツリーがビットマップのみを含む深さを識別する。例えば、δ=2でインデックスの幅が32ビットのとき、ツリーの各レベルはδビットを消費し、したがって、BLDEPTH=indexbits-2*δは、32-2-2=28ビットとなる。実装は、XAMTreeの最後のレベルをビットマップとして表すことができる。あるいは、実装は、ビットマップがツリーノードより小さいので、δ=1またはδ=2についての2つの最後のレベルのビットマップを定義してもよい。δ>2である変形例では、実装は、XAMTreeの最後のレベルのビットマップ葉のみを定義し得る。
【0093】
XAMTree構造
実装は、以下のような固定サイズ要素の2つの配列によってXAMTreeを構築することができる:
- NVと呼ばれるノードとベクトル葉の配列、および
- BMと呼ばれるビットマップ葉の配列。
【0094】
実装は、メモリ(例えば、メモリヒープ)またはファイルのいずれかに2つの配列を作成し、格納することができる。ビットマップ要素のサイズがノードのサイズと同じである例では、実装はBM配列を作成しなくてよい。実装は、BMを使用して最適化を実行しない他の基準を考慮し得る。
【0095】
実装は、表2に要約された以下の関数を介して、NVおよび/またはBMへのアクセスを管理することができる。
【0096】
【表2】
【0097】
以下に、BMおよびNVにおける配列[index]のgetおよびset操作の表記を提示する。実装は、ルートインデックスを含むヘッダ記述子を設定することができる。
【0098】
最初に、XAMTreeの更新可能な(すなわち、動的な)バージョンが提示され、次に、読取り専用バージョンが詳細に示される。
【0099】
初期化
実装は、以下のステップに従って空のXAMTreeを作成することができる:
1.NV配列にスロットを割り当て、返されたインデックスをルートインデックスに格納する。
【0100】
2.NV[root index]を空のV32に設定する。
【0101】
実装する関数
実装は、表3のような格納されたデータベースに対するSPARQLクエリに応答するのに使用するために、以下の関数を備える。
【0102】
【表3】
【0103】
実装はさらに、表4に列挙されるような以下の関数を実装する。
【0104】
【表4】
【0105】
次に、上記の関数の実装のアルゴリズムの詳細について論じられる。
【0106】
関数「Test」のアルゴリズム
パラメータ:r,c チェックする行および列
初期条件:
カーソルをルートインデックスとする
RC=Encodeδ(r,c)とする
depth(深さ)=0とする
アルゴリズム
1. カーソル(cursor)がUNALLOCATED_NODEである場合、
ノードもいかなる種類の葉も存在せず、(r,c)に設定されたビットが存在しない
testはfalseを返さなければならない
2. そうではなく、depthがBLDEPTHである場合、有効なビットマップが存在する
BMにおけるカーソルでのビットマップの(r,c)におけるビットをチェックする
testは、前のチェックの結果を返す
3. そうではなく、NV[cursor][0]がVECTOR_LEAFである場合、座標ベクトル葉を取得する
testは、ベクトル葉サブタイプに従って適切なアルゴリズムを使用してr,cペアの存在をチェックする
testは、前のチェックの結果を返す
4. その他の場合、ツリーノードを取得し、ツリーを下に移動する
depthをdepth+2に設定する
RC=rol(RC,2δ)とする
cell=mask(RC,2δ)とする
カーソルをNV[cursor][cell]に設定する
1から再開する
【0107】
関数「Set」のアルゴリズム
パラメータ:r,c 設定する行および列
初期条件:
カーソルをルートインデックスとする
RC=Encodeδ(r,c)とする
depth=0とする
アルゴリズム
1. cursor=UNALLOCATED_NODEである場合、ノードもいかなる種類の葉も存在せず、この条件は無効である
2. そうではなく、depth=BLDEPTHである場合、有効なビットマップが存在する
BMにおけるカーソルでのビットマップの(r,c)におけるビットを設定する
戻る
3. そうではなく、NV[cursor][0]=VECTOR_LEAFである場合、
座標ベクトル葉を取得する
ベクトル葉サブタイプに従って適切なアルゴリズムを使用してr,cペアの存在をチェックし、trueが返った場合、
NV[cursor]がr,cペアを挿入できないならば:
a. 現在の座標ベクトルを抽出する
b. 現在の座標ベクトルサブタイプを、r,cのペアを受け入れることができる別のサブタイプに変異させる。
c. bが失敗した場合、現在の座標ベクトルをツリーノードに変異させ、コンテンツを2つ以上のサブ葉(VLまたはBLのいずれか)に分配する
1つのサブ葉の場合、分配が失敗することがあり、より深いレベルでcを繰り返し、これは、最終的に、すべての抽出された現在の座標ベクトルを受け入れることができる2つ以上のVLまたは1つもしくは複数のBLサブ葉への分割によって終了する
そうでない場合、r,cペアを挿入する
【0108】
5. その他の場合、
ツリーノードが存在し、ツリーを下に移動する
depthをdepth+2に設定する
RC=rol(RC,2δ)とする
cell=mask(RC,2δ)とする
NV[cursor][cell]の次にする
次がUNALLOCATEDノードである場合、
depth=BLDEPTHであるならば、
ビットマップ葉をBMに割り当て、この値の次に設定する
そうでない場合、
座標ベクトル葉をNVに割り当て、この値の次に設定する
NV[cursor][cell]を次へ更新する
カーソルを次へ設定する
1から再開する
サブステップbの変異は、XAMTreeを非対称(すなわち、ツリー全体にわたって異なるサブタイプを有する)にするのものであり、K2-Treeに見られるような退化を防止する。言い換えれば、局所性の問題(例えば、値が行列のある領域に散らばり、疎な行列の利点を妨げる)がある場合、この領域のノードだけがこの変異によって影響される(そして、K2Treeのようにツリーのすべての類型論が影響されるわけではない)。
【0109】
関数「Reset」のアルゴリズム
パラメータ:r,c リセットする行および列
初期条件:
カーソルをルートインデックスとする
RC=Encodeδ(r,c)とする
depth=0とする
アルゴリズム
1. cursor=UNALLOCATED_NODEである場合、
ノードもいかなる種類の葉も存在せず、削除するものもない。
【0110】
戻る
2. そうではなく、depth=BLDEPTHである場合、
有効なビットマップがある
BMにおけるカーソルでのビットマップの(r,c)におけるビットをリセットする
戻る
3. そうではなく、NV[cursor][0]=VECTOR_LEAFである場合、
座標ベクトル葉が存在する
ベクトル葉サブタイプに従って適切なアルゴリズムを使用してr,cペアの存在をチェックし、falseが返った場合、
NV[cursor]カーディナリティが1であるならば、以下が可能である:
a. ベクトル葉をクリアする
b. カーソルがルートインデックスでない場合に、ノードを割当て解除し、親ノードを更新する
そうでない場合、ベクトル葉サブタイプに従って適切なアルゴリズムを使用して、NV[cursor]からr,cペアを削除する
戻る
【0111】
6. その他の場合、
ツリーノードを有しており、ツリーを下に移動する
depthをdepth+2に設定する
RC=rol(RC,2δ)とする
cell=mask(RC,2δ)とする
カーソルをNV[cursor][cell]に設定する
1から再開する
ScanAll、ScanRow、およびScanColumnの一般性
ここで、scanAll、scanRow、およびscanColumnの非回帰アルゴリズムについて論じられる。これらのアルゴリズムは、固定サイズのスタックを使用する。
【0112】
これらのアルゴリズムは、効率的なスキャンアルゴリズムであり、なぜならば、ビジターバージョン(非特許文献17参照)がヒープ割当て(非特許文献20参照)を必要とせず、抽象反復子(非特許文献21参照)が1回のヒープ割当てだけで様々な言語で実装されることが可能であり、具体反復子がヒープ割当てなしで実装されることが可能であるからである。したがって、実装は、ヒープ割当てを改善するために再帰アルゴリズムの代わりにビジターまたは反復子パターンを使用し得る。当分野で知られているように、プログラミング言語に組み込まれたジェネレータ概念がある限り、すべての提示された反復子アルゴリズムが再帰的に表現され得るという事実にかかわらず、プログラミング言語によって提供される何らかの手段なしに、再帰アルゴリズムから反復子を記述することはむしろ困難である。一方で、再帰ビジター、すなわち反復子から実装されたビジターを得ることは自明であるが、ジェネレータ概念なしの再帰反復子の取得は複雑である。実装では、スタックオブジェクトのサイズは固定されているので、動的割当てなしでそれを割り当てることができる。これは、少なくとも1つの割当てを有する抽象反復子の実装を改善する。さらに、このアルゴリズムの再帰バージョンを得ることは常に可能である。
【0113】
関数「ScanAll」のアルゴリズム
実装によれば、このアルゴリズムは、内部ノードTNの幅優先走査を使用して、XAMTreeのすべての葉にわたって反復される。
【0114】
以下のデータおよび操作を有するScanContextのスタックを定義する:
データ構造:
ScanContextはレコードであり、これは、現在のノードに「current_node」インデックスおよび「position」を含む。「current_node」は、スキャンされるNV配列またはBM配列におけるノードまたは葉のインデックスである。「position」インデックスは、current_nodeがツリーノードである場合に処理する位置を示す。「position」のインデックスは、整数もしくは整数のペアであり、または(後述される)baseRCから導出され得る。ScanContextレコードは、NV[current_node]へのポインタのような他の何らかのキャッシュデータを保持することもあり、この場合、current_nodeは最適化され得る。Stackはレコードであり、これは以下を含む:
1. ScanContextの_data固定サイズ配列。配列サイズは、BLDEPTH/δよりも大きくなければならない。実装は、レコードの配列であってよく、また、いくつかの配列、例えば、_data_current_node配列および_data_position配列を使用することもできる。
【0115】
2. スタックにおける位置を示す_top整数。このフィールドは0に初期化され、プッシュ時にインクリメントされ、ポップ時にデクリメントされる。同じ特徴を実行するためにポインタが使用され得る。_topがヌルの場合、スタックは空である。
【0116】
3. スキャン中に更新されるbaseRC座標。δは2のべき乗であるので、baseRowおよびbaseColumnはモートン符号化または部分ノートン符号化を使用して符号化されることが可能であり、これはこれら2つのデータを管理するための操作の数を最小限にするために有用であり得る。baseRCは、本発明を変更することなく、2つの整数baseRowおよびbaseColumnに置き換えられることが可能である。baseRow(baseColumそれぞれ)は、decodeRowδ(baseRC)(decodeColδ(baseRC)それぞれ)を計算することによって取り出され得る。
【0117】
スタック操作は:
1. _topが0の場合、空がtrueである
2. popは:
a. _topを1デクリメントすることによってstackの先頭をドロップする
b. baseRCペアを調整する
baseRC>>>(2δ)の結果にbaseRCを設定する
3. topが_data[_top-1]を返す
4. is BLDepthが_top==BLDEPTH/δを返す
5. push(integer cell)
a. _topを1インクリメントする
b. baseRCをCopyLowestsBits(baseRC,cell,2δ)<<(2δ)の結果に設定する
【0118】
6. nextAll
a. curをtop.current_nodeとする
b. cellをtop.positionとする
c. NV[cur]において、セルから開始する次のUNALLOCATED_NODEをスキップし、相応にセルを更新する
中断するまで繰り返す
i. cell>=TNSIZEである場合、
中断する
ii. UNALLOCATED_NODE!=NV[cur][cell]である場合、
中断する
iii. cellを1インクリメントする
d. cell>=TNSIZEである場合、
pop()
e. そうでない場合、
i. down indexをNV[cur][cell]とする
ii. コールごとにtop.positionをcell+1に更新する
iii. positionをプッシュおよび更新することによってstackを更新する
push(cell)
iv. top.positionを0に設定する
v. top.current_nodeをdown indexに更新する
【0119】
ScanAllアルゴリズム
1. stackを作成する
2. ルートインデックスをstackにプッシュする
a. push(0)
b. stack.top.current_nodeをルートインデックスに更新する
c. top.positionを0に更新する
【0120】
3. stackが空でない間に、
a. stackがBLDepthである場合、
ビットマップ葉を有する
i. スタックbaseRow、baseColumnを使用して、BM[stack top current_node]からすべての座標を得る
ii. pop stack
b. そうではなく、NV[cursor][0]=VECTOR_LEAFである場合、
座標ベクトル葉を有する
i. NV[stack top current_node]からすべての座標を得る(スタックbaseRowおよびbaseColumnを使用してよい)
ii. pop stack
c. その他の場合、
ツリーノードを有する
i. nextAllを呼び出すことによって次のスタック状態を計算する
【0121】
関数「ScanRow」のアルゴリズム
このアルゴリズムでは、入力パラメータはスキャンする行rであり、内部ノードTNの幅優先走査(非特許文献22)を使用してXAMTreeのすべての葉にわたってアルゴリズムが繰り返される。このアルゴリズムは、上述されたScanAllの改良版である。
【0122】
データ構造:
実装は、scanAllで使用されるスタックと同様のスタックを使用し、_filterRCフィールドをスタックに関連付ける。_filterRCは、PartialEncode(r,δ)<<δによって初期化される。具体的には、_filterRCが最初にEncodeδ(r,0)に設定され、次いで、XAMTreeスキャン中に、実装は、ノード(TN)のスキャン開始時に2δだけ左に論理回転(ROL)を実行し、ノードのスキャン終了時に2δだけ右に論理回転(ROR)を実行する。それ自体知られているように、ビット単位演算ROL(n)は、ビットのソース配列(Source)をビットの宛先配列(Dest)に変換するために、以下のビット単位演算を実行する:
Iについて0からw-1まで繰り返す間、
Dest(i+n)%w=Source(i)
ここで、wは、ソース配列のビット数であり、これは宛先配列のビット数にも等しい。それにより、この一連のビット単位演算によって、配列の上位2δビットが配列の下位2δビットとなる。結果として、下位2δビットをマスクすることで、すなわち、_filterRC 2δの適用によって、配列の最下位ビットが、使用する初期位置を含む。これは、実装が、スキャンするTNの開始インデックスを取得するのに役立つ。
【0123】
実装は、ScanAllで説明されたStackを以下の操作で拡張する:
1. initFilter(r,c)
a. _filterRC=Encodeδ(r,c)に設定する
b. pushFilter(0)
c. top.current_nodeをルートインデックスに更新する
d. top.positionをmask(_filterRC,2δ)に更新する
【0124】
2. popFilterは:
a. popを呼び出す
b. _filterRCをror(_filterRC2δ)に設定する
3. pushFilter(integer cell)
a. push(cell)を呼び出す
b. _filterRCをrol(_filterRC2δ)に設定する
【0125】
4. nextRow
TNのすべてのセルをスキャンする代わりに、mask(_filterRC,2δ)から、除外されたmask(_filterRC,2δ)+TNWIDTHまで、1行のみをスキャンする
【0126】
a. curをtop.current_nodeとする
b. cellをtop.positionとする
c. endをmask(_filterRC,2δ)+TNWIDTHとするが、セル(cell |(TNWIDTH-1))+1から導出されることも可能である(実装は_filterRCをロードする必要のない後者の形式を好む)。
【0127】
d. NV[cur]において、セルから開始する次のUNALLOCATED_NODEをスキップし、以下のステップに従ってセルを更新する:
中断まで繰り返す
i. cell>=endである場合、
中断する
ii. UNALLOCATED_NODE!=NV[cur][cell]である場合、
中断する
iii. セルを1インクリメントする
e. cell>=endである場合、
popFilter()
f. その他の場合、
i. down indexをNV[cur][cell]とする
ii. コールごとにtop.positionをcell+1に更新する
iii. positionをプッシュおよび更新することによってstackを更新する
pushFilter(cell)
iv.top.positionをmask(_filterRC,2δ)に設定する
v. top.current_nodeをdown indexに更新する
【0128】
ScanRowアルゴリズム
1. stackを作成する
2. フィルタを初期化する
a. stack initFilter(r,0)
b. stack.top.current_nodeをルートインデックスに更新する
3. stackが空でない間に、
a. stackがBLDepthである場合、
ビットマップ葉を有する
i. スタックbaseRow、baseColumn、および入力パラメータrによるフィルタを使用して、BM[stack top current_node]からすべての座標を得る
ii. popFilter stack
b. そうではなく、NV[cursor][0]=VECTOR_LEAFである場合、
座標ベクトル葉を有する
i. NV[stack top current_node](スタックbaseRowおよびbaseColumnを使用してよい)、ならびに入力パラメータrによるフィルタから、すべての座標を得る
ii. popFilter stack
c. その他の場合、
ツリーノードを有する
i. nextRowを呼び出すことによって次のスタック状態を計算する
【0129】
関数「ScanColumn」のアルゴリズム
このアルゴリズムでは、入力パラメータはスキャンする行cであり、内部ノードTNの幅優先走査を使用してXAMTreeのすべての葉にわたってアルゴリズムが繰り返される。このアルゴリズムは、上述されたscanColumnscanRowの改良版である。
【0130】
データ構造:
実装は、上述されたscanRowで使用されたのと同じスタックを使用する。しかし、_filterRCは、PartialEncode(Encodeδ(0,c,δ)によって初期化される。実装は、ScanRowで説明されたStackを以下の操作で拡張する:
1. nexColumn
TNのすべてのセルをスキャンする代わりに、mask(_filterRC,2δ)から、TNWIDTHステップによって除外されたTNSIZEまで、1列のみをスキャンする
a. curをtop.current_nodeとする
b. cellをtop.positionとする
c. NV[cur]において、セルから開始する次のUNALLOCATED_NODEをスキップし、以下に従ってセルを更新する:
中断まで繰り返す
i. cell>=TNSIZEである場合、
中断する
ii. UNALLOCATED_NODE!=NV[cur][cell]である場合、
中断する
iii. セルをTNWIDTHでインクリメントする
d. cell>=TNSIZEである場合、
popFilter()
e. その他の場合、
i. down indexをNV[cur][cell]とする
ii. コールごとにtop.positionをcell+TNWIDTHに更新する
iii. positionをプッシュおよび更新することによってstackを更新する
pushFilter(cell)
iv. top.positionをmask(_filterRC,2δ)に設定する
v. top.current_nodeをdown indexに更新する
ScanColumnアルゴリズム
1. stackを作成する
2. フィルタを初期化する
a. stack initFilter(0,c)
【0131】
4. stackが空でない間に、
a. stackがBLDepthである場合、
ビットマップ葉を有する
1. スタックbaseRow、baseColumn、および入力パラメータcによるフィルタを使用して、BM[stack top current_node]からすべての座標を得る
ii. popFilter stack
b. そうではなく、NV[cursor][0]=VECTOR_LEAFである場合、
座標ベクトル葉を有する
i. NV[stack top current_node](スタックbaseRowおよびbaseColumnを使用してよい)、および入力パラメータcによるフィルタから、すべての座標を得る
ii. popFilter stack
c. その他の場合、
ツリーノードを有する
i. nextColumnを呼び出すことによって次のスタック状態を計算する
読取り専用バージョン
実装はまた、更新可能(すなわち動的)バージョンと若干異なる読取り専用バージョンを含んでよい。
【0132】
読取り専用バージョンでは、データ構造は更新される必要はない(すなわち、設定およびリセット操作が利用可能ではない)。さらに、実装は、既存の隣接行列をスキャンすることによって、またはXAMTreeから、グラフデータベースの読取り専用バージョンを格納する(すなわち、作成する)ことができる。実装の読取り専用バージョンは、ストレージのためのメモリ使用量をさらに最適化する。
【0133】
XAMTreeの読取り専用バージョンは、ROXAMTree(読取り専用XAMTree)と呼ばれる。
【0134】
読取り専用メモリレイアウト
動的バージョンにおけるツリーノードの固定サイズ、すなわち、定義された22δインデックススロット(すなわちTN)は、すべて使用されることがほとんどない。通常、TNは疎である。インデックススロットが一杯になるのを回避することは、更新可能なデータ構造にとって、新しいノードや葉が作成されるべきときにO(1)更新を維持するために重要である。
【0135】
本方法の実装は、使用されるインデックスを表すビットマスク(ビットマスクについては非特許文献23を参照されたい)を使用することにより、インデックスのセットをパックしTNのスパース性を維持することを回避する、読取り専用の実装を有することができる。以下では、このビットマスクはmnと呼ばれる。δ=2を有する所与のXAMTreeの場合、このマスクを格納するには16ビット整数で十分である。例えば、32ビット整数のツリーノードは、3つのセル(例えば、位置4、7、および8に配置されたセル)を使用することができる。それにより、実装は、情報を保持するために、64バイト(4*16)の代わりに14バイト(すなわち、2+3*4)のみを必要とする。同様に、16ビットビットマスクは、インデックス4、7、および8が使用され、0b0000’0001’1001’0000(2+2+2)を含み得る。セルに関連付けられたインデックスの位置は、テストされたセルまでのポピュレーションカウント(すなわち、popcount(mn&(2cell-1))を使用して計算されることが可能であり、このとき、インデックス4、7、および8に対して、それぞれ0、1、および2を返す。
【0136】
しかし、メモリ空間をより良く使用するようにすることは可能である。XAMTreeと同様に、ROXAMtreeは、2つのファミリーのサブ要素のツリーノードおよび葉を有する。例えば、BLDEPTHでは、実装はビットマップ葉を他のタイプの葉に置き換えることがない。結果として、実装では、インデックスが省略でき、ビットマップ葉は直接mnの後に配置される。
【0137】
BLDEPTHツリーノード以外のレベルでは、ベクトル葉とツリーノードを混合することが頻繁であり、この葉を指すインデックスを保持する必要を回避するために、実装は、(mlと呼ばれる)第2のビットマスクを使用してよい。第2のビットマスクの使用は、すべてのベクトル葉のインデックスを格納するのを回避するのに役立つ。先の例では、ツリーノードがインデックス4、7、および8のセルを使用する場合、7はベクトル葉である。mlビットマスクは0b0000’0000’1000’0000(2)を含み、マスクおよび(もしあれば)TNインデックスのすぐ後に座標ベクトルがあることを示している。実装では、mnビットマスクはすべてのサブ要素マスクを含み、mlマスクは葉を含む。mnとmlの排他的論理和を実行することによって、ツリーノードビットマスクを得ることは簡単である。
【0138】
読取り専用バージョンでは、実装がベクトルノードを単純化することもできる。XAMTreeに関して上述されたメモリレイアウト(例えば、V32、V16、V8)の主な制約の1つは、簡単に更新可能であり、ツリーノードサイズに適合されるように、それらを単純に維持することである。
【0139】
読取り専用データ構造の場合、実装は、(例えば、参照により本明細書に組み込まれる、Dassault Systemesによる特許文献1に開示されているRDFタプルを圧縮する方法によって、)ソートされたモートン符号化された行列ペアのデルタをvar-int直列化(var-int serialize)するだけでよい。最初の値を0で初期化する代わりにできるだけ小さく保つために、実装はノードのモートン符号化座標を使用する。この座標の計算は、BLを適切にスキャンするために計算されなければならないため、オーバーヘッドではない。
【0140】
テスト
実装は、例えば、約80億個のRDFトリプルのデータセットであるMicrosoft Academic Graph(非特許文献24参照)における、グラフデータベースを格納する方法の容量を試験するテストに基づく。そのようなテストにより、開示された格納方法は、動的K2 tree(性能低下および書込み増幅が起こる)、および古典的なB+ Treesを利用した既製データ構造を使用する代替ソリューション(データベースのストレージコストの大幅な増加が起こる)よりも性能が優れることが確認された。
【0141】
本開示によるXAMTreeを、参照により本明細書に組み込まれる非特許文献25に記載されているようなK2-treeの動的バージョンと比較するために、以下のステップによる第1のテストが実施された:
- ChEMBLデータセット(非特許文献26で提供されている)をインポートする。このデータセットは、K2Treeで使用できるほど十分に小さい(約500Mトリプル)。
【0142】
- XAMTreeおよびK2Treeについて隣接行列によってデータベースを格納するためにディスク上で使用されるサイズを比較する。
【0143】
- 小さな隣接行列(3Kトリプル)を含む小さいクエリと大きな隣接行列(約30~60Mトリプル)を含む大きいクエリ上との経過時間を比較して、K2Treeの劣化を強調した。
【0144】
上記のステップのすべての操作は、XAMTreeとK2Treeの両方のデータ構造について同じハードウェア上で行われ、したがって、結果はハードウェアに依存しない。
【0145】
結果は、以下の表5に示されている。
【0146】
【表5】
【0147】
表5に提示された結果では、2列目と3列目の値の比較は、それらの各々の絶対値よりも重要である。これらの結果は、XAMTreeストレージコストが動的k2-treeと同じ桁の大きさである一方で、大きな問い合わせに対してより良好な問い合わせ時間を達成していることを示す。この実験は、K2Treeにより適したデータセットで実行されており、K2Treeが使用可能であり、そのより低いストレージコストは、経過時間のゲイン(実験では20%)に関して好適であり得ることを意味することに留意されたい。
【0148】
テストで使用された小さいクエリ(q0.sparql)は、以下の通りである:
Select (count(?s) as ?nb) { ?s cco:hasMechanism ?o }
そして、テストでの大きいクエリ(q1.sparql)は、以下の通りである:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX cco: <http://rdf.ebi.ac.uk/terms/chembl#>
PREFIX bibo: <http://purl.org/ontology/bibo/>
SELECT ?substance ?pubmedid ?sourceLabel ?assayType ?protein
WHERE {
?substance rdf:type cco:Substance.
?substance cco:hasDocument ?document.
?document bibo:pmid ?pubmedid.
?document cco:hasAssay ?assay.
?assay cco:assayType ?assayType.
?assay cco:hasSource ?source.
?source rdfs:label ?sourceLabel.
?assay cco:hasTarget ?target.
?target cco:hasTargetComponent ?targetcomponent.
?targetcomponent cco:targetCmptXref ?protein.
?protein a cco:UniprotRef
【0149】
第2のテストは、約80億個のトリプルからなるMicrosoft Academic Knowledge Graph(MAG)データセット(https://makg.org/rdf-dumpsで提供されている)のより大きなデータセットを用いて実行された。第2のテスト結果は、XAMTreeデータ構造では約20時間でMAGをインポートすることを可能にする(取込みスループットは113428トリプル/秒)のに対し、動的K2treeでは同じハードウェアで40時間後でもインポートが終了しないことを示している。それにより、K2Treeは、テストの失敗閾値として設定された50000トリプル/秒以上のスループットの基準に合格しなかった。第2のテストの結果は、XAMTreeがグラフデータベースのサイズに応じてスケールするが、(動的な)K2Treeはスケールしないことを示している。
図1
図2
図3A
図3B
図4
図5
図6A
図6B
【外国語明細書】