在SPARQL中测试谓词的存在

0xF*_*xFF 5 rdf sparql

我有以下RDF模型:

@prefix : <http://test.com/#> .

:graph1   :hasNode   :node1 ;
          :centerNode   :node1 .

:graph1   :hasNode   :node2 .
:graph1   :hasNode   :node3 .
Run Code Online (Sandbox Code Playgroud)

我想运行一个SPARQL查询,其中如果a 与一个谓词:nodeX相关,我返回(或其他一些指示); 结果如下所示::graphX:centerNodetruefalse

?n       ?g        ?centered
-----------------------------
:node1   :graph1   true
:node2   :graph1   false
:node3   :graph1   false
Run Code Online (Sandbox Code Playgroud)

有没有办法在SPARQL 1.0中执行此操作?如果没有,可以在SPARQL 1.1中完成吗?

Jos*_*lor 5

您可以在 SPARQL 1.1 中组合EXISTS和 ,BIND如下所示:

PREFIX : <http://test.com/#>

SELECT * WHERE { 
  ?graph :hasNode ?node .
  BIND( EXISTS { ?graph :centerNode ?node } as ?isCentered )
}
Run Code Online (Sandbox Code Playgroud)

使用 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       |
---------------------------------
Run Code Online (Sandbox Code Playgroud)