在SPARQL中测试谓词的存在

时间:2013-05-06 14:42:09

标签: rdf sparql

我有以下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中完成吗?

3 个答案:

答案 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中组合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       |
---------------------------------

答案 2 :(得分:1)

这正是SPARQL中ASK查询的目的:

PREFIX : <http://test.com/#>
ASK WHERE { 
  ?graph :hasNode ?node .
  ?graph :centerNode ?node .
}