簡體   English   中英

SPARQL查詢中的“if”

[英]“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}
}

注意:我知道這個查詢非常錯誤,但只是為了澄清我的意圖

編輯:

在這個特定情況下,“聯合”聲明就像

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必須綁定到特定屬性:b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM