【问题标题】:Use DBPedia to load all People along with some data使用 DBPedia 加载所有人员以及一些数据
【发布时间】:2013-07-15 17:06:24
【问题描述】:

我是第一次使用 DBpedia。我想下载人员数据集中的所有人员以及 commonName、nationality、birthDate 和 knownFor 的属性(我最终会使用某种脚本语言将其粘贴到 Excel 电子表格中)。

这是我第一次尝试查询来完成这项工作,但是它不起作用。我尝试将它与我在互联网上看到的其他代码拼凑在一起。有谁知道如何解决这一问题?谢谢

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/> 

SELECT ?person ?commonName ?nationality ?knownFor ? birthDate
WHERE {
    ?person a type:Person .
    ?person prop:commonName ?commonNameFilter(lang(?commonName) = 'en') .
    ?person prop:nationality ?nationality(lang(?nationality) = 'en') .
    ?person prop:knownFor ?knownFor(lang(?knownFor) = 'en') .
    ?person prop:birthDate ?birthDate .
}

编辑:新版本的代码:返回 COMMONNAME(非英语重复)。仍然缺少其他属性。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/ontology/>

SELECT DISTINCT * WHERE {
    ?person a dbpedia-owl:Person ;  
              dbpedia-owl:commonName ?commonName . FILTER(lang(?commonName) = 'en')
}
LIMIT 30

【问题讨论】:

  • “不起作用”是什么意思?你有错误吗?一组您不期望的结果?你得到什么结果
  • 好吧,现在在您的帮助下编写代码。我可以得到 commonName,尽管有一些重复项和一些实际上不是英文的,即使我过滤了它们。只是错过了我猜的其他领域
  • 可以通过更新编辑您的问题,但请不要删除旧代码。它删除了原始答案所指的上下文和内容。如果您要发布新代码,请添加新内容,而不是替换旧内容。如果您可以回滚该编辑并将该编辑作为添加而不是替换,那就太好了。

标签: sparql wikipedia dbpedia


【解决方案1】:

首先,您的查询有很多语法问题:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/> 
            ^ you probably want to use the dbpedia-owl properties which are 
            # in <http://dbpedia.org/ontology/>
SELECT ?person ?commonName ?nationality ?knownFor ? birthDate
                                                   ^ space between ? and varname
WHERE {
    ?person a type:Person .
    ?person prop:commonName ?commonNameFilter(lang(?commonName) = 'en') .
                                       ^ This needs to be "?commonName . FILTER(..."
                                       # and the same thing applies to your other 
                                       # filters
    ?person prop:nationality ?nationality(lang(?nationality) = 'en') .
    ?person prop:knownFor ?knownFor(lang(?knownFor) = 'en') .
    ?person prop:birthDate ?birthDate .
}

以增量方式构建其中一些查询更容易,因为您可以找出某些资源实际上具有哪些属性,然后您可以进一步扩展查询。公共端点有多个predefined namespaces,使用这些将使其他人更容易阅读您的查询。所以,你可以从问人开始:

SELECT * WHERE {
    ?person a dbpedia-owl:Person .
}
LIMIT 10

SPARQL results

看到它工作正常,您可以查看一些返回的实例并查看它们具有dbpedia-owl:commonName 属性,然后扩展查询:

SELECT * WHERE {
    ?person a dbpedia-owl:Person ;  
              dbpedia-owl:commonName ?commonName .
}
LIMIT 10

SPARQL results

使用dbpedia-owl:birthDate 属性扩展它很容易。在我查看的实例上,我没有看到 nationality 谓词,所以我不确定您基于什么进行国籍查询。虽然我看到了knownFor 属性的一些用法,但我在很多情况下都没有看到它,所以如果你把它设为必需属性,你会排除很多人。不过,从长远来看,这种渐进式方法可能会对您有所帮助。

查找属性

虽然可浏览本体提供了一种查找的好方法,但我不确定是否有这种查找属性的好方法。但是,您可以以蛮力的方式做某事。例如,要查找实际用于 Persons 的所有属性,您可以运行如下查询。 (注意:这个查询需要一段时间来执行,所以如果你使用它,你可能应该下载结果。)

select distinct ?p where {
  [] a dbpedia-owl:Person ;
     ?p [] .
}

SPARQL results

我会注意到dbpedia-owl:nationality 确实出现在该列表中。

要获取所有内容的所有属性,您可以download the ontology,然后运行如下查询:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
select * where { 
  { ?p a owl:ObjectProperty }
  UNION 
  { ?p a owl:DatatypeProperty }
}

我使用 Jena 的 ARQ 在本地运行:

$ arq --query properties.sparql --data dbpedia_3.8.owl
----------------------------------------------------------------------------
| p                                                                        |
============================================================================
| <http://dbpedia.org/ontology/regionServed>                               |
| <http://dbpedia.org/ontology/coachedTeam>                                |
| <http://dbpedia.org/ontology/legalForm>                                  |
| <http://dbpedia.org/ontology/goldenCalfAward>                            |
| <http://dbpedia.org/ontology/composer>                                   |
| <http://dbpedia.org/ontology/owningOrganisation>                         |
| <http://dbpedia.org/ontology/branchFrom>                                 |
| <http://dbpedia.org/ontology/iso6393Code>                                |
...
| <http://dbpedia.org/ontology/classification>                             |
| <http://dbpedia.org/ontology/bgafdId>                                    |
| <http://dbpedia.org/ontology/currencyCode>                               |
| <http://dbpedia.org/ontology/onChromosome>                               |
| <http://dbpedia.org/ontology/course>                                     |
| <http://dbpedia.org/ontology/frequentlyUpdated>                          |
| <http://dbpedia.org/ontology/distance>                                   |
| <http://dbpedia.org/ontology/volume>                                     |
| <http://dbpedia.org/ontology/description>                                |
----------------------------------------------------------------------------

这不会提供rdfs:domainrdfs:range,但您也可以要求这些,或者只要求rdfs:range dbpedia-owl:Person 的那些属性(但请注意,这不会获得所有可以使用的属性Person,因为范围可能或多或少是具体的):

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

select ?p ?range where { 
  { ?p a owl:ObjectProperty }
  UNION 
  { ?p a owl:DatatypeProperty }

  ?p rdfs:domain dbpedia-owl:Person ; rdfs:range ?range .
}


$ arq --query properties.sparql --data dbpedia_3.8.owl | head
--------------------------------------------------------------------------------------------------------
| p                                           | range                                                  |
========================================================================================================
| dbpedia-owl:restingPlacePosition            | <http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing> |
| dbpedia-owl:opponent                        | dbpedia-owl:Person                                     |
| dbpedia-owl:employer                        | dbpedia-owl:Organisation                               |
| dbpedia-owl:hometown                        | dbpedia-owl:Settlement                                 |
| dbpedia-owl:militaryBranch                  | dbpedia-owl:MilitaryUnit                               |
| dbpedia-owl:school                          | dbpedia-owl:EducationalInstitution                     |
| dbpedia-owl:ethnicity                       | dbpedia-owl:EthnicGroup                                |
...
| dbpedia-owl:sex                             | xsd:string                                             |
| dbpedia-owl:hipSize                         | xsd:double                                             |
| dbpedia-owl:individualisedPnd               | xsd:nonNegativeInteger                                 |
| dbpedia-owl:weddingParentsDate              | xsd:date                                               |
| dbpedia-owl:birthName                       | xsd:string                                             |
| dbpedia-owl:networth                        | xsd:double                                             |
| dbpedia-owl:birthYear                       | xsd:gYear                                              |
| dbpedia-owl:bustSize                        | xsd:double                                             |
| dbpedia-owl:description                     | xsd:string                                             |
--------------------------------------------------------------------------------------------------------

【讨论】:

  • @AlexChumbley 你可以浏览实例数据,或者查询DBpedia,或者下载本体看看。我已经更新了答案以显示如何。
【解决方案2】:

我还不太擅长 SPARQL,但我确实看到了一些语法问题。我将查询重写为如下所示:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>
SELECT ?person, ?commonName, ?nationality, ?knownFor, ?birthDate
WHERE {
    ?person a type:Person .
    ?person prop:commonName ?commonName .
    FILTER (lang(?commonName) = 'en') .
    ?person prop:nationality ?nationality .
    FILTER (lang(?nationality) = 'en') .
    ?person prop:knownFor ?knownFor .
    FILTER (lang(?knownFor) = 'en') .
    ?person prop:birthDate ?birthDate .
}

现在它至少运行查询没有错误。但我没有看到结果。不知道为什么

【讨论】:

  • 谢谢!这是向前迈出的一大步,至少
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
相关资源
最近更新 更多