Rdf 如何确定受试者是否为X Y Z类型

Rdf 如何确定受试者是否为X Y Z类型,rdf,sparql,Rdf,Sparql,这个问题对我来说似乎很容易,直到我试过。。。但也有可能我只是错误地思考了这个问题 假设我们从dbpedia中任意获取了100个主题 SELECT ?s WHERE { ?s ?p ?o . } LIMIT 100 我想做的是添加一个列,说明他们是个人、地点还是其他类型,如果没有这些内容,“null” 因此,我尝试了几种方法来解决这个问题: 使用rdf:type和值: SELECT ?s ?ppt WHERE { ?s rdf:type ?ppt . VALUES ?ppt {

这个问题对我来说似乎很容易,直到我试过。。。但也有可能我只是错误地思考了这个问题

假设我们从dbpedia中任意获取了100个主题

SELECT ?s
WHERE {
  ?s ?p ?o .
}
LIMIT 100
我想做的是添加一个列,说明他们是个人、地点还是其他类型,如果没有这些内容,“null”

因此,我尝试了几种方法来解决这个问题:

  • 使用
    rdf:type

    SELECT ?s ?ppt
    WHERE {
      ?s rdf:type ?ppt .
      VALUES ?ppt {
        dbpedia-owl:Person
        dbpedia-owl:Place
        dbpedia-owl:SomeOtherType
      }
    }
    
    但这只是得到一个具有该值的主题列表,并不一定回答它们是三种类型中的哪一种的问题(即,如果我有一个主题,比如说代替
    ?s
    ,我不能只添加
    值{…}
    阻止针对这1个主题的查询,因为如果它不是这三个主题中的任何一个,则返回的结果将为零

  • 我可以
    绑定(如果…其他…等)为?ppt
    ,但这似乎也有点奇怪


  • 那么,我应该使用哪种查询函数来确定某个东西属于哪三种类型(如果计算为“null”,则为四种)?

    我认为使用
    绑定(if(…),…,…)的解决方案
    在这里是有意义的。它并不觉得特别奇怪。假设您有这样的数据,其中
    :A
    :B
    是感兴趣的类型

    @prefix : <http://stackoverflow.com/q/22289078/1281433/> .
    
    :i1 :name "i1" . # no type
    :i2 a :A .       
    :i3 a :B .       
    :i4 a :A, :B .   
    :i5 a :C .       
    :i6 a :B, :C .
    

    所有的东西都是a,包括人。是a。@unor我已经删除了问题的这一部分;它实际上与我要问的问题无关。好吧。我想这个主题现在在一个单独的问题中找到了它的位置:关于i6有一个null和一个type
    :B
    ——请看这个查询的结果,这是hap吗pening?@Kristian什么查询的结果?我看到了结果,但我没有办法从中获取查询…你能把它放在pastebin之类的地方吗?抱歉:
    选择不同的s类型,其中{s a?\u type.BIND(如果(?u type in(dbpedia owl:Agent,dbpedia owl:Place),?\u type,“null”)作为?类型)限制100
    @Kristian这正是正在发生的事情。如果你浏览数据,例如,你会注意到,虽然Webster有
    rdf:type dbpedia owl:Agent
    ,但有一堆类型既不是
    dbpedia owl:Agent
    也不是
    dbpedia owl:Place
    。对于这些类型,你会得到
    “null”
    结果。
    --------------
    | i   | type |
    ==============
    | :i2 | :A   |
    | :i3 | :B   |
    | :i4 | :A   |
    | :i4 | :B   |
    | :i5 |      |
    | :i6 |      |
    | :i6 | :B   |
    --------------