SPARQL获取所有节点的所有父节点

时间:2015-07-19 00:53:09

标签: rdf sparql virtuoso

我一直在使用这篇文章来获取单个RDF节点的父母或血统:SPARQL query to get all parent of a node

这在我的virtuoso服务器上很好用。抱歉,找不到包含具有类似结构的数据的公共端点。

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经验的人可能不会对查询超时感到惊讶。

这是一种合理的方法吗?我在语法上做错了吗?

我怀疑distinct关键字或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> .
}

1 个答案:

答案 0 :(得分: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)

现在,这是 legal ,但它并没有那么多意义。 group_concat 要求您拥有一些组,并且您将对每个组中的值进行连接。如果没有 group by 子句,则会获得一个隐式组,因此没有 group by group_concat 就可以了。但你有一个分组?lineage ,这并没有多大意义,因为?lineage 每组只有一个值(因为它已经是骨料)。更好的是分组?,如下所示。这似乎更正确,可能不会超时:

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)