Rdf重复三元组

Jef*_*eff 2 rdf

我有一个关于RDF和重复三元组​​的问题.从浏览互联网看,似乎重复的三元组在某种程度上是"坏"或违反某些规则.

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

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

假设我还想进行Susy mentions Bob五次代表.不会有5个三倍的Susy mentions Bob允许我代表这个吗?

后来一个想知道Susy提到Bob多少次的询问可以问COUNT这个重复的三重奏.

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

Tom*_*icz 8

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

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

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


关于你的例子,有多种方法.

在TL/DR中,您需要一种方法来添加有关语句的语句.请参阅此幻灯片中的各种方法,其中一些我在下面简要介绍.

完整答案

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

:Susan :mentions [
  rdf:type :Mention ;
  :mentionsWhom :Bob ;
  :times 5 
]
Run Code Online (Sandbox Code Playgroud)

问题是,这会破坏现有的语义,你恰好会将这种结构引入现有数据.


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

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

# we can say more about that graph
:susanMentionsBob :times 5
Run Code Online (Sandbox Code Playgroud)

另一种传统解决方案是使用一种形式的具体化.通过具体化,您可以创建一个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
Run Code Online (Sandbox Code Playgroud)

最近引入了更简洁的具体化方法.您可以使用Singleton Property.您引入了一个额外的谓词,它取代了:针对单个用法的提及,并向该属性添加了其他语句:

:Susan :mentions#1 :Bob .
:mentions#1 rdf:singletonPropertyOf :mentions .
:mentions#1 :times 5 .
Run Code Online (Sandbox Code Playgroud)

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


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

<<:Susan :mentions :Bob>> :times 5
Run Code Online (Sandbox Code Playgroud)

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