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

Rdf 在SPARQL中,如何查找一篇文章是否属于某个类别,rdf,sparql,freebase,Rdf,Sparql,Freebase,我正在使用basekb提取一些语义信息 下面的sparql查询也可以作为freebase查询(因为basekb也有freebase) 问题陈述:检查一个实体是否是其他实体的子类别 例如:查看“奥斯卡最佳男配角奖”是否属于“奥斯卡最佳男配角奖”类别 prefix basekb: <http://rdf.basekb.com/ns/> prefix public: <http://rdf.basekb.com/public/> prefix fbase: <http:/

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

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

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

例如:查看“奥斯卡最佳男配角奖”是否属于“奥斯卡最佳男配角奖”类别

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 .**
}
前缀basekb:
前缀公共:
前缀fbase:
前缀rdf:
前缀rdfs:
选择?aa_ct?bb{
?aa_-ct公共:知识库KB:en.academy_奖。
bb public:knownAs basekb:en.奥斯卡最佳男配角奖。
**?bb rdfs:类别?aa**
}

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

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

?bb rdfs:categoryOf+ ?aa .
属性路径提供了一个简单的正则表达式样式语法,可以对已知谓词使用该语法,表示希望在
?bb
?aa
之间存在连接的位置进行匹配

在这种情况下,
rdfs:categoryOf+
意味着我们需要通过一个或多个
rdfs:categoryOf
链接的序列将
?bb
的值链接到
?aa

编辑 对于固定长度的简单路径,您可以使用
UNION
获得类似于属性路径的效果,例如

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

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

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

?bb rdfs:categoryOf+ ?aa .
属性路径提供了一个简单的正则表达式样式语法,可以对已知谓词使用该语法,表示希望在
?bb
?aa
之间存在连接的位置进行匹配

在这种情况下,
rdfs:categoryOf+
意味着我们需要通过一个或多个
rdfs:categoryOf
链接的序列将
?bb
的值链接到
?aa

编辑 对于固定长度的简单路径,您可以使用
UNION
获得类似于属性路径的效果,例如

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

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

谢谢你的回答。它显示了以下错误37000错误SP030:SPARQL编译器,第10行:“?aa_ct”之前的语法错误。”根据virtuoso 6.1.6,他们说部分支持SPARQL 1.1。那么,他们可能目前不支持此功能。在现有的sparql@nizam.sp中是否可能实现相同的结果?请参见我的编辑,可以使用
UNION
非常详细,并且仅限于已知长度的路径,以获得答案。它显示了以下错误37000错误SP030:SPARQL编译器,第10行:“?aa_ct”之前的语法错误。”根据virtuoso 6.1.6,他们说部分支持SPARQL 1.1。那么,他们目前可能不支持此功能。在现有sparql@nizam.sp中是否可能实现相同的结果?请参见我的编辑,使用
UNION
可能非常详细,并且仅限于已知长度的路径