将数据库行保存到图形和RDF时丢失信息?

时间:2012-05-01 14:28:07

标签: relational-database rdf

假设我有从关系数据库表中检索的数据行(可能是通过连接表)。每行有几列(例如A,B,C,D ..),以下行就是我的。

A1,B1,C1,D1

A1,B2,C1,D1

A1,B2,C1,D2

如果我要在实体之间绘制网络图,我可以通过创建多个三元组来保存RDF中的信息,例如

A1连接到B1

B1连接到C1

C1连接到D1

A1连接到B2

B2连接到C1

C1连接到D2(以及相反的方向)

因此,在双向图中,它们将是

A1 - B1 - C1 - D1

'----- B2 ---''--- D2

这种方法的一个问题是我现在引入了歧义,因为通过查看上面的图表我也可以得到一个连接 A1 - B1 - C1 - 我在原始行中没有的D2。 我的第一个问题 - 一般来说,这是将数据库行保存到网络图中时会发生什么(或者我做错了什么?)

为了保留原始信息,我可以将bnode中每一行中的四个实体分组,但我担心的是,这是否会像以前一样创建图形连接时具有相同的灵活性(和性能)。我可能需要稍后抓住As和Bs之间的所有连接或子集的其他组合。这也不像以前那样节省空间,因为你必须在不同的bnode上存储重复的信息。

所以我的第二个问题是 - 在RDF中存储行但仍然保持灵活性和性能的最佳方法是什么?我查看了WWW.org关于将RDF映射到RDF(http://www.w3.org/TR/r2rml/以及http://www.w3.org/TR/rdb-direct-mapping/)的建议,但似乎我必须将数据分组到同一行id下才能保留数据。这是唯一的方法吗?

感谢。

2 个答案:

答案 0 :(得分:4)

您的行显示n元关系(n = 4)。所以你有四件事情彼此有某种关系。 RDF基于二元关系(n = 2),因此您只能表示两个事物之间存在关系。要在RDF中表示n元关系,您始终必须引入一个额外的节点并将n个成员连接到它。 W3C有关于此主题的长篇最佳实践文档:Defining N-ary Relations on the Semantic Web

这种方法不会失去灵活性(您可以轻松地使用SPARQL查询这些关系),也不会存储重复信息 - 事实上,您提出的表示不起作用的原因是您删除了基本信息。

答案 1 :(得分:2)

你想要'C1连接到D1'的陈述似乎很奇怪。我不会说这是错的,因为你的例子如此抽象,并没有暗示你的数据是什么。

在大多数sql / rdb数据环境中,都有一个标识行的主键(或复合键)。没有它,你几乎不可能在你收到它之后更新一行。我说“差不多”,因为可以做到的数据库有一个“隐藏”列,可以唯一地标识行(例如postgres oid)。

从概念上讲,数据库中的行对应于主题(将主键映射到主题),列对应于谓词。然后,实际数据值对应于三元组中的对象。将你的uri添加到名称空间的所有内容中,然后离开。

对于将关系映射到三元组的长期示例,您可以查看d2rq-language。如果我的假设成立(你有一个主键)那么你的表现应该没问题,你可以使用SPARQL或简单的三元组来非常有效地获取你的数据。如果假设不成立,你可以使用bnodes甚至你所描述的“行内”三元组,但是你的例子中没有足够的信息来提供良好的指导。

您的示例未表明存在唯一的行。您可能暗示每行定义从列a到列d的映射或路由。如果是这种情况,您的数据就不像上面所描述的那样,每一行都是一个单独的图形。如果您的数据存储区中有四边形但是这是一个单独的建模构造,也可以这样做。