我使用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 .**
}
我们需要使用适当的语法(我不知道)更改粗体文本。
答案 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
子类别的内容,您可以根据需要将其扩展到预期的路径长度。与支持属性路径的实现相比,性能可能会很差。