2016-07-21 1 views
0

문제가 있으며 수 시간 동안 검색 한 후에도 적절한 솔루션을 찾을 수 없습니다. 거북이 문법 (~ 8GB)으로 거대한 RDF 문서를 파싱하고 싶습니다. 이것이 jena riot에서 제공하는 스트림 접근 방식을 선택한 이유입니다. 즉 RDFDataMgr입니다. 처리중인 파일이 공백을 포함하는 잘못된 URI를 사용합니다. 이 경우 치명적인 예외가 발생하고 구문 분석이 중지됩니다. 어쨌든 아무 쓸모가 없기 때문에 그 내용을 잘못된 것으로 인식하고 전체 진술을 건너 뛰고 싶습니다. apache email archive에서 제안 된 솔루션을 시도했지만 트리플이 방출되기 전에 예외가 발생하기 때문에 예상대로 작동하지 않습니다. 누구든지 내가 실수 한 부분을 알고 있거나 다른 해결책을 찾아야합니까? 여기jena로 터틀 구문의 스트림 구문 분석

import org.apache.jena.atlas.lib.Sink; 
import org.apache.jena.graph.Triple; 
import org.apache.jena.riot.system.StreamRDF; 
import org.apache.jena.riot.system.StreamRDFLib; 
import org.apache.jena.riot.system.StreamRDFWrapper; 
import org.apache.jena.riot.system.SyntaxLabels; 
import org.apache.jena.sparql.core.Quad; 
import org.apache.jena.riot.RDFDataMgr; 
import org.apache.jena.riot.out.SinkQuadOutput; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

public class JenaStreamWrapper extends StreamRDFWrapper { 

    public static void main(String... argv) throws FileNotFoundException { 
     String filename = "file.ttl"; 
     OutputStream outputStream = new FileOutputStream(new File("file.nq")); 
     StreamRDF filtered = new JenaStreamWrapper(StreamRDFLib.writer(outputStream)); 
     RDFDataMgr.parse(filtered, filename); 
    } 

    public JenaStreamWrapper(StreamRDF other) { 
     super(other); 
    } 

    @Override 
    public void triple(Triple triple) { 
     if ((triple.getSubject().isURI() && triple.getSubject().getURI().contains(" ")) 
       || (triple.getObject().isURI() && triple.getObject().getURI().contains(" "))) 
      System.out.println(triple.getSubject().getURI()); 
     else 
      other.triple(triple); 
    } 
} 

그리고 데이터 집합에서 추출 된 몇 가지 예를 들어 문 :

Exception in thread "main" org.apache.jena.riot.RiotException: [line: 9, col: 55] Bad character in IRI (space): <http://d-nb.info/gnd/117177040670[space]...> 
    at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136) 
    at org.apache.jena.riot.lang.LangEngine.raiseException(LangEngine.java:165) 
    at org.apache.jena.riot.lang.LangEngine.nextToken(LangEngine.java:108) 
    at org.apache.jena.riot.lang.LangTurtleBase.predicateObjectItem(LangTurtleBase.java:286) 
    at org.apache.jena.riot.lang.LangTurtleBase.predicateObjectList(LangTurtleBase.java:280) 
    at org.apache.jena.riot.lang.LangTurtleBase.triples(LangTurtleBase.java:249) 
    at org.apache.jena.riot.lang.LangTurtleBase.triplesSameSubject(LangTurtleBase.java:190) 
    at org.apache.jena.riot.lang.LangTurtle.oneTopLevelElement(LangTurtle.java:46) 
    at org.apache.jena.riot.lang.LangTurtleBase.runParser(LangTurtleBase.java:89) 
    at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42) 
    at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:179) 
    at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:861) 
    at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:667) 
    at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:637) 
    at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:626) 
    at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:617) 
    at zbw.tbl.schemex.additions.JenaStreamWrapper.main(JenaStreamWrapper.java:27) 
: 나는 다음과 같은 메시지를 얻을 코드를 실행하면

@prefix gndo: <http://d-nb.info/standards/elementset/gnd#> . 
@prefix owl: <http://www.w3.org/2002/07/owl#> . 
@prefix dnbt: <http://d-nb.info/standards/elementset/dnb/> . 

<http://d-nb.info/gnd/117177040> a gndo:DifferentiatedPerson ; 
     owl:sameAs <http://viaf.org/viaf/64153583> ; 
     gndo:gndIdentifier "117177040" ; 
     gndo:oldAuthorityNumber "(DE-588a)117177040" , "(DE-588a)117177040670 BnF" ; 
     owl:sameAs <http://d-nb.info/gnd/117177040670 BnF> ; 
     dnbt:deprecatedUri "http://d-nb.info/gnd/117177040670 BnF" ; 
     gndo:oldAuthorityNumber "(DE-588)117177040670 BnF" ; 
     gndo:variantNameForThePerson "Jourdan, Camille" ; 
     gndo:variantNameEntityForThePerson _:node1aj1cbug9x62759112 . 

을 내가 사용하고 여기에 예제 코드를 참조하십시오

유용한 입력에 감사드립니다.

+0

으로 변경했습니다. IRI에 허용되지 않는 문자가 포함되어 있습니다. '는' '이어야합니다. –

+0

답장을 보내 주셔서 감사합니다. 그것을 알고있다. (내 질문의 4 번째 문장을 보라). 그러나 일반적인 유스 케이스에서는 구문 분석 전에 모든 오류를 검사 할 수 없습니다 ... – Baume

답변

0

같은 문제가 있었지만 경고 만 받았으며 치명적인 예외는 아닙니다. My Jena 버전은 3.2.0입니다. 이러한 경고를 막기 위해 나는 Jena 코드를 약간 수정해야했습니다. org.apache.jena.riot.tokens.TokenizerText 클래스를 덮어 쓰고 개인 정적 변수 AllowSpacesInIRI의 값을 에서 true

+0

코드 스타일에'private static'과 같은 키워드를 적어주십시오. https://stackoverflow.com/help/how-to-ask를 읽으면 많은 도움이되며 질문과 답변을보다 쉽게 ​​읽을 수 있습니다. – guenhter