2016-02-29 66 views
2

我正在學習sparql,我正在處理select查詢,我想將ASK查詢的結果綁定到對象變量。在sparql中綁定ASK查詢的結果

ASK查詢正在處理它自己的問題,但我在另一個查詢中使用查詢時遇到問題。

這是ASK查詢:

PREFIX schema: <http://domain.com/app/schema/> 

ASK { GRAPH <http://domain.com/app/data/something> { 

    ?s schema:code "ANS"^^<http://www.w3.org/2001/XMLSchema#string> ; 
    schema:someid "12345678"^^<http://www.w3.org/2001/XMLSchema#string> ; 
    schema:startdate ?startdate . 

    OPTIONAL { ?s schema:enddate ?enddate } 
    BIND(IF(BOUND(?enddate), ?enddate, now()) AS ?resultdate) 
    FILTER(?resultdate >= now() && ?startdate < now()) 
    } 
} 

這將返回true或false取決於該ID。

我現在想的是,返回這樣的兩列的查詢:

+----------+--------+ 
| ID | STATUS | 
+----------+--------+ 
| 12345678 | true | 
| 87654321 | false | 
+----------+--------+ 

我做了一些嘗試,但我不能生產與有效語法查詢:

PREFIX schema2: <http://domain.com/app2/schema/> 
PREFIX schema: <http://domain.com/app/schema/> 

select ?s ?p ?o 
where 
{ GRAPH <http://http://domain.com/app2/data/something> 
{?s ?p ?o } . 

BIND() { 
    ASK { GRAPH <http://domain.com/app/data/something> { 

    ?s schema:code "ANS"^^<http://www.w3.org/2001/XMLSchema#string> ; 
    schema:someid "12345678"^^<http://www.w3.org/2001/XMLSchema#string> ; 
    schema:startdate ?startdate . 

    OPTIONAL { ?s schema:enddate ?enddate } 
    BIND(IF(BOUND(?enddate), ?enddate, now()) AS ?resultdate) 
    FILTER(?resultdate >= now() && ?startdate < now()) 
    } 
} 
} 

FILTER(?s = <http://domain.com/app2/data/something/100024>) 
} 

任何有關如何實現這一目標的建議/例子?

回答

7

您可以使用BIND表達而不是查詢表格(SELECTASK等)。

你可以做的是用exists模式代替ASK。像這樣的東西

PREFIX schema2: <http://domain.com/app2/schema/> 
PREFIX schema: <http://domain.com/app/schema/> 

select ?id ?status 
where 
{ 
    GRAPH <http://http://domain.com/app2/data/something> 
    { 
     ?s schema:someid ?id ; 
    } 

    BIND(exists 
    { 
     GRAPH <http://domain.com/app/data/something> 
     { 
     ?s schema:code "ANS"^^<http://www.w3.org/2001/XMLSchema#string> ; 
      schema:startdate ?startdate . 

     OPTIONAL { ?s schema:enddate ?enddate } 
     BIND(IF(BOUND(?enddate), ?enddate, now()) AS ?resultdate) 
     FILTER(?resultdate >= now() && ?startdate < now()) 
     } 
    } as ?status) 
} 
+0

這太棒了!不知道EXISTS運營商。謝謝! – andebor