我有一个关于RDF和重复三元组的问题.从浏览互联网看,似乎重复的三元组在某种程度上是"坏"或违反某些规则.
但从表面上看,重复三元组在我看来是有意义的.
假设我想表示这样一个事实:Susy(主题)提到(谓词)Bob(对象).
假设我还想进行Susy mentions Bob五次代表.不会有5个三倍的Susy mentions Bob允许我代表这个吗?
后来一个想知道Susy提到Bob多少次的询问可以问COUNT这个重复的三重奏.
所以我的问题是:这种事实的表现是否有任何问题Susy mentions Bob five time.如果是这样,那么表示Susy五次提到Bob这一事实的首选方式是什么.
理论上,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 Right或RDR.使用RDR,您可以编写
<<:Susan :mentions :Bob>> :times 5
Run Code Online (Sandbox Code Playgroud)
通过添加双尖括号,您可以在语句中添加语句.这也适用于BigData的SPARQL处理器.