gpt4 book ai didi

sparql - SPARQL 查询中的 "if"

转载 作者:行者123 更新时间:2023-12-02 23:21:26 29 4
gpt4 key购买 nike

我的问题很简单:我有一个源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}
}

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

编辑:

在这种特定情况下,“union”语句如

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

可以,但不是我的“真实”案例。还有其他解决办法吗?

最佳答案

您可以使用属性路径和过滤器。这里的技巧是,带问号的属性路径表示长度为 0 或 1 的路径。如果路径长度为 0,则 ?literal 与 ?c 相同,它涵盖了 ?a 直接与一个字面意思。如果路径长度为 1,则 ?literal 是 ?c 的 rdfs:label 的值。

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

@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 必须是绑定(bind)到特定属性:b

关于sparql - SPARQL 查询中的 "if",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30259948/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com