Rdf重复三元组

时间:2015-02-28 23:41:08

标签: rdf

我有一个关于RDF和重复三元组​​的问题。从细读互联网看起来似乎重复的三元组不知何故"坏"或违反某些规则。

但从表面上看,重复三元组​​在我看来是有意义的。

假设我想表示这样一个事实:      Susy(主题)提到(谓词)Bob(对象)。

假设我还想进一步代表Susy mentions Bob五次。我不会有5个Susy mentions Bob的三元组让我代表这个吗?

后来的一个查询想知道Susy提到Bob多少次可以要求这个重复三联的COUNT

所以我的问题是:Susy mentions Bob five time这个事实的表现是否有问题。如果是这样,那么表示Susy五次提到Bob的事实的首选方式是什么。

1 个答案:

答案 0 :(得分:8)

理论上,RDF图是三元组的,这意味着每个三元组只能出现一次。当然你可以有一个文件,比如在Turtle中,它包含三重或四边形的重复,但是在加载到内存/存储之后,这些三元组应该被视为一个。毕竟,任何文件都只是文字。

那说我看到不同的行为取决于三重店。例如,AllegroGraph默认加载并处理重复的三元组。有一个手动选项来修剪重复项。

不,查询不会告诉您有重复的问题,因为SPARQL聚合适用于节点而不是整个三元组。


关于您的示例,有多种方法。

TL / DR 您需要一种方法来添加有关语句的语句。请参阅 this slideshare 了解各种方法,其中一些方法我在下面简要介绍过。

完整答案

最简单的是引入某种人工中间图节点,可称为提及或其他。例如

:Susan :mentions [
  rdf:type :Mention ;
  :mentionsWhom :Bob ;
  :times 5 
]

问题在于,这会破坏现有语义,您是否应该将此类结构引入现有数据。


一种简单且受到广泛支持的方式是使用named graphs,以便您拥有四边形而不是三元组。下面的示例增强了龟语法,使其变为 TriG 。请注意,名称图只是另一种资源。使用任何SPARQL处理器也可以轻松查询命名图。

# :susanMentionsBob is the named graph
:susanMentionsBob {
   :Susan :mentions :Bob
}

# we can say more about that graph
:susanMentionsBob :times 5

另一种传统解决方案是使用 reification 的形式。通过具体化,您可以创建 rdf:Statement 对象,您可以在其中添加其他数据。缺点是你需要重复原来的三重 s / p / o

:Susan :mentions :Bob . # actual triple intact
_:reifiedStatement
   rdf:type rdf:Statement ;
   rdf:subject :Susan ;
   rdf:predicate :mentions ;
   rdf:subject :Bob ;
   :times 5 . # extra statement about the mention

最近引入了更简洁的具体化方法。您可以改用Singleton Property。您引入了一个额外谓词,用于替换单个用法的:提及,并向该属性添加其他语句:

:Susan :mentions#1 :Bob .
:mentions#1 rdf:singletonPropertyOf :mentions .
:mentions#1 :times 5 .

请注意,您可以使用以下任意名称:提及#1属性以避免冲突。请查看上面链接的sildeshare以获取更多示例和SPARQL用法


最后但并非最不重要的是,仅由BigData AFAIK支持的非标准方式是Reification Done Right, or RDR。使用RDR,您可以编写

<<:Susan :mentions :Bob>> :times 5

通过添加双尖括号,您可以在语句中添加语句。这也适用于BigData的SPARQL处理器。