SPARQL查询:使用VALUES内联数据或UNION与bigdata存储

时间:2012-09-20 07:24:47

标签: sparql union rdf blazegraph

我的数据集看起来有点像:

<item1> <isLocated> <someAddress>
<item2> <isLocated> <someAddress>
<item3> <isLocated> <someOtherAddress>

我希望能够使用SPARQL来回答这个问题:

“我会在someAddress或someOtherAddress找到哪些项目?”

我可以像这样使用UNION:

SELECT ?item
{
    { ?item <isLocated> <someAddress> }
    UNION { ?item <isLocated> <someOtherAddress }
} 

但是当我开始谈论100或1000的地址时,我认为这会变得非常混乱。

我认为VALUES内联数据可能比一堆UNION查询更合适。 我已经尝试编写以下查询,但我的RDF存储/引擎(bigdata)似乎扼杀了它:

SELECT ?item
{
    ?item <isLocated> ?loc .
}
VALUES (?loc) { (<someAddress>) (<someOtherAddress>) }

(基于http://www.w3.org/TR/sparql11-query/#inline-data

我从bigdata得到的错误是: 第5行第7列的词汇错误。遇到:“”(32),之后:“VALUES”

我是否正确形成了此查询? 使用UNION或VALUES更合适吗?

似乎无论我如何格式化此查询(基于上面链接中的w3示例),我都会遇到类似的词法错误。

有什么想法吗?

干杯。

2 个答案:

答案 0 :(得分:5)

猜测一下,我会说Bigdata还不支持VALUES条款。这是最新的SPARQL工作草案(几周前发布)中引入的一个全新功能,所以很自然地,有些工具还不支持它。

您可以尝试使用BINDINGS代替(这与以前的工作草案大致相同,已被替换)。

答案 1 :(得分:3)

你把语法混淆了一点。使用:

VALUES ?loc { <someAddress> <someOtherAddress> }

这是单个变量的特殊形式,或者:

VALUES (?loc) { ( <someAddress> ) ( <someOtherAddress> ) }

一般形式。

您也可以尝试IN

FILTER (?loc IN ( val1, val2, ...))