[英]how to extract subject (Name) in comparison with predicate from a RDF Triple using sparql
[英]Cannot extract RDF triple by locally defined predicate
可能我只是無法掌握本體背后的一些基本思想,但這是我的問題。 我正在嘗試從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>
然后我運行一個查詢來查看導入后我的數據庫實際包含的三元組:
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”提取相同的三元組工作正常。
這是無效的:
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所說。
我懷疑您的問題是您沒有嘗試匹配查詢中的正確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,將其重新加載到商店中並重試。
您可以使用RDF / XML中的xml:base="http://example.org"
或SPARQL中的BASE <http://example.org/>
。 如果使用4store,我相信他們的importer命令行有參數,可用於設置何時指定none的默認基URI。
您可能想要做的另一件事是嘗試將您的數據放入不同的三元組商店,看看您是否遇到相同的行為,如果您這樣做,這將意味着相對於絕對URI的問題,正如我所建議的那樣。 如果其他商店回復查詢很好,這表明可能存在4store的錯誤,在這種情況下,您應該在他們的郵件列表上聯系他們 - http://groups.google.com/group/4store-support
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.