2015-08-31 6 views
1

Допустим, у меня есть следующий набор данных:SPARQL ограничение результата запроса по переменной вместо числа строк

:a rdf:type  :AClass 
:a :hasName  "a"^^xsd:string 
:a :hasProperty :xa 
:a :hasProperty :ya 
:a :hasProperty :za 

:b rdf:type  :AClass 
:b :hasName  "b"^^xsd:string 
:b :hasProperty :xb 
:b :hasProperty :yb 

:c rdf:type  :AClass 
:c :hasName  "c"^^xsd:string 
:c :hasProperty :xc 

Я хочу запросить набор данных, чтобы дать мне обратно все из экземпляра :AClass , но только для двух экземпляров. Я знаю, что мне нужно использовать ключевое слово LIMIT, и я пробовал много запросов, но без успеха.

Другими словами, я хочу получить обратно это:

:a :hasName  "a"^^xsd:string 
:a :hasProperty :xa 
:a :hasProperty :ya 
:a :hasProperty :za 

:b :hasName  "b"^^xsd:string 
:b :hasProperty :xb 
:b :hasProperty :yb 

Как я могу ограничить результат в количестве 2 экземпляров, а не количество строк 2?

ответ

7

Используйте подзапрос, чтобы выбрать две вещи, а затем получить остальную часть данных во внешнем запросе. Он всегда помогает показывать законные рабочие данные, с которыми мы можем протестировать. Данные, которые вы указали, на самом деле не являются законными RDF (поскольку в конце строки не хватает некоторых периодов), но мы можем легко создать рабочий пример. Вот рабочие данные, запрос, и результаты:

@prefix : <urn:ex:> 

:a a :AClass . 
:a :hasName "a" . 
:a :hasProperty :xa . 
:a :hasProperty :ya . 
:a :hasProperty :za . 

:b a :AClass . 
:b :hasName "b" . 
:b :hasProperty :xb . 
:b :hasProperty :yb . 

:c a :AClass . 
:c :hasName "c" . 
:c :hasProperty :xc . 
prefix : <urn:ex:> 

select ?s ?p ?o { 
    #-- first, select two instance of :AClass 
    { select ?s { ?s a :AClass } limit 2 } 

    #-- then, select all the triples of 
    #-- which they are subjects 
    ?s ?p ?o 
} 
-------------------------------------------------------------------- 
| s | p             | o  | 
==================================================================== 
| :a | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | :AClass | 
| :a | :hasName           | "a"  | 
| :a | :hasProperty          | :xa  | 
| :a | :hasProperty          | :ya  | 
| :a | :hasProperty          | :za  | 
| :b | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | :AClass | 
| :b | :hasName           | "b"  | 
| :b | :hasProperty          | :xb  | 
| :b | :hasProperty          | :yb  | 
-------------------------------------------------------------------- 
+0

Я уже пробовал это решение и оно не работает. Это ограничивает результат за строкой. – whitefang1993

+0

Если мне не хватает чего-то в вашем вопросе, похоже, это то, что вы хотите. Это говорит о том, чтобы выбрать две вещи, которые являются экземплярами класса a, а затем, после того, как эти два были выбраны, получить всю информацию о них. Если вы не получите эти результаты, можете ли вы отправить точный запрос, который вы пробовали, и результаты, которые вы получаете? –

+0

Результат: rdf: type cos: Car и rdf: type cos: Car – whitefang1993