問題の説明
巨大なグラフ データベースにリンク分析アルゴリズムを実装しています。
グラフ データベースは、エンティティ (頂点) と関係 (エッジ) で構成されます。
各エンティティ タイプにはプロパティがあります。たとえば、Person : [年齢、身長、体重]。
各関係にもプロパティがあります。たとえば、Call(Phone,Phone) : [date, duration]または Own(Person, Phone) : [start-date, end-date] などです。
今、私は次の構造を持つパターンを与えられています:
[エンティティ タイプ,制約] [関係タイプ,制約] [エンティティ タイプ,制約] [関係タイプ,制約] ... [エンティティ タイプ,制約]
例えば:
[person,age>20] [own, start-date>1/1/2010] [phone, end with '5'] [call date>1/1/2010] [phone, starts with '6'] [ownedまでに、開始日<1/2/2011] [人物、身長>40]。
パターン内のすべてのエンティティと関係に対して、すべての有効な割り当てを見つける必要があります。
次のプリミティブを使用して、データベースにクエリを実行できます。
- 与えられた一連の制約について、最初の 1000 個の[entity-type,relationship-type,entity-type]割り当てを見つけます。
- 上記の次の 1000 を見つける
- 与えられた一連の制約について、最初の[concrete-entity,relationship-type,entity-type]割り当てを見つけます。
- 上記の次の 1000 を見つける
特定のクエリに対するすべての回答を RAM に保持することは不可能です。各エンティティー - 関係 - エンティティーのトリプルには、何百万 (何十億?) の割り当てが存在する可能性があります。ただし、パターン全体の割り当て数は少ないものとします。
私が試したこと:
チェーンET1-RT1-ET2-RT2-ET3-RT3 の場合... 単純な実装は次のようになります。
Get first 1000 (ET1-RT1-ET2)
for each concrete ET2:
Get first 1000 (ET2-RT2-ET3)
for each concrete ET3:
...
問題は、同じサブ問題を複数回解決している可能性があることです。
このような冗長性を排除し、メモリ効率の良いアルゴリズムを探しています。
ノート:
アルゴリズムを探しています。「SQL JOINを使用する」/「SPARQLを使用する」などの回答ではありません...