2014-12-02 72 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