【问题标题】:SPARQL query: using VALUES inline data or UNION with bigdata storeSPARQL 查询:使用 VALUES 内联数据或 UNION 与大数据存储
【发布时间】:2012-09-20 07:24:47
【问题描述】:

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

<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 存储/引擎(大数据)似乎卡住了它:

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

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

我从大数据得到的错误是: 第 5 行第 7 列出现词法错误。遇到:“” (32),之后:“VALUES”

我是否正确地形成了这个查询? 使用 UNION 还是 VALUES 更合适?

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

有什么想法吗?

干杯。

【问题讨论】:

    标签: sparql union rdf blazegraph


    【解决方案1】:

    我猜想,Bigdata 还不支持VALUES 子句。这是最新的 SPARQL 工作草案(几周前发布)中引入的全新功能,因此很自然有几个工具还不支持它。

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

    【讨论】:

    • 阅读大数据文档意味着他们几乎完全支持 SPARQL 1.1 link。但我猜你是对的。我在查询中用BINDINGS ?loc 替换了VALUES (?loc),它按预期工作。
    • 是的,我相信他们会这样做,但是 SPARQL 1.1 是一项正在进行的工作,还不是一个固定的标准。
    【解决方案2】:

    你把语法弄混了一点。要么使用:

    VALUES ?loc { <someAddress> <someOtherAddress> }
    

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

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

    一般形式。

    你也可以试试IN

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

    【讨论】:

    • 你说得对,我确实把帖子中的语法弄乱了,当我使用正确的语法时,我仍然得到同样的错误。
    • 我正在使用正确的语法运行查询(两者都尝试过)。 “过滤器”确实会产生一组正确的结果。您和@JeenBroekstra 都给出了正确解决方案的答案。
    • 是的,绑定/值的名称有一些反复。改变很便宜,所以不幸的是它已经改变了。 (语义也发生了变化,但你可能不会注意到)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    相关资源
    最近更新 更多