在不单独处理的情况下在另一个查询中使用有序查询结果?
Use ordered query results in another query without separate processing?
如何通过行号访问新查询的排序结果列表中的谓词 + 对象对?
来自维基数据的示例查询:
SELECT ?p ?o (COUNT (?o) as ?oCount) WHERE{
?s ?p ?o. #return every predicate + object...
?s wdt:P31 wd:Q5. #...for humans
?s wdt:P19 wd:Q37100. #...born in Auckland (NZL)
?s wdt:P21 wd:Q6581097. #...which are male
}
GROUP BY ?p ?o ?oCount
ORDER BY DESC(?oCount) #order by most common predicate/object combination
这些是最初的一些结果(为更清晰起见进行了编辑):
p o oCount
--------------------------------------------------------------------
wdt:P19 (place of birth) wd:Q37100 (Auckland) 1083
wdt:P21 (gender) wd:Q6581097 (male) 1083
wdt:P31 (instance of) wd:Q5 (human) 1083
wdt:P27 (country) wd:Q664 (New Zealand) 844
(...)
wdt:P106 (occupation) wd:Q14373094 (rugby player) 202
(...)
wdt:P69 (educated at) wd:Q492467 (Univ. of Auckland) 62
现在我想做以下查询:
Return 本结果列表第 n 个谓词 + 宾语的所有主语。
我的实际用例是将这些结果的多行与 'AND' 或 'OR' 组合在一起,例如return 给出此结果的前 5 个谓词+宾语的所有主题。
了解如何从结果中访问某些行将是一个好的开始。如果可能,我不想通过读取结果(使用脚本)并使用它们作为第二个查询的输入来使用单独的查询。
Knowing how to access certain rows from the results would be a good start. I don't want to use a separate query by reading the results (with a script) and using them as input for a second query, if possible.
这真的不可能。您可以在子查询中使用 order by,但结果在外部查询中无法作为有序结果列表使用;它们只是提供给外部查询。但是,如果您真的只想要 nth 结果,您还可以使用 limit 和 offset,这可能就足够了。例如,您将执行类似以下操作(为了示例而故意简化,并包括示例数据以确保完整性):
@prefix : <urn:ex:>
:p :hasRank 1 .
:q :hasRank 2 .
:r :hasRank 3 .
:s :hasRank 4 .
:t :hasRank 5 .
:u :hasRank 6 .
:v :hasRank 7 .
:x :hasRank 8 .
:a :s :s0, :s1, :s2 ;
:t :t0, :t1 ;
:u :u0, :u1, :u2, :u3 .
prefix : <urn:ex:>
select ?s ?p ?o {
#-- find the fifth ?p by rank
{ select ?p {
?p :hasRank ?rank
}
order by ?rank
limit 1
offset 4
}
#-- get triples using ?p
?s ?p ?o .
}
-----------------
| s | p | o |
=================
| :a | :t | :t1 |
| :a | :t | :t0 |
-----------------
如何通过行号访问新查询的排序结果列表中的谓词 + 对象对?
来自维基数据的示例查询:
SELECT ?p ?o (COUNT (?o) as ?oCount) WHERE{
?s ?p ?o. #return every predicate + object...
?s wdt:P31 wd:Q5. #...for humans
?s wdt:P19 wd:Q37100. #...born in Auckland (NZL)
?s wdt:P21 wd:Q6581097. #...which are male
}
GROUP BY ?p ?o ?oCount
ORDER BY DESC(?oCount) #order by most common predicate/object combination
这些是最初的一些结果(为更清晰起见进行了编辑):
p o oCount
--------------------------------------------------------------------
wdt:P19 (place of birth) wd:Q37100 (Auckland) 1083
wdt:P21 (gender) wd:Q6581097 (male) 1083
wdt:P31 (instance of) wd:Q5 (human) 1083
wdt:P27 (country) wd:Q664 (New Zealand) 844
(...)
wdt:P106 (occupation) wd:Q14373094 (rugby player) 202
(...)
wdt:P69 (educated at) wd:Q492467 (Univ. of Auckland) 62
现在我想做以下查询:
Return 本结果列表第 n 个谓词 + 宾语的所有主语。
我的实际用例是将这些结果的多行与 'AND' 或 'OR' 组合在一起,例如return 给出此结果的前 5 个谓词+宾语的所有主题。
了解如何从结果中访问某些行将是一个好的开始。如果可能,我不想通过读取结果(使用脚本)并使用它们作为第二个查询的输入来使用单独的查询。
Knowing how to access certain rows from the results would be a good start. I don't want to use a separate query by reading the results (with a script) and using them as input for a second query, if possible.
这真的不可能。您可以在子查询中使用 order by,但结果在外部查询中无法作为有序结果列表使用;它们只是提供给外部查询。但是,如果您真的只想要 nth 结果,您还可以使用 limit 和 offset,这可能就足够了。例如,您将执行类似以下操作(为了示例而故意简化,并包括示例数据以确保完整性):
@prefix : <urn:ex:>
:p :hasRank 1 .
:q :hasRank 2 .
:r :hasRank 3 .
:s :hasRank 4 .
:t :hasRank 5 .
:u :hasRank 6 .
:v :hasRank 7 .
:x :hasRank 8 .
:a :s :s0, :s1, :s2 ;
:t :t0, :t1 ;
:u :u0, :u1, :u2, :u3 .
prefix : <urn:ex:>
select ?s ?p ?o {
#-- find the fifth ?p by rank
{ select ?p {
?p :hasRank ?rank
}
order by ?rank
limit 1
offset 4
}
#-- get triples using ?p
?s ?p ?o .
}
-----------------
| s | p | o |
=================
| :a | :t | :t1 |
| :a | :t | :t0 |
-----------------