我需要将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表中大约有一百万条记录。根据不同属性和对象的不同分组,必须创建多个属性表。我已经识别并创建了各种属性表?生成属性表的属性是以这样的方式选择的,即主题完全包含在单个属性表中?
我面临的问题是将数据从triplestore插入到属性表。是否有一种方法可以将特定主题的数据插入到单个insert statement.If中的属性表的行中,它不能在单个查询中完成,这是最有效的方法。
我正在使用python创建SQL查询的转储,后者在postgres服务器上运行。
发布于 2013-04-21 05:00:01
如果您有一个已知的、固定的属性集,这是很容易的。如果您没有一组已知的固定属性,则必须从应用程序、PL/PgSQL或使用tablefunc扩展中的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";发布于 2013-04-21 22:37:12
一般来说,您试图做的工作闻起来有点像EAV (实体属性值)模式--它被广泛认为是反模式。另外,如果我的回答不符合你的需要,我想我不太明白你想要达到什么目的。
如果您的问题是在特定密钥下存储以前未知格式的数据--在您的示例中,这似乎是主题--我建议使用postgres控制hstore分机。使用这将允许您创建一个表,如
create table foo (
id serial not null primary key,
subject character varying not null,
properties hstore
);其中属性字段本质上就是Ruby所称的"Hash“。您可以将键/值对插入到此存储中(例如,从上面的示例“prop1=>hello”中),并使用等效的语法选择它。
插入相当直截了当:
insert into foo (subject, properties) values ('Sub1', 'prop1=>Hello'::hstore);与使用其他方法相比,hstore支持btree、gin和gist索引(所有这些都在特定的先决条件下)。在您的情况下,大多数是直接匹配,在属性中搜索某个值,即使btree也能工作,因为它支持hstore的相等操作符。
https://stackoverflow.com/questions/16127878
复制相似问题