2010-06-29 44 views
1

我对SPARQL,OWL和Jena很新,所以请原谅我是否问完全愚蠢的问题。自从几天以来,我遇到了一个让我疯狂的问题。我使用下面的字符串作为一个耶拿QueryFactory.create(queryString)查询,SPARQL - 找到本体需要什么?

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再次打破了一切。等等。那里发生了什么?我是否需要等待几周,直到我的本体被“注册为有效前缀”?

回答

2

问题也许你的OWL文件包含rdf:ID="something"构造(或相对URL的一些其他形式,例如为rdf:about="#something")?

rdf:ID通过使用OWL文件的基本URL,相对URL被扩展为完全绝对URL,例如http://whatever/file.owl#something。如果文件中没有明确指定基本URL(使用类似xml:base="http://whatever/file.owl"的文件),那么文件在Web服务器上的位置(或者在您的文件系统中,如果您加载本地文件)将被用作基本URI。

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

包括明确的​​或避免相对URI和rdf:ID应该解决该问题。

+0

非常感谢。你的回答让我走上了正轨。 – Tom 2010-07-02 08:41:51

1

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

最有可能的是,您在查询中使用的前缀定义会导致生成的URI与本体中的实际URI不匹配。

话虽这么说,您的问题可能是由于一些与耶拿因此它很可能是值得一问你对Jena Mailing List

1

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

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#" > 

由于我修复它似乎工作。
我的故障没有检查实际的来源与必要的关注。