1

我正在使用 basekb 来提取一些语义信息。

下面的 sparql 查询也可以作为一个 freebase 查询(因为 basekb 也有 freebase)。

问题陈述:检查一个实体是否是某个其他实体的子类别。

例如:检查 en.academy_award_for_best_supporting_actor 是否属于 en.academy_award 类别。

prefix basekb: <http://rdf.basekb.com/ns/>
prefix public: <http://rdf.basekb.com/public/>
prefix fbase: <http://rdf.freebase.com/ns/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?aa_ct ?bb {
?aa_ct public:knownAs basekb:en.academy_awards .
?bb public:knownAs basekb:en.academy_award_for_best_supporting_actor .
**?bb rdfs:categoryOf ?aa .**
}

我们需要使用适当的语法(我不知道)更改粗体文本。

4

1 回答 1

1

如果您的 SPARQL 实现支持 1.1 标准,您应该能够为此使用属性路径,假设数据具有严格的类别层次结构,例如

?bb rdfs:categoryOf+ ?aa .

属性路径提供了一种简单的正则表达式样式语法,可用于对已知谓词表示您想要匹配?bb和之间存在连接的位置?aa

在这种情况下,rdfs:categoryOf+我们需要通过一系列一个或多个链接?bb链接到的值。?aardfs:categoryOf

编辑

您可以使用固定长度的简单路径来实现类似于属性路径的效果UNION,例如

{ ?bb rdfs:categoryOf ?aa }
UNION
{ ?bb rdfs:categoryOf [ rdfs:categoryOf ?aa ] }
UNION
{ ?bb rdfs:categoryOf [ rdfs:categoryOf [ rdfs:categoryOf ?aa ] ] }

这将匹配1-3 步?bb中的子类别的内容?aa,您可以根据需要将其扩展到您期望的路径长度。与支持属性路径的实现相比,性能可能会很差。

于 2012-12-06T18:22:53.970 回答