簡體   English   中英

在SPARQL中測試謂詞的存在

[英]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中將EXISTSBIND組合如下:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM