【问题标题】:How to determine if subject is of type X Y Z or None如何确定主题是 X Y Z 类型还是无
【发布时间】:2014-04-12 21:38:26
【问题描述】:

在我尝试之前,这个问题对我来说似乎很容易......但也有可能我只是错误地考虑了这个问题。

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

SELECT ?s
WHERE {
  ?s ?p ?o .
}
LIMIT 100

我想做的是添加一个列,说明它们是 Person、Place 还是 SomeOtherType,如果都不是,则为“null”。

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

  1. 使用rdf:typeVALUES

    SELECT ?s ?ppt
    WHERE {
      ?s rdf:type ?ppt .
      VALUES ?ppt {
        dbpedia-owl:Person
        dbpedia-owl:Place
        dbpedia-owl:SomeOtherType
      }
    }
    

    但这只是获取具有该值的主题列表,并且不一定回答它们是三种类型中的哪一种的问题(即,如果我有 1 个主题,比如说代替 ?s,我可以'不要只是将 VALUES { ... } 块添加到针对该 1 个主题的查询中,因为如果它不是这三个主题中的任何一个,那么将返回零个结果。

  2. 我可以BIND ( IF ... ELSE ... etc ) AS ?ppt,但这也有点奇怪。

那么,我应该使用哪些查询函数来确定某物属于这三种(如果算上“null”,则为四种)类型中的哪一种?

【问题讨论】:

标签: rdf sparql


【解决方案1】:

我认为bind( 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 .

我特意添加了一些极端案例来说明会发生什么。由于:i1 根本没有类型,我们不会在结果中看到它。由于:i2:i3 各有一种“兴趣类型”,它们各自在结果中出现一次。 :i4 具有两种 类型的兴趣,因此它会出现在结果中两次,每种兴趣类型一次。 :i5 没有感兴趣的类型,因此它将以空类型出现(我使用了一个未绑定的变量,这是在 answers.sematicweb.com 问答中讨论的一种技术,Binding a variable only when another is non-blank?)。 :i6 有一个感兴趣的类型和一个不感兴趣的类型,所以它会以感兴趣的类型出现一次,并以空白值出现一次。

prefix : <http://stackoverflow.com/q/22289078/1281433/>

select ?i ?type where { 
  ?i a ?_type . 
  bind( if( ?_type in (:A, :B), ?_type, ?noType ) as ?type )
}
--------------
| i   | type |
==============
| :i2 | :A   |
| :i3 | :B   |
| :i4 | :A   |
| :i4 | :B   |
| :i5 |      |
| :i6 |      |
| :i6 | :B   |
--------------

【讨论】:

  • 关于 i6 为 null 且类型为 :B 的情况——请查看此查询的结果,这是怎么回事? dbpedia.org/…
  • @Kristian 什么查询的结果?我看到了结果,但我没有办法从中获取查询……你能把它放在 pastebin 什么的吗?
  • 对不起:SELECT DISTINCT ?s ?type WHERE { ?s a ?_type . BIND( if( ?_type in (dbpedia-owl:Agent, dbpedia-owl:Place), ?_type, "null") as ?type ) } limit 100
  • @Kristian 这正是正在发生的事情。如果您浏览数据,例如查看dbpedia.org/page/Daniel_Webster,您会注意到虽然Webster 有rdf:type dbpedia-owl:Agent,但有很多类型既不是dbpedia-owl:Agent 也不是dbpedia-owl:Place。对于这些类型,您将获得 "null" 结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2012-01-07
相关资源
最近更新 更多