1

RDF データをトリプルストアからプロパティ テーブルに転送する必要があります。トリプル ストアとプロパティ テーブルの例を以下に示します。

トリプルストア

Subject Property Object
  Sub1 prop1 hello
  Sub2 prop1 hello1
  Sub3 prop1 hello2
  Sub1 prop2 world
  Sub2 prop2 world1
  Sub3 prop2 world2
  Sub4 prop3 random

プロパティ表 1

Subject prop1 prop2
Sub1    hello world
Sub2    hello1 world1
Sub3    hello2 world2

プロパティ表 2

Subject prop3
Sub4  random 

これは、私が使用しているデータセットの非常に単純化されたバージョンです。triplestore テーブルには約 100 万のレコードがあります。さまざまなプロパティとオブジェクトのさまざまなグループ化に応じて、複数のプロパティ テーブルを作成する必要があります。さまざまなプロパティ テーブルを特定して作成しましたか? プロパティ テーブルを作成するプロパティは、サブジェクトが単一のプロパティ テーブルに完全に含まれるように選択されますか?

私が直面している問題は、トリプルストアからプロパティ テーブルへのデータの挿入です。特定のサブジェクトのデータを、単一の挿入ステートメントでプロパティ テーブルの行に挿入できる方法はありますか。単一のクエリで実行できない場合、最も効率的な方法は何ですか。

私はPythonを使用して、後でpostgresサーバーで実行するSQLクエリのダンプを作成しています。

4

2 に答える 2

1

これは、既知の固定された一連のプロパティがあれば簡単です。固定プロパティの既知のセットがない場合は、アプリケーションから、PL/PgSQL から、または拡張機能のcrosstab関数を使用して、動的 SQL を生成する必要があります。tablefunc

固定プロパティ セットの場合、自己結合できます。

http://sqlfiddle.com/#!12/391b7/6

SELECT p1."Subject", p1."Object" AS "prop1", p2."Object" AS "prop2"
FROM triplestore p1
INNER JOIN triplestore p2 ON (p1."Subject" = p2."Subject")
WHERE p1."Property" = 'prop1'
  AND p2."Property" = 'prop2'
ORDER BY p1."Subject";

SELECT p1."Subject", p1."Object" AS "prop1"
FROM triplestore p1
WHERE p1."Property" = 'prop3'
ORDER BY p1."Subject";

これらをINSERTs単純に使用するには、次のようにしますINSERT ... SELECT

INSERT INTO "Property Table 1"
SELECT p1."Subject", p1."Object" AS "prop1"
FROM triplestore p1
WHERE p1."Property" = 'prop3'
ORDER BY p1."Subject";
于 2013-04-21T05:00:01.630 に答える
0

一般的に言えば、あなたがやろうとしていることは、アンチパターンと広く考えられている EAV (Entity Attribute Value) パターンの匂いがします。さらに、あなたが達成しようとしていることをよく理解していないと思います。私の答えがあなたのニーズに合わない場合は申し訳ありません

問題が特定のキーの下に以前は不明な形式のデータを保存している場合-あなたの例ではこれが主題のようです-postgres contrib hstore extensionを使用することをお勧めします。これを使用すると、次のようなテーブルを作成できます

create table foo (
  id serial not null primary key,
  subject character varying not null,
  properties hstore
);

ここで、プロパティ フィールドは基本的に、たとえば Ruby が「ハッシュ」と呼ぶものです。このストアにキーと値のペアを挿入できます (上記の例からインスタンス 'prop1=>hello' を選択し、同等の構文で選択します。

挿入はかなり簡単です。

insert into foo (subject, properties) values ('Sub1', 'prop1=>Hello'::hstore);

他の方法を使用するよりも優れている点は、hstore が btree、gin、および gist インデックスをサポートしていることです (これらはすべて特定の前提条件の下にあります)。あなたの場合 - プロパティ内の特定の値を検索するほとんどの直接一致を行うことは、hstore の等値演算子をサポートしているため、btree でも機能します。

于 2013-04-21T22:37:12.880 に答える