我有以下RDF模型:
@prefix : <http://test.com/#> .
:graph1 :hasNode :node1 ;
:centerNode :node1 .
:graph1 :hasNode :node2 .
:graph1 :hasNode :node3 .
我想运行一个SPARQL查询,如果:nodeX
与带有谓词{{1}}的{{1}}相关,我会返回:graphX
(或其他一些指示) :centerNode
;结果如下所示:
true
有没有办法在SPARQL 1.0中执行此操作?如果没有,可以在SPARQL 1.1中完成吗?
答案 0 :(得分:3)
在SPARQL 1.0中,
SELECT * {
?graph :hasNode ?node .
OPTIONAL{ ?graph :centerNode ?node1 FILTER sameterm(?node, ?node1) }
}
和?node1将在答案中绑定或不绑定。 但基数很混乱。
OPTIONAL /!BOUND可以做一种NOT EXISTS:
SELECT * {
?graph :hasNode ?node .
OPTIONAL{ ?graph :centerNode ?node1 FILTER sameterm(?node, ?node1) }
FILTER( !bound(?node1) )
}
答案 1 :(得分:2)
您可以在SPARQL 1.1中组合EXISTS
和BIND
,如下所示:
PREFIX : <http://test.com/#>
SELECT * WHERE {
?graph :hasNode ?node .
BIND( EXISTS { ?graph :centerNode ?node } as ?isCentered )
}
使用Jena的ARQ,我得到了这些结果:
$ /usr/local/lib/apache-jena-2.10.0/bin/arq \
--data predicate.n3 \
--query predicate.sparql
---------------------------------
| graph | node | isCentered |
=================================
| :graph1 | :node3 | false |
| :graph1 | :node2 | false |
| :graph1 | :node1 | true |
---------------------------------
答案 2 :(得分:1)
这正是SPARQL中ASK查询的目的:
PREFIX : <http://test.com/#>
ASK WHERE {
?graph :hasNode ?node .
?graph :centerNode ?node .
}