SPARQL - 如何找到本体?

时间:2010-06-29 13:17:57

标签: sparql owl jena

我对SPARQL,OWL和Jena都很陌生,所以请原谅我是在问完全愚蠢的问题。我有一个问题,这让我疯了几天。我使用以下字符串作为Jena QueryFactory.create(queryString)

的查询
queryString = "PREFIX foaf:  <http://xmlns.com/foaf/0.1/>"+
"PREFIX ho: <http://www.flatlandfarm.de/fhtw/ontologies/2010/5/22/helloOwl.owl#>" +
"SELECT ?name ?person ?test ?group "+
"WHERE { ?person foaf:name ?name ; "+
"         a ho:GoodPerson ; "+
"         ho:isMemberOf ?group ; "+
"}";

直到今天早上它才有效,只要我只询问foaf命名空间中的属性。当我从我自己的命名空间中询问属性时,我总是得到空的结果。虽然我准备在这里发布这个问题并做了一些最终的测试,以便能够尽可能精确地发布它,但它突然起作用了。因为我不知道究竟要求什么,我在发布之前删除了我的问题。几个小时后,我使用Protege的Pellet插件来创建和导出推断的模型。我将其称为helloOwlInferred.owl并将其上传到我的服务器上的helloWl.owl所在的目录。我调整了我的方法来加载推断的本体并更改了上面的查询,以便前缀ho:也被分配给推断的本体。立刻,没有任何工作了。确切地说,它不再是没有任何效果,但它与我今天早上的原始查询相同的症状。我的前缀不再起作用了。我做了一个简单的测试:我将所有helloWorldInferred.owl文件(我的服务器上的一个用于前缀和我加载的本地副本)重命名为helloWorld.owl。很奇怪,修复了一切。

将其重命名为helloWorldInferred.owl再次打破了一切。等等。那里发生了什么?我只需要等待几周,直到我的本体被“注册为有效前缀”?

4 个答案:

答案 0 :(得分:2)

也许您的OWL文件包含rdf:ID="something"构造(或其他形式的相对网址,例如rdf:about="#something")?

通过使用OWL文件的基本URL,

rdf:ID和相对URL扩展为完整的绝对URL,例如http://whatever/file.owl#something。如果未在文件中明确指定基本URL(使用xml:base="http://whatever/file.owl"之类的内容),则Web服务器上(或加载本地文件时在文件系统中)文件的位置将用作基本URI。

因此,如果您移动文件或在多个位置拥有副本,那么文件中的URI将会更改,因此您必须相应地更改SPARQL查询。

包含明确的xml:base或避免相对URI和rdf:ID,应该可以解决问题。

答案 1 :(得分:1)

前缀和QNames的整个想法只是压缩URI以节省空间并提高可读性,最常见的问题是在定义本身或QNames中拼写错误。

您查询中使用的前缀定义很可能导致生成的URI与本体中属性的实际URI不匹配。

据说你的问题可能与耶拿有关,所以很可能值得在Jena Mailing List上提出你的问题

答案 2 :(得分:1)

看起来这是由Protege中的错误(或功能?)引起的。当我使用新名称导出推断的本体时,Protege将xmlns(blank)xml:base的定义更改为新文件的名称,但它没有更改实际名称空间的定义。

xmlns="http://xyz.com/helloOwl.owl" =>  xmlns="http://xyz.com/helloOwlInferred.owl"
xml:base="http://xyz.com/helloOwl.owl" =>  xml:base="http://xyz.com/helloOwlInferred.owl"

xmlns:helloOwl="http://xyz.com/helloOwl.owl" =>  xml:base="http://xyz.com/helloOwl.owl"
<!ENTITY helloOwl "http://wxyz.com/helloOwl.owl#" > => <!ENTITY helloOwl "http://wxyz.com/helloOwl.owl#" >

因为我确定它似乎有效 我的错是没有仔细检查实际来源。

答案 3 :(得分:0)

您必须为ho:定义一个精确的URI前缀,然后将其告知Protegé(存在一个名称空间面板,并定义与本体前缀相同的URI),以便在Protegé中定义GoodPerson时,则假设您的意思是http://www.flatlandfarm.de/fhtw/ontologies/2010/5/22/helloOwl.owl#GoodPerson,只有在两者使用相同的URI前缀时,它才与ho:GoodPerson相同。

如果您不这样做,Protegé(或其他组件,例如Web服务器)将做这些愚蠢的事情,例如组成本体的URI和其默认URI前缀(当您不这样做时,它会出现在GoodPerson前面)请不要使用文件名(甚至更糟的是URI,例如file:/// home / user / ...)来指定任何前缀)。

请记住,本体的URI在技术上不同于您用于与本体本身相关的实体(类,属性等)的URI前缀,并且ho:只是具有局部含义的快捷方式,具体取决于关于您在文件或SPARQL查询等文档中定义的内容。

本体URI也可以不同于可从其获取本体文件的URL,尽管最好使它们相同。通常,您需要使用Apache中的URL重写来实现这一点,但是有时该本体文件没有实际发布,因为本体已加载到SPARQL端点中,并且其URI通过端点的帮助被解析为RDF文档。本身,方法是将本体URI重写为发出DESCRIBE语句的SPARQL请求。只要可以从SPARQL端点(即,在三元组存储中)访问关联的数据,就可以使用相同的技巧来解析任何其他URI(即,您的本体实例化数据)。