3

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

为确保不会弄乱 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>

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

SELECT * WHERE {?s ?p ?o} ORDERBY ?s

结果如下:

<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>谓词作为第一个三元组的一部分。

然而,以下查询不返回任何结果:

SELECT * WHERE {?s <univ-bench.owl#name> ?o}

我已经尝试了几十种组合,有名称空间和没有名称空间,但无法使其工作。谁能解释为什么 RDF 引擎找不到明显存在的谓词?

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

4

2 回答 2

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

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

于 2011-08-22T13:25:13.980 回答
5

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

SELECT * WHERE {?s <univ-bench.owl#name> ?o}

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

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

SELECT * WHERE {?s <http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name> ?o}

或者使用这样的前缀:

PREFIX ub: <univ-bench.owl#>
SELECT * WHERE { ?s ub:name ?o }

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

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

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

于 2011-08-22T10:15:44.010 回答