[英]Testing the presence of a predicate in SPARQL
我有以下RDF模型:
@prefix : <http://test.com/#> .
:graph1 :hasNode :node1 ;
:centerNode :node1 .
:graph1 :hasNode :node2 .
:graph1 :hasNode :node3 .
我想運行一個SPARQL查詢中,如果:nodeX
是關系到一個:graphX
與謂詞:centerNode
我返回true
(或其他指示),否則false
; 結果如下所示:
?n ?g ?centered
-----------------------------
:node1 :graph1 true
:node2 :graph1 false
:node3 :graph1 false
有沒有辦法在SPARQL 1.0中執行此操作? 如果沒有,可以在SPARQL 1.1中完成嗎?
在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) )
}
您可以在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 |
---------------------------------
這正是SPARQL中ASK查詢的目的:
PREFIX : <http://test.com/#>
ASK WHERE {
?graph :hasNode ?node .
?graph :centerNode ?node .
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.