[英]sparql query in dotNetRDF
我通過Manchester OWL語法轉換器將眾所周知的pizza.owl
本體轉換為RDF文件pizza.rdf
。 我寫了這段代碼,但是沒有結果,但沒有錯誤。 如何通過謂詞MushroomTopping
獲得三元組?
TripleStore store = new TripleStore();
store.LoadFromFile(@"C:\pizza.rdf");
Object results = store.ExecuteQuery("PREFIX pizza:<http://example.org/> SELECT * WHERE { ?X ?Y pizza:MushroomTopping . }
if (results is SparqlResultSet)
{
//Print out the Results
//Console.WriteLine("working up to this ");
SparqlResultSet rset = (SparqlResultSet)results;
foreach (SparqlResult result in rset.Results)
{
Console.WriteLine(result.ToString());
}
}
請參閱使用SPARQL文檔查詢,特別是有關常見錯誤的部分,其中說:
進行查詢時常見的錯誤是默認情況下查詢通常僅在商店中未命名的默認圖形上運行(取決於您的查詢處理器)。 因此,執行查詢可能不會產生任何結果,具體取決於數據所在的圖形以及是否正確配置了數據集。 有關配置不同類型數據集的討論,請參閱SPARQL數據集頁面。 您還可以查看調試SPARQL查詢以獲取在使用內存中SPARQL引擎時調試查詢內容的方法。
這種情況的典型原因是,當您調用LoadFromFile()或LoadFromUri()時,庫會根據數據源自動為圖形分配名稱,因此當您添加商店實例時,它是命名圖形而不是默認圖形。 解決此問題的最簡單方法是在加載圖形實例之后以及使用它執行查詢之前,將圖形實例的BaseUri屬性設置為null。
添加的重點是我的,因為它准確描述了您的情況正在發生的事情。 加載的圖形根據它來自的文件給出一個名稱,因此是一個命名圖形,商店的默認圖形保持為空。
另請注意,由於此問題,您使用的ExecuteQuery()
方法已被特別棄用,並且您將收到有關使用過時方法的編譯器警告。 在將來的版本中可能會刪除此方法,因此應避免使用。
有兩種方法可以解決這個問題,首先如上面引用的文檔中所述,我們可以從圖表中刪除名稱,以便將其視為默認圖表:
Graph g = new Graph();
g.LoadFromFile(@"C:\pizza.rdf");
g.BaseUri = null;
store.Add(g);
或者,您可以通過創建查詢處理器和數據集來完全避免使用不推薦使用的方法,該數據集可讓您直接控制使用哪個圖形作為默認值:
Graph g = new Graph();
g.LoadFromFile(@"C:\pizza.rdf");
ISparqlDataset ds = new InMemoryDataset(g);
LeviathanQueryProcessor processor = new LeviathanQueryProcessor(ds);
Object results = processor.ProcessQuery("# Your query");
RobV的答案很重要,你最終可能會遇到它,但我認為最可能的問題是你的查詢中的前綴是錯誤的。 這是您的查詢:
PREFIX pizza:<http://example.org/>
SELECT * WHERE {
?X ?Y pizza:MushroomTopping .
}
但是,如果你看一下數據中的一些三元組,你會看到,例如:
<http://www.co-ode.org/ontologies/pizza/pizza.owl#RocketTopping> <http://www.w3.org/2002/07/owl#disjointWith> <http://www.co-ode.org/ontologies/pizza/pizza.owl#MushroomTopping> .
披薩:前綴應該是http://www.co-ode.org/ontologies/pizza/pizza.owl# 。 如果你做了那個改變,那么你可能會得到更有意義的結果,比如這些(但我在Jena中運行它,所以結果可能看起來有點不同):
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?s ?p {
?s ?p pizza:MushroomTopping
}
-------------------------------------------------------------------------------
| s | p |
===============================================================================
| _:b0 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:CaperTopping | <http://www.w3.org/2002/07/owl#disjointWith> |
| pizza:PepperTopping | <http://www.w3.org/2002/07/owl#disjointWith> |
| _:b1 | <http://www.w3.org/2002/07/owl#someValuesFrom> |
| pizza:RocketTopping | <http://www.w3.org/2002/07/owl#disjointWith> |
| _:b2 | <http://www.w3.org/2002/07/owl#someValuesFrom> |
| _:b3 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:OnionTopping | <http://www.w3.org/2002/07/owl#disjointWith> |
| _:b4 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| _:b5 | <http://www.w3.org/2002/07/owl#someValuesFrom> |
| pizza:TomatoTopping | <http://www.w3.org/2002/07/owl#disjointWith> |
| pizza:GarlicTopping | <http://www.w3.org/2002/07/owl#disjointWith> |
| _:b6 | <http://www.w3.org/2002/07/owl#someValuesFrom> |
| _:b7 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:OliveTopping | <http://www.w3.org/2002/07/owl#disjointWith> |
| pizza:ArtichokeTopping | <http://www.w3.org/2002/07/owl#disjointWith> |
-------------------------------------------------------------------------------
如何通過謂詞MushroomTopping獲得三元組?
請注意,RDF三元組的形式(主語,謂語,賓語)。 編寫SPARQL查詢時,您需要編寫:
select ?subject ?predicate ?object where {
?subject ?predicate ?object
}
您編寫的查詢有披薩:MushroomTopping在對象位置。 幸運的是,在這種情況下,這可能更有意義,因為披薩:MushroomTopping是一個OWL 類 ,而不是屬性,所以你不太可能看到它出現在謂詞位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.