SPARQL

2015-07-19 37 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的圆括号中就行,并通过验证程序 –