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 表中有大约一百万条记录。根据各种属性和对象的各种分组,必须创建一个以上的属性表。我已经确定并创建了各种属性表?选择构成属性表的属性以使主题完全包含在单个属性表中?

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

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

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(实体属性值)模式的味道——这被广泛认为是一种反模式。此外,如果我的回答不符合您的需求,我认为我不太了解您要达到的目标

如果您的问题是在某个键下存储以前未知格式的数据 - 在您的示例中,这似乎是主题 - 我建议使用postgres contrib hstore 扩展。使用它可以让你创建一个像

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 的相等运算符。

于 2013-04-21T22:37:12.880 回答