首页 文章

SPARQL 查询中的“if”

提问于
浏览
3

我的问题很简单:我有一个包含以下内容的源my:g1

my:a1 my:b "literal 1"

然后我有第二个来源my:g2,其中包含:

my:a2 my:b my:c.
my:c rdfs:label "literal 2"

如何设置生成类似以下内容的 SPARQL 查询:

| ?a    | ?b    | ?literal    |
|-------|-------|-------------|
| my:a1 | my:b  | "literal 1" |
| my:a2 | my:b  | "literal 2" |

即。我怎么能告诉 sparql 为"literal 1""literal 2"使用相同的变量:我正在寻找类似的东西

Select ?a ?b ?literal 
where {
 if (?g = my:g1) then
  GRAPH ?g { ?a ?b ?literal}
 else if (?g = my:g2) then
  GRAPH ?g { ?a ?b ?c. ?c rdfs:label ?literal}
}

注意:我知道这个查询非常错误,但只是为了澄清我的意图

编辑:

在这个特定情况下,“联合”声明就像

select ?a ?b ?literal 
where {
{
 GRAPH my:g1 { ?a ?b ?literal}
}
union
{
  GRAPH my:g2 { ?a ?b ?c. ?c rdfs:label ?literal}
}
}

会起作用,但不是我的“真实”案例。还有其他解决方案吗?

1 回答

  • 2

    您可以使用属性路径和过滤器。这里的技巧是带有问号的属性路径表示长度为 0 或 1 的路径。如果路径长度为 0,那么?literal 与?c 相同,它涵盖了?a 直接与文字。如果路径长度为 1,那么?literal 是_c_的值为?c。

    这是一个真实数据的例子:

    @prefix : <urn:ex:>
    
    :a :b "literal 1" .
    :a :b :c .
    :c :label "literal 2" .prefix : <urn:ex:>
    
    select distinct ?a ?b ?literal where {
      ?a ?b ?c .
      ?c :label? ?literal
      filter isLiteral(?literal)
    }
    
    -----------------------------
    | a  | b      | literal     |
    =============================
    | :a | :b     | "literal 1" |
    | :a | :b     | "literal 2" |
    | :c | :label | "literal 2" |
    -----------------------------
    

    你可能没想到结果中的最后一行,但如果?a 和?b 是变量,那么它是有意义的,因为没有什么说变量**?b**必须绑定到特定属性* * :b **。

相关问题