2016-08-15 2 views
-1

У меня есть интересная проблема с запросом SPARQL. Я запрашиваю тройку, и у меня есть несколько совпадений - может быть, 2. Но мне нужен код, чтобы выбрать только один. Совершенно не важно, какой из них. Например: я запрашиваю книгу для 5 лет, и она обнаруживает 2 книги в базе данных, но мне нужно иметь только одну сохраненную переменную (неважно, какой из них). Возможно ли это в SPARQL? Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация. Спасибо всем за ваше время! Изменение входной базы данных - последнее, что я хочу сделать.SPARQL: выберите одну тройку из нескольких матчей?

Пример:

<Book rdf:ID = 0001> 
<Book.Title>Title1</Book.Title> 
<Book.For>5 years old</Book.For> 
<Book.Date>2000</Book.Date> 
</Book> 

<Book rdf:ID = 0002> 
<Book.Title>Title2</Book.Title> 
<Book.For>5 years old</Book.For> 
<Book.Date>2005</Book.Date> 
</Book> 
Construct {?NewDatabase Example_of_book_for_5_years_old ?Title .} 
Where {?Example Book.For "5 years old" . 
     ?Example Book.Title ?Title . 
     }; 

Обе книги соответствуют ИНЕКЕ, но мне нужно только один, чтобы быть в новой продукции базы данных. Неважно, какой из них.

+2

Не видя данных (минимальный фрагмент) и запроса SPARQL, никто вам не поможет! Пожалуйста, добавьте эту информацию на свой вопрос. – AKSW

+0

А что такое "10 rdfs"? – AKSW

+0

Если вам нужен только первый результат запроса, вы можете добавить LIMIT 1 в свой запрос. – kba

ответ

0

Не рассматривая очевидные ошибки в вашем примере запроса, следует использовать SELECT вместо CONSTRUCT. Первый позволяет вам ограничить количество результатов.

Если вы совершенно необходим тройным как результат, вы можете использовать ограниченный SELECT как подзапрос

Чтобы выбрать только один тройной из CONSTRUCT запроса вы можете использовать предложение LIMIT так же, как с SELECT

Construct { ?Example <urn:Book:Title> ?Title } 
Where { 
    ?Example <urn:Book:For> "5 years old" . 
    ?Example <urn:Book:Title> ?Title . 
} 
limit 1 

Это выберет первый результат (заказ не определен).


И нет, судя по SPARQL Grammar, не представляется возможным использовать предложение LIMIT с SPARQL обновлений.

+0

@ThomaszPluskiewicz. Ваш ответ верен, учитывая информацию, которую мы имеем до сих пор. В качестве дополнительной заметки: я бы переформулировал фразу «решение заключается в использовании SELECT вместо CONSTRUCT». Это больше задача использования SELECT внутри шаблона запроса в запросе CONSTRUCT. – AKSW

+0

Привет, большое спасибо за ваш ответ. Можно ли использовать этот подзапрос с помощью select * также для запроса ** DELETE/INSERT/WHERE **? На самом деле мне нужно удалить старый пример и вместо него поставить новый. –

+0

@AKSW На самом деле, я был неправ. 'LIMIT' действительно разрешен с помощью' CONSTRUCT'. Обновление ответа –