SPARQL

2015-07-19 56 views
2

我一直用這個帖子得到一個RDF節點的父母或譜系,所有節點的所有家長:SPARQL query to get all parent of a nodeSPARQL

這很好地工作我演奏家服務器上。對不起,找不到包含具有類似結構的數據的公共端點。

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix bto: <http://purl.obolibrary.org/obo/> 
select (group_concat(distinct ?midlab ; separator = "|") AS ?lineage) 
where 
{ 
    bto:BTO_0000207 rdfs:subClassOf* ?mid . 
    ?mid rdfs:subClassOf* ?class . 
    ?mid rdfs:label ?midlab . 
} 
group by ?lineage 
order by (count(?mid) as ?ordercount) 

+---------------------------------------------------------+ 
|       lineage       | 
+---------------------------------------------------------+ 
| bone|cartilage|connective tissue|tibia|tibial cartilage | 
+---------------------------------------------------------+ 

然後我想,如果我可以通過改變選擇獲得所有節點的譜系

select ?s (group_concat(distinct ?midlab ; separator = "|") AS ?lineage) 

,並在WHERE語句到第一線

?s rdfs:subClassOf* ?mid . 

那些比我有更多SPARQL經驗的人可能不會對查詢超時感到驚訝。

這是一個合理的方法嗎?我在語法上做錯了什麼?

我懷疑是不同的關鍵詞或group子句是瓶頸,因爲這樣只需要一兩秒鐘:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix bto: <http://purl.obolibrary.org/obo/> 
select ?s ?midlab 
where 
{ 
    ?s rdfs:subClassOf* ?mid . 
    ?mid rdfs:subClassOf* ?class . 
    ?mid rdfs:label ?midlab . 
    ?s <http://www.geneontology.org/formats/oboInOwl#hasOBONamespace> "BrendaTissueOBO"^^<http://www.w3.org/2001/XMLSchema#string> . 
} 

回答

2

你的第一個查詢是不合法的。您可以在sparql.org's query validator進行檢查。雖然您可以通過計數(?mid)的順序,您不能將該值綁定到變量並按相同的子句進行排序。這將使你:

select (group_concat(distinct ?midlab ; separator = "|") AS ?lineage) 
where 
{ 
    bto:BTO_0000207 rdfs:subClassOf* ?mid . 
    ?mid rdfs:subClassOf* ?class . 
    ?mid rdfs:label ?midlab . 
} 
group by ?lineage 
order by count(?mid) 

現在,這法律,但它不會使相當多的意義。 group_concat要求您有一些組,並且您將爲每個組內的值進行串聯。在沒有子句的情況下,您將得到一個隱式組,因此group_concat沒有可以。但是你有一個組,由血統,這並沒有太大的意義,因爲?沿襲已經只有每組一個價值(因爲它已經是一個聚合)。如下所示,更好的是組由?s組成。這似乎更正確,並且可能不會超時:

select ?s (group_concat(distinct ?midlab ; separator = "|") AS ?lineage) 
where 
{ 
    ?s rdfs:subClassOf* ?mid . 
    ?mid rdfs:subClassOf* ?class . 
    ?mid rdfs:label ?midlab . 
} 
group by ?s 
order by count(?mid) 
+0

這看起來很有希望。我添加了from子句,並將順序改爲「(count(?mid)as?midcount)」,並得到了合理的結果。 –

+2

@MarkMiller'order by(... as ...)'**不合法**。 Virtuoso可能會接受它(它接受一些非標準的語法),但它不是合法的SPARQL。如果您需要針對另一個端點運行您的查詢,那很可能**不起作用**。你可以選擇(count(?mid)爲?midcount){...} order by?midcount',你可以通過count(?mid)選擇... {...} order,但是你可以't'select ... {...} order by(count(?mid)as?midcount)''。變量綁定形式'(... as ...)'在......按順序不合法。 (然而,它*在* group by中是合法的。) –

+0

我真的很感激你的反饋,並且對於不仔細研究而感到抱歉。我也使用耶拿和MarkLogic評估,所以最佳實踐對我很重要。 「按數量排序(?中間)「raise」Virtuoso 37000錯誤SP030:SPARQL編譯器,第12行:語法錯誤'('before'?mid'「只要將它括在沒有AS的圓括號中就行,並通過驗證程序 –