我正在尝试为我找到的对象获取超类的属性。
我有this query找到的大学列表:
SELECT * WHERE {
?University a dbpedia-owl:University.
?University dbpedia-owl:campus ?campus.
}
ORDER BY ?University LIMIT 10
我知道大学是这里教育机构的子类:
University
包含属性campus
,这很有趣,但EducationalInstitution
包含我真正想要的属性locationCity
。
虽然我可以获取直接属于campus
属性的属性University
,但当我尝试获取属于{{1}的父类的属性locationCity
时我得到no results。
EducationalInstitution
返回父类属性的正确语法是什么?
或者我的方法完全不正确,我应该通过搜索SELECT * WHERE {
?University a dbpedia-owl:University.
?University dbpedia-owl:locationCity ?loc
}
ORDER BY ?University LIMIT 10
哪里有属性EducationalInstitutions
来开始我的查询?
我也尝试过后者,但没有找到运气:
University
但是,搜索属于大学的其他字段,而不仅仅是在EducationalInstitution,this does work:
SELECT * WHERE {
?EducationalInstitution a dbpedia-owl:EducationalInstitution;
a dbpedia-owl:University.
?EducationalInstitution dbpedia-owl:locationCity ?City.
}
ORDER BY ?University LIMIT 10
答案 0 :(得分:4)
OWL本体(我们正在使用的)不是面向对象的编程语言。属性不属于类。当我们说属性P的域是D类时,这意味着当我们在属性上看到三元组时,例如XPY,我们可以推断 X是D.这就是它的全部手段。当the mapping page for University说locationCity是大学的一个属性时,我认为这意味着locationCity的域是大学的超类,所以如果大学是一个超级类别有一个locationCity。我的基础是简单描述查询describe dbpedia-owl:locationCity
的结果,其中these results(请注意,locationCity的域名是Organization,该组织是University的超类):
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix dbpedia-owl: <http://dbpedia.org/ontology/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
dbpedia-owl:locationCity
rdf:type owl:ObjectProperty ;
rdfs:domain dbpedia-owl:Organisation ;
rdfs:range dbpedia-owl:City ;
rdfs:label "locatie stad"@nl , "ville"@fr , "location city"@en ;
rdfs:comment "City the thing is located."@en .
通常,查看数据中实际存在的内容并将查询基于该数据是有用的。例如,您可能会查看为Rensselaer Polytechnic Institute定义的数据,并注意,例如,属性
dbpedia-owl:city
它的值为dbpedia:Troy,_New_York
。如果您要选择类型为dbpedia-owl:University
的内容(即dbpedia-owl:University
作为rdf:type
属性的值)和 dbpedia-owl:city
属性的值,你只需要它:
select ?university ?city where {
?university rdf:type dbpedia-owl:University .
?university dbpedia-owl:city ?city .
}
在SPARQL中,您可以使用a
作为rdf:type
的缩写,当您有多个具有相同主题的三元组时,可以将它们与;
语法结合使用,这样我们就可以了可以使查询更好看,如下所示:
select ?university ?city where {
?university rdf:type dbpedia-owl:University ;
dbpedia-owl:city ?city .
}
请注意,我在这里使用dbpedia-owl:
属性。这些来自DBpedia本体,它比原始信息框数据(dbpprop:
属性)具有更清晰的数据。我已经在this answer到Why there is differences in the number of links connected to the same property?中讨论了这个问题。
基于数据查询实际上非常重要。正如您所看到的那样,映射wiki提到了locationCity属性,它实际上并没有在数据中的任何大学中使用:
select ?university ?city where {
?university a dbpedia-owl:University ;
dbpedia-owl:locationCity ?city .
}
您甚至可以使用SPARQL查找用于将大学与城市联系起来的dbpedia-owl:
属性:
select distinct ?p where {
?university a dbpedia-owl:University ;
?p [ a dbpedia-owl:City ] .
filter strstarts(str(?p),str(dbpedia-owl:))
}
p
-------------------------------------------------
http://dbpedia.org/ontology/city
http://dbpedia.org/ontology/campus
http://dbpedia.org/ontology/state
http://dbpedia.org/ontology/affiliation
http://dbpedia.org/ontology/province
http://dbpedia.org/ontology/country
http://dbpedia.org/ontology/location
http://dbpedia.org/ontology/wikiPageRedirects
http://dbpedia.org/ontology/wikiPageDisambiguates
http://dbpedia.org/ontology/president
http://dbpedia.org/ontology/type
目前还不清楚为什么会使用其中的一些(例如,总统或类型),但我可以看到一些可能会被使用的地方,如果可能不正确(例如,州或省)。
答案 1 :(得分:-2)
答案似乎是属性是位置,而不是locationCity。