在sparql中绑定ASK查询的结果
Bind result of ASK query in sparql
我正在学习 sparql,目前正在研究 select 查询,我想将 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())
}
}
这 returns 对或错取决于 id。
我现在想要的是 returns 两列这样的查询:
+----------+--------+
| 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>)
}
任何 advice/examples 如何实现的?
您可以将 BIND
与表达式一起使用,但不能与查询表单(SELECT
、ASK
等)一起使用。
您可以将 ASK
替换为 exists
模式。像这样
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)
}
我正在学习 sparql,目前正在研究 select 查询,我想将 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())
}
}
这 returns 对或错取决于 id。
我现在想要的是 returns 两列这样的查询:
+----------+--------+
| 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>)
}
任何 advice/examples 如何实现的?
您可以将 BIND
与表达式一起使用,但不能与查询表单(SELECT
、ASK
等)一起使用。
您可以将 ASK
替换为 exists
模式。像这样
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)
}