2016-02-26 51 views
1

我正在寫一個SPARQL查詢,我正在創建一個RDF圖。我正在使用SPARQL構造。作爲我工作的一個要求,我必須連接兩個主題值並將其與CONSTRUCT語句一起使用。我曾嘗試做如下(我的RDF圖是在炫技):SPARQL:如何結合CONSTRUCT中使用的兩個主題?

prefix map: <#> 
prefix db: <> 
prefix vocab: <vocab/> 
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 
prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> 
prefix jdbc: <http://d2rq.org/terms/jdbc/> 
prefix fn: <http://www.w3.org/2005/xpath-functions#> 

CONSTRUCT { 
?p1 a d2rq:ClassMap 
} 

FROM <http://www.ndssl.bi.vt.edu/fuse> 
WHERE 
{ 
<http://www.ndssl.bi.vt.edu/fuse#DataSource> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class>. 
<http://www.ndssl.bi.vt.edu/fuse#OracleDataSource> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://www.ndssl.bi.vt.edu/fuse#DataSource>. 
?DB <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.ndssl.bi.vt.edu/fuse#OracleDataSource>. 
<http://www.ndssl.bi.vt.edu/fuse#HouseholdsWithinAdminRegion> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class>. 
?Table <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.ndssl.bi.vt.edu/fuse#HouseholdsWithinAdminRegion>. 
BIND(CONCAT(?DB, ?Table) AS ?p1) 
} 

不過,我得到以下錯誤:

Virtuoso RDF01 Error Bad variable value in CONSTRUCT: "http://www.ndssl.bi.vt.edu/fuse#PROTOPOPhttp://www.ndssl.bi.vt.edu/fuse#MIAMI_HOUSEHOLD_2009_1" (tag 246 box flags 0) is not a valid subject, only object of a triple can be a literal 

請讓我知道如何解決這個問題。

+2

CONCAT返回一個文本(字符串)值,但在構造上作爲主題。在RDF中,只有三元組的對象部分可能包含文字值(如錯誤消息中所述)。 – CaptSolo

+1

如果一個三元組以某種方式結束爲非法,literal-subject,bnode-predicate,處理器應該簡單地跳過結果中的三元組。 – AndyS

回答

3

誤差基本上是說,你是串聯兩個URI:

http://www.ndssl.bi.vt.edu/fuse#PROTOPOP 
http://www.ndssl.bi.vt.edu/fuse#MIAMI_HOUSEHOLD_2009_1 

成文字。我不知道你到底想做什麼,但是你真的想要連接整個URI還是僅連接#之後的最後一部分?如果您想在#之後進行連接,則需要省略名稱空間。

bind (concat(strafter(str(?s),str(fuse:)), strafter(str(?o),str(fuse:))) as ?p) 

即使在這個階段綁定的結果是,你需要轉換成一個URI一個literal

bind (uri(concat(strafter(str(?s),str(fuse:)), strafter(str(?o),str(fuse:)))) as ?p) 

一般來說,我會大量簡化查詢:

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix fuse: <http://www.ndssl.bi.vt.edu/fuse#> 
prefix owl:<http://www.w3.org/2002/07/owl#> 

CONSTRUCT { 
    ?p1 a d2rq:ClassMap 
} 

FROM <http://www.ndssl.bi.vt.edu/fuse> 
WHERE 
{ 
    fuse:DataSource a owl:Class. 
    fuse:OracleDataSource rdfs:subClassOf fuse:DataSource. 
    ?DB a fuse:DataSource. 
    fuse:HouseholdsWithinAdminRegion a owl:Class. 
    ?Table a fuse:HouseholdsWithinAdminRegion. 

    bind (uri(concat(strafter(str(?DB),str(fuse:)), 
     strafter(str(?Table),str(fuse:)))) as ?p) 
} 
+0

謝謝你的回覆。但它不起作用。它給我以下錯誤:「Virtuoso 37000錯誤SP031:SPARQL編譯器:內部錯誤:內置函數未實現。」請讓我知道如何解決它。 –

+0

查詢不起作用:1)之間有空白嗎?和表2)變量?TD未分配。 – AKSW

+0

@ user2151087:可能是因爲STRAFTER沒有在您使用的Virtuoso版本中實現。 – AKSW