2013-04-21 5 views
1

У меня есть возможность передавать данные RDF из таблицы триплетов в таблицы свойств. Ниже приведен пример трехмерного хранилища и таблицы свойств.Вставка данных из одной таблицы (триместр) в другую (таблица свойств)

triplestore

Таблица
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 

Это v упрощенная версия набора данных, который я использую. В таблице трипстора насчитывается около миллиона записей. Необходимо создать несколько таблиц свойств в зависимости от различных группировок различных свойств и объектов. Я определил и создал различные таблицы свойств? Свойства, которые создают таблицу свойств, выбираются таким образом, что объект полностью содержится в одной таблице свойств?

Проблема, с которой я столкнулась, - это вставка данных из трипстрона в таблицы свойств. Есть ли способ, чтобы данные для конкретного объекта могли быть вставлены в строку таблицы свойств в один оператор insert. Если это невозможно сделать в одном запросе, что является наиболее эффективным способом сделать это.

Я использую python для создания дампа SQL-запросов, который я запускал на сервере postgres.

+0

SQLFiddle данных образца: http://sqlfiddle.com/#!12/391b7 –

ответ

1

Это легко, если у вас есть известный фиксированный набор свойств. Если у вас нет известного набора фиксированных свойств, вам необходимо создать динамический SQL, либо из вашего приложения, либо из PL/PgSQL, либо с помощью функции crosstab из расширения 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"; 
0

Вообще говоря, что вы пытаетесь сделать пахнет немного EAV (значение атрибута сущности). Шаблон - который широко считается антипаттерном. Кроме того, я думаю, что я действительно не понимаю, чего вы пытаетесь достичь, извините, если мой ответ не подходит вашим потребностям.

Если ваша проблема заключается в хранении данных ранее неизвестного формата под определенным ключом - в вашем примере это похоже, я бы предложил использовать postgres contrib hstore extension. Используя это позволит вам создать таблицу как

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

, в котором поле свойства, по существу, что рубин, например, называет «Hash». Вы можете ввести пары ключ/значение в это хранилище (из приведенного выше примера, например, «prop1 => hello» и выбрать его с эквивалентным синтаксисом.

Вставка довольно прямо вперед:

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

преимущества по сравнению с использованием других способов является то, что hstore поддерживает ВТКЕЙ, джин и GIST индексы (все из которых при определенных предварительных условиях). В вашем случае - выполнение в основном прямых совпадений, поиск определенного значения в свойстве, даже btree работает, поскольку он поддерживает оператор равенства для hstore.

Смежные вопросы