【问题标题】:In SPARQL, how to find whether one article belongs to a category在 SPARQL 中,如何查找一篇文章是否属于某个类别
【发布时间】:2012-12-06 15:42:45
【问题描述】:

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

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

【问题讨论】:

    标签: rdf sparql freebase


    【解决方案1】:

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

    ?bb rdfs:categoryOf+ ?aa .
    

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

    在这种情况下,rdfs:categoryOf+ 意味着我们要求 ?bb 的值通过一个或多个 rdfs:categoryOf 链接的序列链接到 ?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 得到部分支持。 virtuoso.openlinksw.com/dataspace/dav/wiki/Main/…
    • 那么他们目前很可能不支持这个功能
    • 在现有的sparql中是否可以达到同样的效果?
    • @nizam.sp 查看我的编辑,UNION 可能非常冗长且仅限于已知长度的路径
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多