2015-03-12 5 views
0

Я использую OpenRdf с SPARQL для сбора данных от DBpedia, но я сталкиваюсь некоторые ошибки в следующем запросе побежал против DBpedia SPARQL конечной точки:OpenRdf Исключения при анализе данных из DBpedia

CONSTRUCT{ 
    ?battle ?relation ?data . 
} 
WHERE{ 
    ?battle rdf:type yago:Battle100953559 ; 
      ?relation ?data . 
    FILTER(?relation != owl:sameAs) 
} 
LIMIT 1 
OFFSET 18177 

Я изменил LIMIT и OFFSET указать конкретный результат, который провоцирует проблему.

Отклик это одна:

@prefix foaf: <http://xmlns.com/foaf/0.1/> . 
@prefix ns1: <http://en.wikipedia.org/wiki/> . 
<http://dbpedia.org/resource/Mongol%E2%80%93Jin_Dynasty_War> foaf:isPrimaryTopicOf ns1:Mongol–Jin_Dynasty_War . 

Проблема заключается в том, что ns1: монголо-Jin_Dynasty_War сущность содержит знак минус, поэтому я получаю следующее исключение при выполнении этого запроса внутри приложения Java используя OpenRdf:

org.openrdf.query.QueryEvaluationException: org.openrdf.rio.RDFParseException: '' Ожидаемо, нашел '-' [строка 3]

Есть ли способ обойти эту проблему?

Спасибо!

+1

Это не минус, это черта ('U + 2013'), которая является незаконным символом в этом положении, поэтому это, по-видимому, является ошибкой в ​​записи DBPedia Turtle. Лучше всего, если вы хотите получить выход в другом формате, таком как NTriples. Я не знаком с API OpenRDF, поэтому я не уверен, какие у вас варианты. – Alex

+0

@Alex Спасибо за подсказку, я смог установить выход на NTriples, который полностью решил проблему. – mbernardeau

ответ

1

Чтобы помочь другим пользователям, которые могут столкнуться с одной и той же проблемой, я отправлю здесь способ установки предпочтительного формата вывода для графических запросов с помощью OpenRDF v2.7.x.

Вы должны создающим подкласс SPARQLRepository для доступа к HTTPClient (по какой-то причине, поле protected

public class NtripleSPARQLRepository extends SPARQLRepository { 
    public NtripleSPARQLRepository(String endpointUrl) { 
     super(endpointUrl); 
     this.getHTTPClient().setPreferredRDFFormat(RDFFormat.NTRIPLES); 
    } 
} 

вам просто нужно создать новый экземпляр этого класса:.

NtripleSPARQLRepository repository = new NtripleSPARQLRepository(service); 
RepositoryConnection connection = new SPARQLConnection(repository); 
Query query = connection.prepareQuery(QueryLanguage.SPARQL, "YOUR_QUERY"); 
+0

Хорошее обходное решение. FWIW этот метод не является открытым для общественности - это просто надзор с нашей стороны: вы можете заметить, что в альтернативном классе HTTPRepository он является публично доступным. Я зарегистрировал билет улучшения в Sesame's tracker для решения этой проблемы: https://openrdf.atlassian.net/browse/SES-2193 –

1

Если вы запрашиваете сервер Virtuoso, вы, вероятно, сталкиваетесь с неряшливостью в реализации Virtuoso. Я видел это при получении XML-результатов (вертикальная вкладка вывода, но только XML 1.0), а в последнее время в результатах JSON (\ U побег для символов, не входящих в базовую многоязычную плоскость).