5

我有以下 RDF 模型:

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

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

:graph1   :hasNode   :node2 .
:graph1   :hasNode   :node3 .

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

?n       ?g        ?centered
-----------------------------
:node1   :graph1   true
:node2   :graph1   false
:node3   :graph1   false

在 SPARQL 1.0 中有没有办法做到这一点?如果没有,可以在 SPARQL 1.1 中完成吗?

4

3 回答 3

4

在 SPARQL 1.0 中,

SELECT * { 
  ?graph :hasNode ?node .
  OPTIONAL{ ?graph :centerNode ?node1 FILTER sameterm(?node, ?node1) }
}

和 ?node1 将在答案中绑定或不绑定。基数虽然很混乱。

OPTIONAL/!BOUND 可以做一种不存在:

SELECT * { 
  ?graph :hasNode ?node .
  OPTIONAL{ ?graph :centerNode ?node1 FILTER sameterm(?node, ?node1) }
  FILTER( !bound(?node1) )
}
于 2013-05-07T12:38:03.213 回答
3

您可以在 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       |
---------------------------------
于 2013-05-06T15:05:43.297 回答
1

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

PREFIX : <http://test.com/#>
ASK WHERE { 
  ?graph :hasNode ?node .
  ?graph :centerNode ?node .
}
于 2013-05-12T14:42:16.260 回答