在SPARQL中,如何查找一篇文章是否属于某个类别

时间:2012-12-06 15:42:45

标签: rdf sparql freebase

我使用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 .**
}

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

1 个答案:

答案 0 :(得分:1)

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

?bb rdfs:categoryOf+ ?aa .

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

在这种情况下,rdfs:categoryOf+表示我们要求?bb的值通过一个或多个?aa链接的序列与rdfs:categoryOf相关联。

修改

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

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

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