我想計算外部人的可見度,只有當他們在與fr:human-1(這是人類看到的)相同的房間中人數超過時纔會開啓。SPARQL子查詢變量範圍
我想出了一個相當複雜的查詢工作正常,但似乎是多餘的:
SELECT ?actor
WHERE {
?room o:contains fr:human-1 .
?actor o:in ?room .
{?actor a o:Human . }
UNION
{?actor a o:Alien .
filter(?aliens < ?humans) {
SELECT (count(distinct ?alien) as ?aliens)
(count(distinct ?human) as ?humans)
WHERE {
?room o:contains fr:human-1 .
?human a o:Human .
?human o:in ?room .
?alien a o:Alien .
?alien o:in ?room .
}
}
}
}
顯然,像?room o:contains fr:human-1
一些關係遍歷兩次。我嘗試從內部查詢返回?room
,以便外部查詢使用它,並從外部查詢中除去?room o:contains fr:human-1
。但是,這似乎打破了該模式,因爲整個查詢然後返回了子查詢未返回的值?room
。我認爲這是因爲actor o:in ?room .
關係不僅與預先計算的?room
相匹配。
現在我想知道是否可以從子查詢中返回?human
和?alien
,然後在外部查詢中以某種方式將它們合併到?actor
變量中。
沒錯。我計算了外星人的能見度,只有當他們在同一個房間里人數超過人數時,纔會開啓這個外星人,這是人類看到的。是的,'o:contains'被定義爲'o:in'的倒數,雖然是冗餘的,但至少不會產生多次計算。 – user1048677
我希望我可以使用在子查詢中計算的結果來消除來自外部查詢的代碼重複,例如'?room'。 – user1048677