"if" 在 SPARQL 查询中
"if" in a SPARQL query
我的问题很简单:
我有一个来源 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}
}
}
可以,但不是我的 "real" 情况。还有其他解决方案吗?
您可以使用 属性 路径和过滤器。这里的技巧是,带问号的属性路径表示长度为0或1的路径。如果路径长度为0,则?literal与?c相同,涵盖了?a时的情况与文字直接相关。如果路径长度为 1,则 ?literal 是 rdfs:label for ?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.
我的问题很简单:
我有一个来源 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}
}
}
可以,但不是我的 "real" 情况。还有其他解决方案吗?
您可以使用 属性 路径和过滤器。这里的技巧是,带问号的属性路径表示长度为0或1的路径。如果路径长度为0,则?literal与?c相同,涵盖了?a时的情况与文字直接相关。如果路径长度为 1,则 ?literal 是 rdfs:label for ?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.