【问题标题】:Cannot extract RDF triple by locally defined predicate无法通过本地定义的谓词提取 RDF 三元组
【发布时间】:2011-11-01 00:14:28
【问题描述】:

可能我只是无法掌握本体背后的一些基本概念,但这是我的问题。我正在尝试使用指定谓词的 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>

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

尽管如此,以下查询没有返回任何结果:

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

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

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

【问题讨论】:

    标签: rdf sparql ontology lubm


    【解决方案1】:

    这是无效的:

    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。

    【讨论】:

    • 谢谢,伙计们。你和 RobV(在他最后的评论中)都是对的。命名空间 URI 应该从一开始就被定义为绝对的。只需在解决问题之前添加http://。是的,这就是 LUBM 生成器的输出。
    • 更新:实际上有一个 -onto 用于 LUBM 生成器的命令行开关,您可以将本体 URI 传递给它。我的错误是我只传递了 univ-bench.owl 文件名而不是完全指定的 URI。
    【解决方案2】:

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

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

    任何用尖括号括起来的东西都被视为一个 URI,因为你使用了一个 relative URI,所以 SPARQL 处理器可能会针对某个任意基数解析它,从而导致 absolute 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,将其重新加载到您的存储中并重试。

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

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

    【讨论】:

    • 这也是我的结论。所以,相信我,我已经尝试了许多命名空间/绝对命名系统(包括你建议的那些)。好吧,也许只是没有打对 :) 你可能是对的,我有“相对 URI 的一些问题”,但那是什么问题?我怎么了?另外,我尝试过其他 RDF endgine,这里是 XML ArmyKnife (xmlarmyknife.com/api/rdf/sparql/query)。
    • 哦,我想我可能会认出这一点。检查数据中'~'的编码?我知道这让我对 LUBM 很感兴趣。
    • 我明白你的意思。在我阅读了您的帖子后,我意识到编码方面存在一些问题(例如,标题中指定了UTF-8)。但尽管如此,这不是我认为的问题。至少没有'~'(我已经通过简单地删除符号对其进行了测试)。
    • @Anton 您使用了相对 URI,因此 RDF 存储和/或 SPARQL 引擎必须在某些时候将它们转换为绝对 URI。一般来说,在大多数 RDF 语法中使用没有基本 URI 的相对 URI 是一个错误——在 w3.org/RDF/Validator 上尝试您的示例数据会返回一些关于此的错误消息。如果 4store 正在接受这些数据,那么它必须以某种方式转换为绝对 URI,而不知道它是如何做到的(即它正在使用什么基本 URI),不可能告诉你你实际需要查询什么 URI
    • 谢谢,RobV。你最后的建议是绝对正确的。 cygri 已将其发布为“答案”,因此我将其标记为一个 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多