2017-02-28 11 views
1

我怎样才能从一个排序的结果列表中访问一个新的查询的谓词+对象对他们的行号?从维基数据在另一个查询中使用有序的查询结果而无需单独处理?

实施例的查询:

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 

Link to this query.

这些一些第一结果的(编辑为了更清楚):

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 

现在我想要做以下查询:
返回此结果列表中第n个谓词+对象的所有主题。

我的实际使用案例是将这些reults的多行与'AND'或'OR'组合起来,例如,返回给出结果的前5个谓词+对象的所有主题。

了解如何访问结果中的某些行将是一个好的开始。如果可能,我不想通过读取结果(使用脚本)并使用它们作为第二个查询的输入来使用单独的查询。

回答

3

了解如何从结果中访问某些行将是一个好的开始。如果可能,我不想通过读取结果(使用脚本)并使用它们作为第二个查询的输入来使用单独的查询。

这是不可能的。您可以在子查询中使用订购方式,但结果在外部查询中不可用作为有序的结果列表;他们只是提供给外部查询。但是,如果您真的只想得到结果,您还可以使用限制偏移,这可能就足够了。举例来说,你会做类似如下(故意简化例如着想,包括完整的样本数据):

@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 | 
----------------- 
+0

不幸的是,刚刚访问第一n个结果不适合我的问题。不管怎么说,还是要谢谢你! – rinderwahn

+1

@rinderwahn您说过“现在我想要执行以下查询: 返回所有使用此结果列表中第n个谓词+对象的主题。”这里的代码被简化了。如果你使用OFFSET和LIMIT,你可以得到第n个结果。我刚刚更新了答案,以便更加明确。 –

+0

对不起。我正要编辑我的评论。使用OFFSET应该完成这项工作。我对SPARQL非常陌生。 – rinderwahn

相关问题