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

无法通过本地定义的谓词提取RDF三元组,rdf,sparql,ontology,lubm,Rdf,Sparql,Ontology,Lubm,也许我只是不能理解本体论背后的一些基本概念,但这是我的问题。我尝试使用4store从RDF存储中提取三元组,但也尝试使用XML ArmyKnife和指定谓词的SPARQL查询来获取空结果 为了确保RDF语法不会弄乱任何东西,我使用了LUBM生成的数据,并将其精简到合适的大小 <?xml version="1.0" encoding="UTF-8" ?> <rdf:RDF xml:base = "http://www.lehigh.edu/~zhp2/2004/0401/un

也许我只是不能理解本体论背后的一些基本概念,但这是我的问题。我尝试使用4store从RDF存储中提取三元组,但也尝试使用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>
结果如下:

<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>
很明显,我把谓词作为第一个三元组的一部分

但是,以下查询不返回任何结果:

SELECT * WHERE {?s <univ-bench.owl#name> ?o}
我尝试了几十种组合,有名称空间也有,没有名称空间,但都无法实现。有人能解释为什么RDF引擎找不到明显存在的谓词吗


顺便说一句,使用OBJECT=University0提取同一个三元组是可行的。

我怀疑您的问题在于您没有尝试在查询中匹配正确的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中或在SPARQL中使用BASE。如果使用4store,我相信他们的importer命令行中有参数,可以用于在未指定时设置默认的基本URI

您可能想做的另一件事是尝试将数据放入不同的三重存储中,看看您是否经历了相同的行为,如果您这样做,那么这将意味着我所建议的相对与绝对URI存在问题。如果另一家商店回答的查询很好,这将提示4store可能存在错误,在这种情况下,您应该通过他们的邮件列表与他们联系-

这是无效的:

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 said。

这也是我的结论。所以,相信我,我已经尝试了许多名称空间/绝对命名系统,包括您建议的那些。嗯,也许只是没有找到正确的答案:你可能是对的,我对相对URI有一些问题,但这是什么样的问题呢?我做错了什么?此外,我还尝试了其他RDF端引擎,这里是XML ArmyKnife。哦,我想我可能会认识到这一点。是否检查数据中“~”的编码?我知道这让我和鲁姆发生了冲突。我明白你的意思。在我读了你的文章后,我意识到在编码方面存在一些问题,例如,在标题中指定了UTF-8。不过,我认为这不是问题所在。至少不使用“~”我只是通过删除符号来测试它。@Anton您使用了相对URI,因此RDF存储和/或SPARQL引擎一定在某个时候将它们转换为绝对URI。一般来说,在大多数RDF语法中,使用没有基本URI的相对URI是一个错误——在上面尝试示例数据会返回一些与此相关的错误消息。如果4store接受此数据,那么它必须以某种方式转变为绝对URI,而不知道它是如何做到这一点的,即它使用的基本URI是什么,不可能告诉您实际需要查询forThanks、RobV的URI。你最后的建议绝对正确。cygri把它作为一个答案贴了出来,所以我把它标上了=谢谢,伙计们。你和RobV在最后的评论中都是对的。命名空间URI从一开始就应该被定义为绝对的。只需在解决问题之前添加http://即可。是的,这就是LUBM生成器输出的内容。更新:实际上有一个用于LUBM生成器的-ON命令行开关,您可以将本体URI传递给它。我的错误是我只将univ-bench.owl文件名传递给它,而不是完全指定的URI。
PREFIX ub: <univ-bench.owl#>
SELECT * WHERE { ?s ub:name ?o }