2013-04-21 91 views
1

我有一个将三重存储的RDF数据传输到属性表。三重商店和财产表的例子如下。将数据从一个表(triplestore)插入到另一个表(属性表)

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 

这是我正在使用的数据集的一个非常简化的版本。三重表中有大约一百万条记录。取决于各种属性和对象的各种分组,必须创建多个属性表。我已经确定并创建了各种属性表?构成属性表的属性是通过一个属性表完全包含主题的方式来选择的?

我面临的问题是将数据从triplestore插入到属性表中。有没有一种方法可以在单个插入语句中将特定主题的数据插入到一行属性表中。如果无法在单个查询中完成,那么最有效的方法是什么。

我正在使用python来创建SQL查询的转储,后者在postgres服务器上运行。

+0

SQLFiddle样本数据:http://sqlfiddle.com/#!12/391b7 – 2013-04-21 04:51:54

回答

1

如果您有一组已知的固定属性,这很容易。如果您没有已知的一组固定属性,则必须从您的应用程序,PL/PgSQL或使用tablefunc扩展中的crosstab函数生成动态SQL。

对于固定属性集,你可以自联接:

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 
); 

其中的属性字段本质上是Ruby实例调用“哈希”。您可以将键/值对插入此存储区(从上例中找到'prop1 => hello',然后用相应的语法选择它。

插入是相当直截了当:

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

优于使用其他方法是hstore支持B树,杜松子酒及要旨指数(所有这些在某些前提条件)。在你的情况下 - 大多数情况下直接匹配搜索属性中的某个值,即使btree也能正常工作,因为它支持hstore的相等运算符。

相关问题