1

假设我有从关系数据库表中检索到的数据行(可能通过连接表)。每行有几列(如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 下才能保留数据。这是唯一的方法吗?

谢谢。

4

2 回答 2

4

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

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

于 2012-05-01T15:36:29.180 回答
2

你想要'C1 connectedTo D1'的声明似乎很奇怪。我不会说这是错误的,因为您的示例是如此抽象,没有暗示您的数据是。

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

从概念上讲,数据库中的一行对应于一个主题(将主键映射到一个主题),一列对应于一个谓词。然后,实际数据值对应于三元组中的对象。将您的 uri 添加到命名空间中的所有内容,然后就可以使用了。

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

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

于 2012-05-01T16:03:40.903 回答