首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过本地定义的谓词提取RDF三元组

无法通过本地定义的谓词提取RDF三元组
EN

Stack Overflow用户
提问于 2011-08-22 17:35:34
回答 2查看 389关注 0票数 3

也许我只是不能理解本体论背后的一些基本概念,但这是我的问题。我尝试使用SPARQL查询指定谓词从RDF存储(使用4store,但也尝试了XML )中提取三元组,并得到空结果。

为了确保我不会搞乱RDF语法,我使用了LUBM生成的数据(缩减为适合示例的大小)。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
  xml:base = "http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl"
  xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
  xmlns:owl="http://www.w3.org/2002/07/owl#"
  xmlns:ub="univ-bench.owl#"
>

<owl:DatatypeProperty rdf:ID="name">
  <rdfs:label>name</rdfs:label>
</owl:DatatypeProperty>

<owl:Class rdf:ID="Organization">
  <rdfs:label>organization</rdfs:label>
</owl:Class>

<owl:Class rdf:ID="University">
  <rdfs:label>university</rdfs:label>
  <rdfs:subClassOf rdf:resource="#Organization" />
</owl:Class>

<ub:University rdf:about="http://www.University0.edu">
   <ub:name>University0</ub:name>
</ub:University>

</rdf:RDF>

然后我运行一个查询,看看我的数据库在导入后实际包含哪些三元组:

代码语言:javascript
复制
SELECT * WHERE {?s ?p ?o} ORDERBY ?s

结果如下:

代码语言:javascript
复制
<http://www.University0.edu>    <univ-bench.owl#name>   "University0"
<http://www.University0.edu>    <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <univ-bench.owl#University>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>         <http://www.w3.org/2000/01/rdf-schema#label>    "organization"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>     <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#Class>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/2000/01/rdf-schema#subClassOf>       <http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/2000/01/rdf-schema#label>    "university"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#Class>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name>     <http://www.w3.org/2000/01/rdf-schema#label>    "name"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name>     <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#DatatypeProperty>

很明显,我将<univ-bench.owl#name>谓词作为第一个三元组的一部分。

然而,下面的查询没有返回任何结果:

代码语言:javascript
复制
SELECT * WHERE {?s <univ-bench.owl#name> ?o}

我已经尝试了几十种组合,有名称空间的也有没有名称空间的,但都不能正常工作。有人能解释一下为什么RDF引擎找不到一个明显存在的谓词吗?

顺便说一句,用OBJECT="University0“提取相同的三元组可以正常工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-22 21:25:14

这无效:

xmlns:ub="univ-bench.owl#"

命名空间URI在RDF/XML中必须是绝对的。(它们在其他语法中可以是相对的,如Turtle,但在RDF/XML中不是。)如果您的示例确实是由LUBM直接生成的,那么LUBM就失效了。这应该是可行的:

xmlns:ub="http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#"

当然,您需要在SPARQL查询中匹配该URI,就像@RobV所说的那样。

票数 6
EN

Stack Overflow用户

发布于 2011-08-22 18:15:44

我怀疑您的问题在于您没有尝试在查询中匹配正确的URI:

代码语言:javascript
复制
SELECT * WHERE {?s <univ-bench.owl#name> ?o}

尖括号中的任何内容都被视为URI,由于您使用了相对URI,因此SPARQL处理器可能会针对某个任意基数解析它,从而导致绝对URI不同于数据中的绝对URI,因此查询将不会匹配任何内容。

您需要做的是指定完整的URI,如下所示:

代码语言:javascript
复制
SELECT * WHERE {?s <http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name> ?o}

或者像这样使用前缀:

代码语言:javascript
复制
PREFIX ub: <univ-bench.owl#>
SELECT * WHERE { ?s ub:name ?o }

如果所有这些都不起作用,那么我怀疑这是相对URI的问题。我的建议是,永远不要使用相对URI,只要有可能,总是使用绝对URI。如果您必须使用相对URI,请始终显式指定Base URI,即确保您的数据使用绝对URI,将其重新加载到您的存储中,然后重试。

您可以使用RDF/XML中的xml:base="http://example.org"或SPARQL中的BASE <http://example.org/>来完成此操作。如果使用4store,我相信他们的importer命令行有参数可以用来设置默认的基本URI,当没有指定的时候。

你可能想要做的另一件事是尝试将你的数据放入一个不同的三元组存储中,看看你是否经历了同样的行为,如果你这样做了,那么这将意味着我所建议的相对URI与绝对URI之间的问题。如果其他商店很好地回答了这个问题,那就说明4store可能有问题,在这种情况下,你应该联系他们的邮件列表-- http://groups.google.com/group/4store-support

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7145502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档