我一直用这个帖子得到一个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> .
}
这看起来很有希望。我添加了from子句,并将顺序改为“(count(?mid)as?midcount)”,并得到了合理的结果。 –
@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中是合法的。) –
我真的很感激你的反馈,并且对于不仔细研究而感到抱歉。我也使用耶拿和MarkLogic评估,所以最佳实践对我很重要。 “按数量排序(?中间)“raise”Virtuoso 37000错误SP030:SPARQL编译器,第12行:语法错误'('before'?mid'“只要将它括在没有AS的圆括号中就行,并通过验证程序 –