首页 文章

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

提问于
浏览
2

我一直在使用这篇文章来获取单个 RDF 节点的父级或谱系:SPARQL 查询以获取节点的所有父节点

这在我的 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 回答

  • 2

    您的第一个查询不合法。你可以在sparql.org 的查询验证器查询。虽然您可以按计数(?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 by子句的情况下,你会得到一个隐含的组,所以没有group_concat就可以了。但是你有一个由血统组成的组,这并没有多大意义,因为?血统每组只有一个值(因为它已经是一个聚合).更好的是by by** 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)
    

相关问题