Rdf重复三元组

3
我有一个关于RDF和重复三元组的问题。从浏览互联网来看,重复三元组似乎是“不好”的或违反某些规则的。
但是,表面上看来,重复三元组对我来说是有意义的。
假设我想表示这个事实:Susy(主语)提到(谓语)Bob(宾语)。
假设我进一步想要表示“Susy提到Bob”五次。那么有5个“Susy提到Bob”的三元组不就可以代表这个吗?
稍后查询想知道Susy提到Bob多少次,只需请求这个重复三元组的COUNT
所以我的问题是:用这种方式表示“Susy提到Bob五次”这个事实是否有问题?如果有问题,那么最好的表示方式是什么?

还可以参考类似的问题:http://stackoverflow.com/questions/24064643/making-statements-about-statements-which-are-no-reified - Tomasz Pluskiewicz
还有一个:https://dev59.com/NErSa4cB1Zd3GeqPYrUU - Tomasz Pluskiewicz
1个回答

12

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

话虽如此,我看到了不同的行为取决于三元组存储。例如,AllegroGraph默认加载和处理重复的三元组。有一个手动选项来修剪重复项。

而且,查询不会告诉你是否有重复的问题,因为SPARQL聚合是使用节点而不是整个三元组工作的。


关于你的例子,有多种方法。 TL/DR 你需要一种添加关于语句的语句的方式。请参阅this slideshare,其中包含各种方法,以下是我简要描述的一些方法。 完整回答 最简单的方法是引入某种人工中介图节点,可以称为Mention或其他名称。例如:
:Susan :mentions [
  rdf:type :Mention ;
  :mentionsWhom :Bob ;
  :times 5 
]

问题在于,如果您将这样的结构引入现有数据,则会破坏现有的语义。
一个简单且广泛支持的方法是使用命名图,这样你就有了四元组而不是三元组。下面的例子增强了turtle语法,使其成为TriG。请注意,命名图只是另一个资源。使用任何SPARQL处理器也很容易查询命名图。
# :susanMentionsBob is the named graph
:susanMentionsBob {
   :Susan :mentions :Bob
}

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

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

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

最近引入了更简洁的实体化方式。您可以使用单例属性代替。您需要引入一个额外的谓词,用于替换单个使用的:mentions,并向该属性添加附加语句:
:Susan :mentions#1 :Bob .
:mentions#1 rdf:singletonPropertyOf :mentions .
:mentions#1 :times 5 .

请注意,您可以使用任何名称来 :mentions#1 属性,以避免冲突。请查看上面链接的 sildeshare 了解更多示例和 SPARQL 用法。
最后介绍一种非标准的方式,据我所知仅由BigData支持,即Reification Done RightRDR。使用RDR,您可以编写:
<<:Susan :mentions :Bob>> :times 5

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

非常非常有帮助。谢谢。 - Jeff
非常好的答案,谢谢。关于实例化语句有一个小修正:应该是 rdf:object :Bob ; - zwelz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接