【问题标题】:Boolean checks in SPARQL, check for existence of a statementSPARQL 中的布尔检查,检查语句是否存在
【发布时间】:2012-11-12 15:10:44
【问题描述】:

假设我有一个包含视频元数据的三重存储。视频可以有任意选择的预定义标签,如下所示:

v1 ex:hasTag A.
v2 ex:hasTag B.
v3 ex:hasTag A;
   ex:hasTag B.

所以为了这个例子,只有两个预定义的标签AB

现在我想在这样的(或类似的)矩阵中大致了解哪个视频附加了哪些标签:

    A     B 

v1  true  false
v2  false true
v3  true  true

但是,我不知道如何实现这一点。首先,我需要一个布尔测试,例如isTrue(?video ex:hasTag A) 之类的东西或任何它的样子。即使那样,我也不知道该放在哪里。如果我把前面的语句放在 WHERE 子句中,查询结果当然只包含标签为A 的视频。

来自 SQL,我可以想象我需要以某种方式使用子查询,but these seem not to be standardized at the moment。我也看到了FILTER 关键字,但我觉得这不是我想要的。

我目前不知所措,但总是愿意学习。任何帮助表示赞赏。

【问题讨论】:

    标签: boolean rdf sparql semantic-web


    【解决方案1】:

    子查询在 SPARQL 1.1 中,现在已冻结。已经有几个完整的实现了。

    除了嵌套的 SELECT 子查询,SPARQL 1.1 还具有用于测试模式是否匹配的 EXISTS 和 NOT EXISTS 函数。它# 是子查询的一种形式。您可以在 FILTER 中使用它,或者如果您真的想返回 true/false:

    BIND(EXISTS{?video ex:hasTag "A"} AS ?a)
    

    甚至:

    SELECT ?video (EXISTS{?video ex:hasTag "A"} AS ?a) (EXISTS{?video ex:hasTag "B"} AS ?b)
    {           
      ?video a ex:Video .
    }
    

    【讨论】:

    • 使用 EXISTS,如果我想检查多个值,比如EXISTS(?video ex:hasTag ("A" || "B")}
    • 这是一个完整的模式:EXISTS{ ?video ex:hasTag ?X . FILTER (?X IN ("A" , "B"))}
    【解决方案2】:

    尝试从以下内容开始:

    SELECT ?video ?tagA ?tagB {
      ?video a ex:Video .
      OPTIONAL { ?video ex:hasTag ?tagA . FILTER (?tagA = "A") }
      OPTIONAL { ?video ex:hasTab ?tagB . FILTER (?tagB = "B") }
    }
    

    这将是你大致想要的。如果您确实必须使用布尔值而不是简单地检查未绑定的 val,请使用:

    SELECT ?video (bound(?tagA) as ?a) (bound(?tagB) as ?b) { ... }
    

    附:子查询(非常接近,在撰写本文时提出的建议)standardised in SPARQL 1.1

    【讨论】:

    • 谢谢,这正是我需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2020-07-20
    • 1970-01-01
    • 2019-06-30
    • 2019-08-01
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多