2014-12-02 73 views
0

我正在寻找一种简单的方法从一个概念的所有关系中获取关系。例如: 您搜索名称为“Abc”的概念。它与其他对象有某些关系,如“D”,“Ef”,“Ghi”。结果看起来像:UNION与sparql的子查询

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

所以现在你知道“Abc”的关系。如果你想知道与“Abc”关系的关系,你可以使用子选择。如下面的查询。但是我想要的是这两个结果。我会知道“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 . 
     } 
    } 
} 

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

+0

你想要多少列?你想把“二级”关系作为附加列吗? – 2014-12-02 22:30:30

+0

我想要3列。因为我想用深度。应该有可能得到关系关系的关系..等 – 2014-12-03 09:31:44

回答

1

这里不需要子查询,我的初始尝试比您实际需要的复杂得多。如果你希望所有的主语,谓语,宾语三元其中主体或者是与标签“ABC”,或者它连接到一些东西,你可以使用这个查询:

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

Ç的rdfs:标签“ABC “?c绑定到Abc对象,如同在您的查询中一样。然后?c(<> |!<>)? ?s使得?s或者是?c或者离它一个关系。这是可行的,因为<> |! <>是通配符(因为每个属性是<>或它不是,并且表示零或一次出现)。

例如,对于这个数据和查询,你会得到以下结果:

@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 
} 
+1

如果你不想要6列但只有3个主题,谓词和对象,那么你应该使用CONSTRUCT查询来代替一个SELECT。这样,你回到RDF三元组 - 要容易得多。 – 2014-12-02 23:36:53

+0

我想要3列显示。第1栏是概念,2是关系的种类,3是相关的概念。你有'CONSTRUCT'的例子吗? – 2014-12-03 09:29:09

+0

@JonasB我意识到我原来的答案过于复杂。我更新了一个更简单的查询,它将包含您想要的三列。 – 2014-12-03 11:38:55