【问题标题】:RdfParseException: Unexpected Character (Code 114) r was encounteredRdfParseException:遇到意外字符(代码 114)r
【发布时间】:2013-10-18 08:14:50
【问题描述】:

我正在尝试使用dotNetRDF 将以下查询发送到DBpedia

PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd:  <http://www.w3.org/2001/XMLSchema#>
PREFIX temp: <http://www.example.com/temp/>

CONSTRUCT {
  ?v1 a temp:r.
  ?v1 temp:p0 ?v2.
}
WHERE {
  OPTIONAL {
    {
      {
        SELECT ?v1
        WHERE {
          ?v1 rdfs:comment ?v2.
        }
        LIMIT 10
      }.
      ?v1 rdfs:comment ?v2.
    }.
  }.
}

但是,我收到一个 RdfParseException 说发现了意外的 r 字符(114 是 r 的十进制字符代码)。

当我对同一查询使用web-based DBpedia SPARQL form 时,我得到了看起来合理的结果。因此,我认为我的 SPARQL 查询没有问题,或者至少没有 DBpedia 无法处理的问题。

我已尝试通过启用Options.HttpDebuggingOptions.HttpFullDebugging 来遵循this question about a similar problem 的建议。如该问题的已接受答案中所述,这确实会将收到的响应打印到 stderr。但是,它确实会引发“不同的错误”;相反,查询似乎是成功的,但是返回的图是空的(它不包含三元组)。

这是重现问题的最小示例:

using System;
using System.Runtime.ConstrainedExecution;

using VDS.RDF;
using VDS.RDF.Query;
using VDS.RDF.Writing;

namespace DotNetRdfParsingError
{
    class Program
    {
        public static void Main(string[] args)
        {
            var endpoint = new SparqlRemoteEndpoint(new Uri("http://dbpedia.org/sparql"));

            string query =
                "PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
                "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
                "PREFIX xsd:  <http://www.w3.org/2001/XMLSchema#>\n" +
                "PREFIX temp: <http://www.example.com/temp/>\n" +
                "\n" +
                "CONSTRUCT {\n" +
                "  ?v1 a temp:r.\n" +
                "  ?v1 temp:p0 ?v2.\n" +
                "}\n" +
                "WHERE {\n" +
                "  OPTIONAL {\n" +
                "    {\n" +
                "      {\n" +
                "        SELECT ?v1\n" +
                "        WHERE {\n" +
                "          ?v1 rdfs:comment ?v2.\n" +
                "        }\n" +
                "        LIMIT 10\n" +
                "      }.\n" +
                "      ?v1 rdfs:comment ?v2.\n" +
                "    }.\n" +
                "  }.\n" +
                "}";

            Console.WriteLine("Without HTTP debugging:");
            try {
                var graph = endpoint.QueryWithResultGraph(query);
                PrintGraph(graph);
            }
            catch (Exception ex) {
                Console.WriteLine("EXCEPTION:\n" + ex.ToString());
            }

            Console.WriteLine("With HTTP debugging:");
            try {
                Options.HttpDebugging = true;
                Options.HttpFullDebugging = true;
                var graph = endpoint.QueryWithResultGraph(query);
                PrintGraph(graph);
            }
            catch (Exception ex) {
                Console.WriteLine("EXCEPTION:\n" + ex.ToString());
            }
        }

        private static void PrintGraph(IGraph graph)
        {
            if (graph != null) {
                using (var stringWriter = new System.IO.StringWriter()) {
                    var turtleWriter = new TurtleWriter();
                    turtleWriter.PrettyPrintMode = true;
                    turtleWriter.Save(graph, stringWriter);
                    Console.WriteLine("Graph:\n\n" + stringWriter.ToString() + "\n");
                }
            } else {
                Console.WriteLine("Graph is null.");
            }
        }
    }
}

这会产生以下输出:

Without HTTP debugging:
EXCEPTION:
VDS.RDF.Parsing.RdfParseException: [Line 1 Column 9] Unexpected Character (Code 114) r was encountered
   bei VDS.RDF.Parsing.Tokens.NTriplesTokeniser.GetNextToken()
   bei VDS.RDF.Parsing.Tokens.BufferedTokenQueue.BufferInternal()
   bei VDS.RDF.Parsing.Tokens.BufferedTokenQueue.InitialiseBuffer(Int32 amount)
   bei VDS.RDF.Parsing.NTriplesParser.Parse(TokenisingParserContext context)
   bei VDS.RDF.Parsing.NTriplesParser.Load(IRdfHandler handler, TextReader input)
   bei VDS.RDF.Parsing.NTriplesParser.Load(IRdfHandler handler, StreamReader input)
   bei VDS.RDF.Query.SparqlRemoteEndpoint.QueryWithResultGraph(IRdfHandler handler, String sparqlQuery)
   bei VDS.RDF.Query.SparqlRemoteEndpoint.QueryWithResultGraph(String sparqlQuery)
   bei DotNetRdfParsingError.Program.Main(String[] args) in c:\Users\uname\Documents\Test\DOTNET\DotNetRdfParsingError\DotNetRdfParsingError\Program.cs:Zeile 43.
With HTTP debugging:
# HTTP DEBUGGING #
HTTP Request to http://dbpedia.org/sparql?query=PREFIX%20rdf%3A%20%20%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0APREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0APREFIX%20xsd%3A%20%20%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0APREFIX%20temp%3A%20%3Chttp%3A%2F%2Fwww.example.com%2Ftemp%2F%3E%0A%0ACONSTRUCT%20%7B%0A%20%20%3Fv1%20a%20temp%3Ar.%0A%20%20%3Fv1%20temp%3Ap0%20%3Fv2.%0A%7D%0AWHERE%20%7B%0A%20%20OPTIONAL%20%7B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20SELECT%20%3Fv1%0A%20%20%20%20%20%20%20%20WHERE%20%7B%0A%20%20%20%20%20%20%20%20%20%20%3Fv1%20rdfs%3Acomment%20%3Fv2.%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20LIMIT%2010%0A%20%20%20%20%20%20%7D.%0A%20%20%20%20%20%20%3Fv1%20rdfs%3Acomment%20%3Fv2.%0A%20%20%20%20%7D.%0A%20%20%7D.%0A%7D

GET
Accept:text/plain,text/ntriples,text/ntriples+turtle,application/rdf-triples,application/x-ntriples,text/plain,text/ntriples,text/ntriples+turtle,application/rdf-triples,application/x-ntriples,text/turtle,application/x-turtle,application/turtle,text/turtle,application/x-turtle,application/turtle,text/n3,text/rdf+n3,text/n3,text/rdf+n3,application/rdf+xml,text/xml,application/xml,application/rdf+xml,text/xml,application/xml,application/json,text/json,application/rdf+json,application/json,text/json,application/rdf+json,text/html,application/xhtml+xml,text/html,application/xhtml+xml,*/*;q=0.5


HTTP Response from http://dbpedia.org/sparql?query=PREFIX%20rdf%3A%20%20%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0APREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0APREFIX%20xsd%3A%20%20%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0APREFIX%20temp%3A%20%3Chttp%3A%2F%2Fwww.example.com%2Ftemp%2F%3E%0A%0ACONSTRUCT%20%7B%0A%20%20%3Fv1%20a%20temp%3Ar.%0A%20%20%3Fv1%20temp%3Ap0%20%3Fv2.%0A%7D%0AWHERE%20%7B%0A%20%20OPTIONAL%20%7B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20SELECT%20%3Fv1%0A%20%20%20%20%20%20%20%20WHERE%20%7B%0A%20%20%20%20%20%20%20%20%20%20%3Fv1%20rdfs%3Acomment%20%3Fv2.%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20LIMIT%2010%0A%20%20%20%20%20%20%7D.%0A%20%20%20%20%20%20%3Fv1%20rdfs%3Acomment%20%3Fv2.%0A%20%20%20%20%7D.%0A%20%20%7D.%0A%7D
HTTP/1.1 200 OK

Connection:keep-alive
Vary:Accept-Encoding
Accept-Ranges:bytes
Content-Length:5451
Content-Type:text/plain
Date:Fri, 18 Oct 2013 08:06:33 GMT
Server:Virtuoso/07.00.3204 (Linux) i686-generic-linux-glibc212-64  VDB

@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ns1:    <http://www.example.com/temp/> .
<http://dbpedia.org/resource/American_Legion_Field_(Florence)>  rdf:type    ns1:r ;
    ns1:p0  "American Legion Field is a baseball venue in Florence, South Carolina, USA. It is home to the Florence Red Wolves of the Coastal Plain League, a collegiate summer baseball league. The Red Wolves have played at the field since 1998. The venue was built sometime before 1981 and has a capacity of 3,500. The field's dimensions are 305 ft. down the foul lines, 335 ft. to the gaps, and 385 ft. to dead center field."@en .
@prefix dbpedia:    <http://dbpedia.org/resource/> .
dbpedia:Francisco_Bautista  rdf:type    ns1:r ;
    ns1:p0  "Francisco Bautista Cuamatzi is a male long-distance runner from Mexico. He represented his native country at the 2008 Summer Olympics in Beijing, PR China, where he finished in 66th place in the men's marathon event, clocking 2:29.28. Rojas set his personal best in the marathon on March 7, 2004 in Torre\u00F3n."@en ,
        "Francisco Bautista ist ein mexikanischer Marathonl\u00E4ufer. Bei den Halbmarathon-Weltmeisterschaften 1999 in Palermo kam er auf den 87. Platz. Im Jahr darauf wurde er F\u00FCnfter beim Marat\u00F3n de la Comarca Lagunera und Achter beim Mailand-Marathon. 2001 wurde er Sechster in der Comarca Lagunera, Zentralamerika/Karibik-Vizemeister im Halbmarathon, belegte bei den Leichtathletik-Weltmeisterschaften in Edmonton Rang 66 und gewann den Monterrey-Marathon."@de .
<http://dbpedia.org/resource/Tillandsia_\u0027Comet\u0027>  rdf:type    ns1:r ;
    ns1:p0  "'Comet' is a hybrid cultivar of the genus Tillandsia in the Bromeliad family."@en .
dbpedia:Glass_Sky   rdf:type    ns1:r ;
    ns1:p0  "Glass Sky is a Japanese manga anthology written and illustrated by Yugi Yamada. It is licensed in North America by Digital Manga Publishing, which released the manga through its June imprint, on December 12, 2007."@en .
dbpedia:Healthcare_in_Guntur    rdf:type    ns1:r ;
    ns1:p0  "The region of Guntur has many health care facilities supported by both the government and private institutions. It is one of the major cities on the east coast region of India in providing excellent medical and health care facilities."@en .
dbpedia:Lake_Nuijamaa   rdf:type    ns1:r ;
    ns1:p0  "Lake Nuijamaa is a lake on the border between Finland and Russia next to the town of Nuijamaa. It is part of the Saimaa Canal linking Vyborg Bay in the Baltic Sea to Lake Saimaa in the Finnish Lakeland."@en ,
        "\u041D\u0443\u0439\u044F\u043C\u0430\u044F\u0440\u0432\u0438\u00A0\u2014 \u043E\u0437\u0435\u0440\u043E \u043D\u0430 \u041A\u0430\u0440\u0435\u043B\u044C\u0441\u043A\u043E\u043C \u043F\u0435\u0440\u0435\u0448\u0435\u0439\u043A\u0435 \u043D\u0430 \u0433\u0440\u0430\u043D\u0438\u0446\u0435 \u0424\u0438\u043D\u043B\u044F\u043D\u0434\u0438\u0438 \u0438 \u0420\u043E\u0441\u0441\u0438\u0438. \u041E\u0437\u0435\u0440\u043E \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043E \u0432 20 \u043A\u043C \u043D\u0430 \u044E\u0433\u043E-\u0432\u043E\u0441\u0442\u043E\u043A \u043E\u0442 \u0444\u0438\u043D\u0441\u043A\u043E\u0433\u043E \u0433\u043E\u0440\u043E\u0434\u0430 \u041B\u0430\u043F\u043F\u0435\u044D\u043D\u0440\u0430\u043D\u0442\u0430 \u0438 \u0432 26\u00A0\u043A\u043C \u043D\u0430 \u0441\u0435\u0432\u0435\u0440\u043E-\u0437\u0430\u043F\u0430\u0434 \u043E\u0442 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u043E\u0433\u043E \u0412\u044B\u0431\u043E\u0440\u0433\u0430. \u0427\u0435\u0440\u0435\u0437 \u043D\u0435\u0433\u043E \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442 \u0421\u0430\u0439\u043C\u0435\u043D\u0441\u043A\u0438\u0439 \u043A\u0430\u043D\u0430\u043B."@ru .
dbpedia:Michelangelo_Unterberger    rdf:type    ns1:r ;
    ns1:p0  "Michelangelo Unterberger (August 11, 1695 \u2013 June 27, 1758), was an Austrian painter. Unterberger was born at Cavalese, in what was then Austrian Tyrol, and was part of an Austrian family of artists. He was originally taught by Giuseppe Alberti, and painted primarily religious-themed works."@en ,
        "Michelangelo Unterberger, auch Michael Angelo Unterberger und Michelangelo Unterperger war ein S\u00FCdtiroler Maler des Barock."@de ,
        "Michelangelo Unterberger, aussi Michael Angelo Unterberger ou Michelangelo Unterperger est un peintre autrichien, originaire de la province autonome de Bolzano, et de l'\u00E9poque baroque."@fr .
<http://dbpedia.org/resource/Miroslav_Ivani%C5%A1evi%C4%87> rdf:type    ns1:r ;
    ns1:p0  "Miroslav Ivani\u0161evi\u0107 is a Montenegrin politician. He was appointed as the Montenegrin Minister of Finance in 1998. In 2007 he was accused of being involved in cigarette smuggling into Italy, but was found not guilty in 2010."@en .
dbpedia:Skin_for_Skin   rdf:type    ns1:r ;
    ns1:p0  "Skin for Skin \u00E8 per ora l'ultimo album pubblicato dalla heavy/christian metal band Bride, nel 2006."@it ,
        "Skin for Skin \u00E9 um \u00E1lbum da banda de heavy metal Bride, lan\u00E7ado em 2006 pela gravadora Retrospective Records. A banda sai de seu estilo alternativo e lan\u00E7a um [disco extremamente pesado e totalmente heavy metal.]"@pt ,
        "Skin for Skinis the twelfth studio album by the rock band Bride."@en .
<http://dbpedia.org/resource/Union_Church_(Buckfield,_Maine)>   rdf:type    ns1:r ;
    ns1:p0  "Union Church is a historic church off ME 140 in Buckfield, Maine. It was built in 1832 and added to the National Register of Historic Places in 1980."@en .

# END HTTP DEBUGGING #
Graph:

@base <http://dbpedia.org/sparql>.

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.

从那里可以看出,结果图仅包含一些前缀,但不包含任何节点或三元组。

异常指向结果图的第 1 行第 9 列,当查看收到的响应时,该异常是前缀声明的 rdf 前缀的开头

@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

我觉得奇怪的一点是,NTriplesTokeniserNTriplesParser 内的某个地方抛出了异常,但返回的图形在我看来就像Turtle 而不是N-Triples

我正在使用latest dotNetRDF version from NuGet,目前是 1.0.1.2809。

我在那里做错了什么,或者在这种情况下是否需要对 dotNetRDF 进行任何其他设置?

编辑:为了完整起见,我应该在带有一些 DBpedia 数据的本地 Virtuoso 安装中添加它,不会发生崩溃。

【问题讨论】:

    标签: rdf sparql dbpedia dotnetrdf


    【解决方案1】:

    是的,看起来 DBPedia 做错了事,出于某种原因,返回 Turtle 时返回的是 text/plainContent-Type,而不是 Turtle 的适当值 application/turtle。这就是为什么 dotNetRDF 选择 NTriples 解析器然后遇到问题的原因。

    值得向 DBPedia 人员报告此问题,看看他们是否可以解决此问题

    dotNetRDF 可以改进我们形成 Accept 标头的方式,将 text/plain 放在列表的下方,但这仍然无法解决 DBPedia 似乎在进行内容协商不正确的事实。

    您可以使用RdfAcceptHeader 属性来解决此问题,如文档所述:

    可用于解决不喜欢广泛的有缺陷的端点 接受dotNetRDF默认发送的Header。

    例如:

    endpoint.RdfAcceptHeader = "application/turtle";
    

    使用此解决方法,给出的代码不会引发异常。

    除了 HTTP 调试

    关于 HTTP 调试引发不同错误的最后一点,Options.HttpFullDebugging 使用响应流,因此解析器接收到已经在末尾的流。

    根据解析器的不同,这可能会导致不同的解析错误,但对于文本格式的 NTriples,空流是有效的空图序列化。该图恰好有一些前缀,因为 dotNetRDF 中的 Graph 实例始终具有默认定义的前缀 rdfrdfsxsd

    【讨论】:

    • 感谢所有的解释;我将向 DBpedia 团队发送一封电子邮件,并在我的应用程序的连接设置中添加一个选项,以设置自定义接受标头。
    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多