我尝试编写SPARQL查询以从RDF中的本体中提取某些属性和标签。我在python 2.7(操作系统:Ubuntu 16.04,64位)中使用rdflib 4.2.2,它允许我在SPARQL 1.1中运行查询。本体论是人体的解剖学,所有的器官都有自己的阶级。它的组织使得这些器官具有超类,以及具有标签的其他属性,例如hasRelatedSynonym
和someValuesFrom
。以下是本体的示例,具有类限制和属性的单个类:
<owl:Class rdf:about="http://human.owl#NCI_C12832">
<rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Conus_Medullaris</rdfs:label>
<rdfs:subClassOf rdf:resource="http://human.owl#NCI_C33969"/>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="http://human.owl#UNDEFINED_part_of"/>
<owl:someValuesFrom rdf:resource="http://human.owl#NCI_C12464"/>
</owl:Restriction>
</rdfs:subClassOf>
<oboInOwl:hasRelatedSynonym rdf:resource="http://human.owl#genid5111"/>
有些类具有针对单个属性的多个值的限制,这就是为什么我尝试使用group_concat
将所有这些值放在一行中,以便拥有所有这些值关于一行中的一个类的相关信息。
这是我试图运行的查询:
querytrial4=graph.query("""SELECT ?node ?nodeLabel ?superclass ?superclassLabel (group_concat(DISTINCT ?node2) as ?node2s) (group_concat(DISTINCT ?node2Label) as ?node2Labels) where {
?node rdf:type owl:Class .
?node rdfs:subClassOf ?superclass .
OPTIONAL {
?node rdfs:subClassOf ?restriction .
?restriction a owl:Restriction .
?restriction owl:someValuesFrom ?node2 .
?node2 rdfs:label ?node2Label }
?node rdfs:label ?nodeLabel .
?superclass rdfs:label ?superclassLabel .
}
group by ?node ?nodeLabel ?superclass ?superclassLabel ?node2 ?
node2Label
LIMIT 10""")
正如rdf4j论坛上的几个贡献者所建议的,我已将限制及其属性放在OPTIONAL
块中,因为并非所有类都具有这些属性。但是,当我尝试运行查询时,我收到一个错误,指出变量?node2Label
未绑定。为什么即使变量在可选块内部也会抛出此错误,我该如何解决此查询?任何建议将不胜感激。我已经附加了本体,以防有人想尝试自己运行查询。
可以从此链接下载本体。它在商店/ anatomy / human.owl
答案 0 :(得分:0)
我认为您的查询中的问题可能是?
和node2Label
之间的空白区域,因为您在? node2Label
语句之前编写了LIMIT
。
我从链接下载了人类本体,删除了那个空白区域,在GraphDB上运行查询,运行正常。