Apache Jena获得"ERROR riot"处理元素

sec*_*ind 3 rdf jena

我这里有一个RDF文件:rdf.rdf,其中有35696条记录.我正试图用Jena处理它:

./bin/sparql --data=/tmp/rdf.rdf --query=./basic.query
Run Code Online (Sandbox Code Playgroud)

但我得到了:

21:25:27 ERROR riot                 :: Element type "j.0:target" must be followed by either attribute specifications, ">" or "/>".
Failed to load data
Run Code Online (Sandbox Code Playgroud)

我相信这个问题是一个特定的记录,但我不知道哪一个,有没有人有办法检查这个或命令产生问题的行号?

Jos*_*lor 6

问题是该数据不是RDF/XML(甚至是XML)

输入的一个大问题是它不是合法的RDF/XML,甚至是合法的XML.有许多行包含格式错误的字符串,例如,

$ grep '""' rdf.rdf
<j.0:target rdf:resource="urn:evitakarina""/>
<j.0:target rdf:resource="urn:MiaWaluyo""/>
<j.0:target rdf:resource="urn:AnggaMOB""/>
…
Run Code Online (Sandbox Code Playgroud)

实体也存在一些问题,或者更确切地说,出现不是实体的&符号的地方.例如:

$ grep "&" rdf-without-quotes.rdf 
<j.0:target rdf:resource="urn:HERUWA--&gty"/>
<j.0:target rdf:resource="urn:PiniiPin&andreasbimoo"/>
Run Code Online (Sandbox Code Playgroud)

如果你用它们替​​换每一个&amp;,你会得到更多的东西(虽然可能&gt是这个>?),但仍然存在问题.之后,您可能会追踪:

<j.0:target rdf:resource="urn:cordeliabuvaledesilvaa"jajajajajajajajaja"/>
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何获得有关行号的更好的调试信息.由于这个(不完全)RDF/XML文档是如此有规律地构建,因此为了缩小问题范围而不是很难将其删除几次,并且从经验中看出这些事情通常是由于某些不良角色造成的在它不应该的地方,这就是我在寻找(并找到)的东西.

生成更好的数据

如果您对数据有任何控制(例如,如果您正在生成它),我强烈建议您考虑使用RDF API(例如,Jena)生成数据,以从原始输入数据生成RDF数据是,而不是将其混合到一些基于文本的模板中.这可能会给你最好的输出.否则,您只需要更加小心URL编码必须是URL的东西.大多数语言都包含一些用于处理它的标准库功能.

使用Jena这并不难.我建议尝试重建一个包含有问题的数据的最小模型.这是从您的数据中获取的一个小样本(但它是一个完整的RDF/XML文档(或者,如果它不是针对上面讨论的问题):

<?xml version="1.0" encoding="iso-8859-1" ?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:j.0="urn:" >
<rdf:Description rdf:about="urn:communication243">
    <j.0:hour rdf:datatype="http://www.w3.org/2001/XMLSchema#long">20120219</j.0:hour>
    <j.0:minute rdf:datatype="http://www.w3.org/2001/XMLSchema#long">2012021910</j.0:minute>
    <j.0:source rdf:resource="urn:wirojericko"/>
    <j.0:target rdf:resource="urn:evitakarina""/>
</rdf:Description>
<rdf:Description rdf:about="urn:communication4574">
    <j.0:hour rdf:datatype="http://www.w3.org/2001/XMLSchema#long">20120304</j.0:hour>
    <j.0:minute rdf:datatype="http://www.w3.org/2001/XMLSchema#long">2012030406</j.0:minute>
    <j.0:source rdf:resource="urn:renomaximuz"/>
    <j.0:target rdf:resource="urn:HERUWA--&gty"/>
</rdf:Description>
</rdf:RDF>
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下代码使用Jena重新创建它.我已经将值存储在一个Object[][]数组中,这样我们甚至可以模拟迭代原始输入数据.

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;

public class RecreateRDFExample {
    public static void main(String[] args) {
        final String NS = "urn:";
        final Model model = ModelFactory.createDefaultModel();
        final Object[][] data = {
                { 243, 20120219L, 2012021910L, "wirojericko", "evitakarina\"" }, 
                { 4574, 20120304L, 2012030406L, "renomaximuz", "HERUWA--&gty" }
        };

        final Property hour = model.createProperty( NS+"hour" );
        final Property minute = model.createProperty( NS+"minute" );
        final Property source = model.createProperty( NS+"source" );
        final Property target = model.createProperty( NS+"target" );

        for ( Object[] communication : data ) { 
            final Resource com = model.createResource( NS + "communication" + communication[0] );
            com.addLiteral( hour, (long) communication[1] ); 
            com.addLiteral( minute, (long) communication[2] ); 
            com.addProperty( source, model.createResource( NS+communication[3] ));
            com.addProperty( target, model.createResource( NS+communication[4] ));
        }

        model.write( System.out );
    }
}
Run Code Online (Sandbox Code Playgroud)

输出正是我们所希望的; IRI已经用&quot;和编码了&amp;.

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="urn:" > 
  <rdf:Description rdf:about="urn:communication243">
    <j.0:target rdf:resource="urn:evitakarina&quot;"/>
    <j.0:source rdf:resource="urn:wirojericko"/>
    <j.0:minute rdf:datatype="http://www.w3.org/2001/XMLSchema#long">2012021910</j.0:minute>
    <j.0:hour rdf:datatype="http://www.w3.org/2001/XMLSchema#long">20120219</j.0:hour>
  </rdf:Description>
  <rdf:Description rdf:about="urn:communication4574">
    <j.0:target rdf:resource="urn:HERUWA--&amp;gty"/>
    <j.0:source rdf:resource="urn:renomaximuz"/>
    <j.0:minute rdf:datatype="http://www.w3.org/2001/XMLSchema#long">2012030406</j.0:minute>
    <j.0:hour rdf:datatype="http://www.w3.org/2001/XMLSchema#long">20120304</j.0:hour>
  </rdf:Description>
</rdf:RDF>
Run Code Online (Sandbox Code Playgroud)

  • @JoshuaTaylor你是对的.我在这一点上为secumind提出的唯一建议是,制作一个处理域创建URI的实用程序而不是在创建资源时这样做是很方便的(Joshua知道这一点;他只是确保示例具有高可读性,并且我建议的示例代码不是很好.理由是,维护使用这些类型约定的中心位置的代码要容易得多.(我通常甚至为这些东西创建一个`Conventions.java`类). (2认同)