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

Ant*_*dev 3 rdf ontology sparql lubm

可能我只是无法掌握本体背后的一些基本思想,但这是我的问题.我正在尝试从RDF存储中提取三元组(使用4store,但也尝试使用XML ArmyKnife),并使用SPARQL查询指定谓词并获取空结果.

为了确保我没有使用RDF语法弄乱任何东西,我使用LUBM生成的数据(剥离到适合的示例大小).

<?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>
Run Code Online (Sandbox Code Playgroud)

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

SELECT * WHERE {?s ?p ?o} ORDERBY ?s
Run Code Online (Sandbox Code Playgroud)

这是结果:

<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>
Run Code Online (Sandbox Code Playgroud)

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

然而,以下查询返回没有结果:

SELECT * WHERE {?s <univ-bench.owl#name> ?o}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几十种组合,使用名称空间和没有,但无法使其工作.任何人都可以解释为什么RDF引擎找不到明显存在的谓词吗?

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

cyg*_*gri 6

这是无效的:

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所说.

  • **更新**:实际上有一个用于LUBM生成器的`-onto`命令行开关,您可以将本体URI传递给.我的错误是我只将`univ-bench.owl`文件名传递给它而不是完全指定的URI. (2认同)

Rob*_*obV 5

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

SELECT * WHERE {?s <univ-bench.owl#name> ?o}
Run Code Online (Sandbox Code Playgroud)

括号中包含的任何内容都被视为URI,因为您使用了相对 URI,SPARQL处理器可以根据某个任意基础解析它,导致绝对 URI与数据中的URI不同,因此您的查询将不匹配任何内容.

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

SELECT * WHERE {?s <http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name> ?o}
Run Code Online (Sandbox Code Playgroud)

或者像这样使用前缀:

PREFIX ub: <univ-bench.owl#>
SELECT * WHERE { ?s ub:name ?o }
Run Code Online (Sandbox Code Playgroud)

如果这些都不起作用,那么我怀疑它是相对URI的一些问题.我的建议永远不会使用相对URI,尽可能使用绝对URI.如果必须使用相对URI,请始终明确指定基本URI,即确保您的数据使用绝对URI,将其重新加载到商店中并重试.

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

您可能想要做的另一件事是尝试将您的数据放入不同的三元组商店,看看您是否遇到相同的行为,如果您这样做,这将意味着相对于绝对URI的问题,正如我所建议的那样.如果其他商店回复查询很好,这表明可能存在4store的错误,在这种情况下,您应该在他们的邮件列表上联系他们 - http://groups.google.com/group/4store-support