SPARQL查询前缀无法解析求助:基于Comunica与JavaScript
我有一个基于Web的本体,通过JavaScript结合Comunica搭建了SPARQL查询引擎,执行select * where {?s ?p ?o}能正常返回预期结果,但前缀解析存在异常:
执行以下查询时返回空数组:
PREFIX lab2: <http://kalenav.github.io/ontology.rdf> SELECT ?firearm WHERE { ?firearm rdf:type/rdfs:subClassOf* lab2:Firearm . }
但通过标签匹配的查询能返回预期的个体数组:
SELECT ?firearm WHERE { ?firearmClass rdfs:label "Firearm"@en . ?firearm rdf:type/rdfs:subClassOf* ?firearmClass . }
我尝试过以下前缀(除本地相对路径返回错误外,其余均返回空数组):
- http://kalenav.github.io/ontology.rdf
- https://kalenav.github.io/ontology.rdf
- https://kalenav.github.io/ontology
- https://kalenav.github.io/ontology.rdf#
- https://kalenav.github.io/ontology#
- 本地本体的绝对路径
- http://www.semanticweb.org/konst/ontologies/2023/1/lab2
- http://www.semanticweb.org/konst/ontologies/2023/1/lab2#
精准获取Firearm类的实际URI
先执行这个查询拿到目标类的完整URI:SELECT ?classUri WHERE { ?classUri rdfs:label "Firearm"@en . }比如返回的
?classUri是http://www.semanticweb.org/konst/ontologies/2023/1/lab2#Firearm,那对应的前缀就应该是PREFIX lab2: <http://www.semanticweb.org/konst/ontologies/2023/1/lab2#>,之后用lab2:Firearm就能精准匹配。检查本体的命名空间声明
直接查看本体文件,找类似xmlns:xxx="http://xxx/xxx#"的命名空间行,这里的http://xxx/xxx#就是正确的前缀基础URI。注意末尾的#不能漏——很多本体的类URI是“命名空间+#+类名”的格式,少了#的话前缀拼接后就会变成无效URI。测试完整URI的有效性
直接用完整URI替换前缀写法来测试,比如:SELECT ?firearm WHERE { ?firearm rdf:type/rdfs:subClassOf* <http://xxx#Firearm> . }如果这个查询能返回结果,说明之前的前缀基础URI写错了;如果还是空,那要检查本体中是否真的有属于Firearm子类的个体,或者
rdfs:subClassOf*的路径是否正确。本地路径的规范写法
如果用本地绝对路径,要遵循file://协议的格式:- Windows系统:
file:///C:/xxx/ontology.rdf#(注意三个斜杠) - Linux/macOS系统:
file:///home/user/xxx/ontology.rdf#
- Windows系统:
内容的提问来源于stack exchange,提问作者akrick

