如何在多个条件下使用ASK WHERE语句(sparql)

如何在多个条件下使用ASK WHERE语句(sparql),sparql,freebase,Sparql,Freebase,我想检查一个实体是否有下列类型之一。如果是,则查询必须返回true PREFIX basekb:<http://rdf.basekb.com/ns/> basekb:music.release_track basekb:book.written_work basekb:book.book basekb:music.release basekb:music.album basekb:tv.tv_series.episode basekb:music.composition basek

我想检查一个实体是否有下列类型之一。如果是,则查询必须返回true

PREFIX basekb:<http://rdf.basekb.com/ns/>

basekb:music.release_track
basekb:book.written_work
basekb:book.book
basekb:music.release
basekb:music.album
basekb:tv.tv_series.episode
basekb:music.composition
basekb:music.recording
basekb:film.film
basekb:fictional_universe.fictional_character

问题: 我提出了以下问题。有没有更好的方法来解决这个问题

PREFIX basekb:<http://rdf.basekb.com/ns/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdf1:<http://www.w3.org/2000/01/rdf-schema#>

ASK where 
{
          {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:music.release_track} 
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:book.written_work}
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:book.book}
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:music.release}
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:music.album}
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:tv.tv_series.episode}
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:music.composition}
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:music.recording}
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:film.film}
    UNION {basekb:m.0109yb6 rdf:type ?x; rdf:type basekb:fictional_universe.fictional_character}
}
前缀basekb:
前缀rdf:
前缀rdf1:
问哪里
{
{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:music.release_track}
联合{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:book.writed_work}
联合{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:book.book}
联合{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:music.release}
联合{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:music.album}
联合体{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:tv.tv_series.eption}
联合{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:music.composition}
联合{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:music.recording}
联合{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:film.film}
联合{basekb:m.0109yb6 rdf:type?x;rdf:type basekb:virtual_universe.virtual_character}
}

回答:TRUE

您编写的查询有点奇怪。没有使用
?x
变量,因此可以立即将其简化为:

ASK where 
{
          {basekb:m.0109yb6 rdf:type basekb:music.release_track} 
    UNION {basekb:m.0109yb6 rdf:type basekb:book.written_work}
    #-- ...
    UNION {basekb:m.0109yb6 rdf:type basekb:fictional_universe.fictional_character}
}
不过,仍然有很多重复的代码。您可以使用SPARQL 1.1的来指定变量
类型
的允许值,然后只需询问您的实体是否有
rdf:type
的这些值之一:

前缀basekb:
前缀rdf:
问哪里{
basekb:m.0109yb6 rdf:类型?类型
值?类型{
basekb:music.release\u曲目
basekb:书本、书面作品
basekb:book.book
basekb:music.release
basekb:music.album
basekb:tv.tv_系列节目
basekb:音乐。作曲
basekb:音乐。录音
电影
basekb:虚构的宇宙
}
}

我想如果我使用分号,就不需要使用x。好像:Select?label where{basekb:m.0109yb6 rdf:type?x;rdfs:label?label}
类似于
Select?label where{basekb:m.0109yb6 rdf:type?x??x rdfs:label?label}@HaniGoc在那些查询中你根本没有使用?x,这是我的观点。你的询问是完全合法的;只是里面有一些没用的东西。您无法从ASK查询返回变量绑定,因此?X在原始查询中没有任何用途。对于SELECT查询,执行类似于
SELECT?label where{values?x{…}?object rdf:type?x;rdfs:label?label}
的操作非常有意义。
ASK where 
{
          {basekb:m.0109yb6 rdf:type basekb:music.release_track} 
    UNION {basekb:m.0109yb6 rdf:type basekb:book.written_work}
    #-- ...
    UNION {basekb:m.0109yb6 rdf:type basekb:fictional_universe.fictional_character}
}