我有一个将三元组的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
这是我正在使用的数据集的一个非常简化的版本。 triplestore表中有大约一百万条记录。必须根据各种属性和对象的各种分组创建多个属性表。我已经识别并创建了各种属性表?选择构成属性表的属性是否使主题完全包含在单个属性表中?
我面临的问题是将数据从triplestore插入属性表。是否有一种方法可以将特定主题的数据插入到单个insert语句中的一行属性表中。如果不能在单个查询中完成,那么最有效的方法是什么。
我正在使用python创建一个SQL查询转储,后者在postgres服务器上运行。
答案 0 :(得分:1)
如果您有一组已知的固定属性,这很容易。如果您没有一组已知的固定属性,则必须从您的应用程序,PL / PgSQL或使用crosstab
扩展名中的tablefunc
函数生成动态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";
答案 1 :(得分: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支持btree,gin和gist索引(所有这些索引都在某些先决条件下)。在你的情况下 - 主要做直接匹配搜索属性中的某个值,甚至btree也可以工作,因为它支持hstore的等于运算符。