UNION一个带有sparql的子查询

时间:2014-12-02 15:54:50

标签: subquery union sparql

我正在寻找一种从概念的所有关系中获得关系的简单方法。例如: 您搜索名为“Abc”的概念。它与其他对象有某种关系,例如“D”,“Ef”,“Ghi”。结果如下:

-------------------------------------------------------------------------------
| concept | relation      | value   |
=====================================
| uri:Abc | skos:narrower | uri:D   |
| uri:Abc | skos:narrower | uri:Ef  |
| uri:Abc | skos:broader  | uri:Ghi |
-------------------------------------

所以现在你知道了“Abc”的关系。如果你想知道“Abc”关系中的关系,你可以使用一个subselect。如下面的查询。但我想要的是两个结果。我会知道“Abc”的关系,也会知道“D”,“Ef”,“Ghi”的关系。

SELECT (?v1 as ?concept) ?relation ?value WHERE
{
    ?v1 ?relation ?value .
    {
        SELECT ?c1 ?r1 ?v1 WHERE 
        {
            ?c1 rdf:label "Abc" .
            ?c1 ?r1 ?v1 .
        }
    }
}

这是我当前的查询。在制作中我使用了一个过滤器,但是对于这个例子来说没有必要。

1 个答案:

答案 0 :(得分:1)

这里不需要子查询,我最初的尝试比实际需要的要复杂得多。如果你想要所有主题,谓词,对象三元组,其中主题是带有标签“Abc”的东西或它所连接的东西,你可以使用这个查询:

select ?s ?p ?o {
  ?c rdfs:label "Abc" .
  ?c (<>|!<>)? ?s .
  ?s ?p ?o .
}

?cddfs:标签“Abc”?c 绑定到Abc对象,就像在查询中一样。然后?c(&lt;&gt; |!&lt;&gt;)? 使 ?c 或与之相关的某种关系。这是有效的,因为&lt;&gt; |!&lt;&gt; 是一个通配符(因为每个属性都是&lt;&gt; ,或者它不是,并且表示零或一次出现。)

例如,使用此数据和查询,您将获得以下结果:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix skos: <http://www.w3.org/2004/02/skos/core#>.
@prefix : <urn:ex:>.

:Abc rdfs:label "Abc" ;
     skos:narrower :D, :Ef ;
     skos:broader :Ghi .

:D skos:narrower :Da, :De, :Do .

:Ghi skos:narrower :Ginormous, :General .
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
prefix : <urn:ex:>

select ?s ?p ?o {
  ?c rdfs:label "Abc" .
  ?c (<>|!<>)? ?s .
  ?s ?p ?o
}
-------------------------------------
| s    | p             | o          |
=====================================
| :Ghi | skos:narrower | :General   |
| :Ghi | skos:narrower | :Ginormous |
| :D   | skos:narrower | :Do        |
| :D   | skos:narrower | :De        |
| :D   | skos:narrower | :Da        |
| :Abc | skos:broader  | :Ghi       |
| :Abc | skos:narrower | :Ef        |
| :Abc | skos:narrower | :D         |
| :Abc | rdfs:label    | "Abc"      |
-------------------------------------

这个的构造版本(因为你基本上得到三倍)将是:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
prefix : <urn:ex:>

construct { ?s ?p ?o }
where {
  ?c rdfs:label "Abc" .
  ?c (<>|!<>)? ?s .
  ?s ?p ?o
}