1

我对 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

4 回答 4

2

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

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

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

包括一个显式的xml:base,或者避免相对的 URI 和rdf:ID,应该可以解决这个问题。

于 2010-07-01T21:39:10.193 回答
1

It looks like this was caused by a bug (or a feature?) in Protege. When I exported the inferred ontology with a new name, Protege changed the definitions of xmlns(blank) and xml:base to the name of the new file, but it did not change the definition of the actual namespace.

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

Since I fixed that it seems to work.
My fault not having examined the the actual source with the necessary attention.

于 2010-07-02T08:49:11.693 回答
1

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

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

话虽这么说,您的问题可能与耶拿有关,因此值得在耶拿邮件列表中提问

于 2010-06-30T14:08:32.390 回答
0

您必须为 定义一个精确的 URI 前缀ho:,然后告诉 Protegé(有一个命名空间面板并定义与本体前缀相同的 URI),这样,当您在 Protegé 中定义 GoodPerson 时,它假定您的意思是http://www.flatlandfarm.de/fhtw/ontologies/2010/5/22/helloOwl.owl#GoodPerson,即ho:GoodPerson仅当您对两者使用相同的 URI 前缀时才相同。

如果您不这样做,Protegé(或其他一些组件,如 Web 服务器)将做这些愚蠢的事情,例如组合本体的 URI 及其默认 URI 前缀(当您未指定时,位于 GoodPerson 前面的前缀)任何前缀)使用文件名(或者更糟糕的是,像 file:///home/user/...这样的 URI)。

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

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

于 2018-08-23T16:00:57.930 回答