2013-01-24 5 views
8

파이썬에서 Fyzz처럼 java 용 변수에서 sparql 쿼리를 구문 분석하는 쉬운 방법이 있습니까? Jena 또는 참깨 API는 어떻게 사용 되었습니까?Java 코드 SPARQL 파서

답변

8

Apache Jena의 ARQ을 구문 또는 대수 수준에서 사용하여 java에서 SPARQL을 구문 분석하고 조작 할 수 있습니다. QueryFactory.create(queryString)은 쿼리의 자바 표현을 제공합니다. 그리고 주위 찌를 :

Query query = QueryFactory.create(queryString); 
query.isSelectType() && query.isQueryResultStar(); // of the form SELECT *? 
query.getDatasetDescription(); // FROM/FROM NAMED bits 
query.getQueryPattern(); // The meat of the query, the WHERE bit 
...etc etc.. 
Op op = Algebra.compile(query); // Get the algebra for the query 

튜토리얼 'Manipulating SPARQL using ARQ'로 시작하십시오 (the Query java documentation 참조). 그러면 쿼리가 어떻게 표시되는지, 그리고 쿼리를 표시하는 방법을 느낄 수 있습니다 (visitors이 특히 유용합니다). 처음에는 구문 수준이 가장 익숙하지만 많은 작업에서 algebra은 쿼리가 실제로 수행하는 작업에 해당하므로 더 잘 작동합니다.

구문 분석하려면 :

ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, queryString); 

이의 출력은 ParsedQuery이며, 쿼리의 대수 객체 표현이다 여기

+0

내가 문자열 SPARQL 내 주를 시작 = "SELECT A B C 어디에서? ? b? a ? c.} "; 쿼리 쿼리 = QueryFactory.create (sparql); 하지만 스레드 "main"java.lang.NoClassDefFoundError : com/hp/hpl/jena/shared/PrefixMapping $ IllegalPrefixException 메시지에서 Exception이라는 메시지가 나타납니다. \t com.hp.hpl.jena.query.QueryFactory.create (QueryFactory.java:68) com.hp.hpl.jena.query.QueryFactory.create에서 \t (QueryFactory.java:40) com.hp.hpl.jena.query.QueryFactory.create에서 \t (QueryFactory.java:28) \t at testsparql.main (testsparql.java:13) –

+0

classpath에 jena-arq 및 jena-core libs가 필요합니다. 나는 당신이 후자를 잃어버린 것 같아요. – user205512

+0

아, 그리고 예나 - 아이리. (가능한 경우 종속성 관리자를 사용하십시오.) – user205512

4

는 분석하고 참깨를 사용하여 SPARQL 쿼리를 조작 할 수있는 방법입니다. 당신이 특히 파스 트리 자체를 취득하고자하는 경우, 해당도 가능합니다 : 그래서 당신은 단지 메소드를 오버라이드 (override) 할 필요가 ASTVisitorBase을 확장 :

ASTQueryContainer parseTree = SyntaxTreeBuilder.parseQuery(queryString); 

당신은 다음 직접 사용자 정의 SyntaxTreeBuilderVisitor (팁을 구현하여이 추상 구문 트리를 조작 할 수 있습니다 어디에서 실제로 무엇인가하고 싶어한다). 우리가 대수 모델로 돌아갈 경우

, 당신은 참깨 항해 저장소에 ParsedQuery을 실행할 수 있습니다

if (pq instanceof ParsedTupleQuery) { 
     SailTupleQuery query = new SailTupleQuery(pq, repositoryConnection); 
     TupleQueryResult result = query.evaluate(); 
} else if (pq instanceof ParsedGraphQuery) { 
     // etc for other query types 
} 

그것을 실행하기 전에 ParsedQuery를 조작하려면 QueryModelVisitor 구현을 사용, 예를 들어, 사용자 정의 쿼리 조작 : 같은 사용자 정의 쿼리 모델 방문자와

QueryModelVisitor myVisitor = new MyCustomQueryModelVisitor(); 
pq.getTupleExpr().visit(myVisitor); 

당신은 그것을 최적화하거나 실제로 다른 구문으로 다시 작성하는 쿼리를 완벽하게 제어 할 수 있습니다.

추상 구문 트리 (AST) 수준에서 또는 쿼리 모델 수준에서이 조작을 수행할지 여부는 중요합니다. 쿼리 모델을 사용하면 쿼리 계획/최적화 및 부분 (예 : 참깨 저장소에서 나중에 실행하기 위해) 재 작성하고 다른 목적 (예 : 참깨가 아닌 저장소에서 실행)으로 쿼리를 완전히 다시 작성하는 것이 목표 인 경우 구문 트리를 직접 조작하는 것이 더 쉽습니다.

위와 같이 쿼리를 구문 분석하고 실행하는 위의 방법은 일을 처리하는 원형적인 방법입니다. 당신이 그것을 실행하기 전에 구문 분석 쿼리를 조작 할 필요가없는 경우, 당신은 단순히 준비하고과 같이 저장소에 쿼리를 실행할 수 있습니다 :???

String queryString = "SELECT ..."; 
RepositoryConnection conn = repo.getConnection(); 
try { 
    TupleQuery tq = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString); 
    TupleQueryResult result = tq.evaluate(); 
} 
finally { 
    conn.close(); 
}