Невозможно проанализировать набор результатов SPARQL, поскольку элемент <literal> имеет слишком много атрибутов
Я работаю с dotNetRDF и пытался выполнить запрос SPARQL
PREFIX rdfh: <http://lod2.eu/schemas/rdfh#>
SELECT * WHERE{ ?lo_orderdate <http://lod2.eu/schemas/rdfh#d_year> ?d_year .
FILTER(?d_year = 1993) }
но получил эту ошибку при попытке выполнить его против Сезама:
Unable to Parse a SPARQL Result Set since a <literal> element has too many Attributes, only 1 of 'xml:lang' or 'datatype' may be specified!
StackTrace:
at VDS.RDF.Parsing.SparqlXmlParser.ParseValue(SparqlXmlParserContext context)
at VDS.RDF.Parsing.SparqlXmlParser.Parse(SparqlXmlParserContext context)
at VDS.RDF.Parsing.SparqlXmlParser.Load(ISparqlResultsHandler handler, TextReader input)
at VDS.RDF.Parsing.SparqlXmlParser.Load(ISparqlResultsHandler handler, StreamReader input)
at VDS.RDF.Query.SparqlRemoteEndpoint.QueryWithResultSet(ISparqlResultsHandler handler, String sparqlQuery)
at VDS.RDF.Query.SparqlRemoteEndpoint.QueryWithResultSet(String sparqlQuery)
at VDS.RDF.Query.RemoteQueryProcessor.ProcessQuery(SparqlQuery query)
Пример файла TTL выглядит следующим образом:
@prefix xsd: ... .
@prefix rdfh: ... .
@prefix rdfh-inst: ... . # cannot put real values - don't have enough reputation
rdfh-inst:date_19920101 a rdfh:date ;
rdfh:d_datekey 19920101 ;
rdfh:d_date "January 1, 1992" ;
rdfh:d_dayofweek "Thursday" ;
rdfh:d_month "January" ;
rdfh:d_year 1992 ;
rdfh:d_yearmonthnum 199201 ;
rdfh:d_yearmonth "Jan1992" ;
rdfh:d_daynuminweek 5 ;
rdfh:d_daynuminmonth 1 ;
rdfh:d_daynuminyear 1 ;
rdfh:d_monthnuminyear 1 ;
rdfh:d_weeknuminyear 1 ;
rdfh:d_sellingseason "Winter" ;
rdfh:d_lastdayinweekfl "0" ;
rdfh:d_lastdayinmonthfl "1" ;
rdfh:d_holidayfl "1" ;
rdfh:d_weekdayfl "1" .
rdfh-inst:date_19920102 a rdfh:date ;
rdfh:d_datekey 19920102 ;
rdfh:d_date "January 2, 1992" ;
rdfh:d_dayofweek "Friday" ;
rdfh:d_month "January" ;
rdfh:d_year 1992 ;
rdfh:d_yearmonthnum 199201 ;
rdfh:d_yearmonth "Jan1992" ;
rdfh:d_daynuminweek 6 ;
rdfh:d_daynuminmonth 2 ;
rdfh:d_daynuminyear 2 ;
rdfh:d_monthnuminyear 1 ;
rdfh:d_weeknuminyear 1 ;
rdfh:d_sellingseason "Winter" ;
rdfh:d_lastdayinweekfl "0" ;
rdfh:d_lastdayinmonthfl "1" ;
rdfh:d_holidayfl "0" ;
rdfh:d_weekdayfl "1" .
Я думаю, что я получаю эту ошибку, потому что Сезам возвращает два атрибута, а dotNetRDF ожидает только один
<head>
<variable name='lo_orderdate'/>
<variable name='d_year'/>
<link href='info'/>
</head>
<results>
<result>
<binding name='d_year'>
<literal q:qname='xsd:integer' datatype='http://www.w3.org/2001/XMLSchema#integer'>1993</literal>
</binding>
<binding name='lo_orderdate'>
<uri q:qname='rdfh-inst:date_19930101'>http://lod2.eu/schemas/rdfh-inst#date_19930101</uri>
</binding>
</result>
<result>
<binding name='d_year'>
<literal q:qname='xsd:integer' datatype='http://www.w3.org/2001/XMLSchema#integer'>1993</literal>
</binding>
<binding name='lo_orderdate'>
<uri q:qname='rdfh-inst:date_19930102'>http://lod2.eu/schemas/rdfh-inst#date_19930102</uri>
</binding>
</result>
</results>
Я не получаю эту ошибку при использовании OpenVirtuoso
1 ответ
Дополнительный атрибут q:qname
является специфичным для Сезама расширением стандартного формата. Это параметр конфигурации, который поддерживается Sesame's SPARQLXMLWriter
но не включен по умолчанию.
Однако представляется, что клиентское приложение Workbench включает эту функцию и добавляет эти дополнительные атрибуты при экспорте результатов запроса. Поэтому я подозреваю, что вы получаете результат запроса, выполняя запрос в Workbench, а затем экспортируя результат в файл. Это ошибка в приложении Workbench, и теперь о ней сообщается как таковой (см. SES-2059).
Обходной путь - вместо этого запросить ваш сервер Sesame из другого инструмента, минуя проблему Workbench. Вы можете использовать что-то вроде curl
или вы можете даже сделать это из любого веб-браузера напрямую, если хотите.
Например, если ваш запрос SPARQL был таким:
SELECT * WHERE {?S ?P ?O } LIMIT 100
и у вас есть сервер Sesame, работающий, например, на localhost:8080
и репозиторий, который вы запрашиваете, называется myRepository
, вы можете получить результат с вашего сервера Sesame напрямую, введя этот URL в ваш браузер:
http://localhost:8080/openrdf-sesame/repositories/myRepository?query=SELECT * WHERE {?S ?P ?O } LIMIT 100
Другой обходной путь - обратиться к разработчикам dotNetRDF, чтобы немного ослабить строгость их парсера:)