Rdf 重复三元组
Rdf duplicate triples
我有一个关于 RDF 和重复三元组的问题。通过仔细阅读互联网,似乎重复的三元组不知何故 "bad" 或违反了某些规则。
但在我看来,重复的三元组在表面上是有意义的。
假设我要表示一个事实:
Susy(主语)提及(谓语)Bob(宾语)。
假设我还想把那个Susy mentions Bob
表示五次。 Susy mentions Bob
的 5 个三元组不能让我代表这个吗?
稍后的查询想知道 Susy 提到 Bob 多少次,可以只要求这个重复的三元组的 COUNT
。
所以我的问题是:这种表示 Susy mentions Bob five time
的事实有什么问题吗?如果是这样,表示 Susy 五次提到 Bob 的事实的首选方式是什么。
理论上RDF图是一个集合的三元组,这意味着每个三元组只能出现一次。当然你可以有一个文档,比如在 Turtle 中,它包含三元组或四元组的副本,但在加载到 memory/store 之后,这些三元组应该被视为一个。任何文档毕竟只是文本。
也就是说,我看到了不同的行为取决于三元组存储。例如,AllegroGraph 默认加载和处理重复的三元组。 trim 有一个手动选项。
不,查询不会告诉您有重复问题,因为 SPARQL 聚合使用节点而不是整个三元组。
关于你的例子,有多种方法。
TL/DR 你将需要一种方法来添加关于语句的语句。有关各种方式,请参阅 this slideshare,我在下面简要介绍了其中一些方式。
完整回答
最简单的是引入某种人工中介图节点,可以称为Mention或其他名称。例如
:Susan :mentions [
rdf:type :Mention ;
:mentionsWhom :Bob ;
:times 5
]
问题是如果您碰巧将这种结构引入现有数据,这会破坏现有语义。
一种简单且得到广泛支持的方法是使用 named graphs,这样您就有 quads 而不是 triples。下面的示例增强了 turtle 语法,使其变为 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。您引入了一个额外的谓词,它替换了 :mentions 一次使用,并向 属性:
添加了额外的语句
:Susan :mentions#1 :Bob .
:mentions#1 rdf:singletonPropertyOf :mentions .
:mentions#1 :times 5 .
请注意,您可以为 :mentions#1 属性 使用任何名称以避免冲突。请查看上面链接的 sildeshare 以获取更多示例和 SPARQL 用法
最后但并非最不重要的一种非标准方式,仅由 BigData AFAIK 支持,是 Reification Done Right, or RDR。使用 RDR 你可以写
<<:Susan :mentions :Bob>> :times 5
通过添加双尖括号,您可以添加关于语句的语句。这也适用于 BigData 的 SPARQL 处理器。
我有一个关于 RDF 和重复三元组的问题。通过仔细阅读互联网,似乎重复的三元组不知何故 "bad" 或违反了某些规则。
但在我看来,重复的三元组在表面上是有意义的。
假设我要表示一个事实: Susy(主语)提及(谓语)Bob(宾语)。
假设我还想把那个Susy mentions Bob
表示五次。 Susy mentions Bob
的 5 个三元组不能让我代表这个吗?
稍后的查询想知道 Susy 提到 Bob 多少次,可以只要求这个重复的三元组的 COUNT
。
所以我的问题是:这种表示 Susy mentions Bob five time
的事实有什么问题吗?如果是这样,表示 Susy 五次提到 Bob 的事实的首选方式是什么。
理论上RDF图是一个集合的三元组,这意味着每个三元组只能出现一次。当然你可以有一个文档,比如在 Turtle 中,它包含三元组或四元组的副本,但在加载到 memory/store 之后,这些三元组应该被视为一个。任何文档毕竟只是文本。
也就是说,我看到了不同的行为取决于三元组存储。例如,AllegroGraph 默认加载和处理重复的三元组。 trim 有一个手动选项。
不,查询不会告诉您有重复问题,因为 SPARQL 聚合使用节点而不是整个三元组。
关于你的例子,有多种方法。
TL/DR 你将需要一种方法来添加关于语句的语句。有关各种方式,请参阅 this slideshare,我在下面简要介绍了其中一些方式。
完整回答
最简单的是引入某种人工中介图节点,可以称为Mention或其他名称。例如
:Susan :mentions [
rdf:type :Mention ;
:mentionsWhom :Bob ;
:times 5
]
问题是如果您碰巧将这种结构引入现有数据,这会破坏现有语义。
一种简单且得到广泛支持的方法是使用 named graphs,这样您就有 quads 而不是 triples。下面的示例增强了 turtle 语法,使其变为 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。您引入了一个额外的谓词,它替换了 :mentions 一次使用,并向 属性:
添加了额外的语句:Susan :mentions#1 :Bob .
:mentions#1 rdf:singletonPropertyOf :mentions .
:mentions#1 :times 5 .
请注意,您可以为 :mentions#1 属性 使用任何名称以避免冲突。请查看上面链接的 sildeshare 以获取更多示例和 SPARQL 用法
最后但并非最不重要的一种非标准方式,仅由 BigData AFAIK 支持,是 Reification Done Right, or RDR。使用 RDR 你可以写
<<:Susan :mentions :Bob>> :times 5
通过添加双尖括号,您可以添加关于语句的语句。这也适用于 BigData 的 SPARQL 处理器。