파이썬에서 Fyzz처럼 java 용 변수에서 sparql 쿼리를 구문 분석하는 쉬운 방법이 있습니까? Jena 또는 참깨 API는 어떻게 사용 되었습니까?Java 코드 SPARQL 파서
답변
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
이며, 쿼리의 대수 객체 표현이다 여기
는 분석하고 참깨를 사용하여 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();
}
- 1. Java 소스 코드 파서
- 2. Ruby의 Java 소스 코드 파서
- 3. INSERT 및 DELETE 쿼리 용 SPARQL 파서
- 4. 유니 코드 인식 CSV 파서 (Java)
- 5. C 소스 코드 AST 파서 (Java)
- 6. Java 클래스/코드 용 PHP 파서?
- 7. PL/SQL 소스 코드 파서 (Java)
- 8. Ruby 파서 (Java)
- 9. Java 파서 테스트
- 10. OCaml의 파서 코드
- 11. Eclipse : 코드 파서 편집
- 12. C# 코드 파서 찾기
- 13. 파서 코드 Octave?
- 14. robots.txt 파서 java
- 15. Java : XML 파서
- 16. Java 우편 주소 파서
- 17. 쿠키가있는 Java 웹 파서?
- 18. Java RTF 파서
- 19. Java Wikitext 파서
- 20. RTF Java 파서
- 21. Java 스키마 파서?
- 22. Java 파서 및 정규식
- 23. Java EDI X12 파서
- 24. Netbeans 용 Java 파서?
- 25. Java 용 C++ 파서/모델
- 26. SPARQL
- 27. SPARQL
- 28. C++ 코드 파서/프로세서 라이브러리
- 29. 사용자 정의 단축 코드 파서
- 30. AngelScript 코드 파서 - 어떤 방법으로해야합니까?
내가 문자열 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) –
classpath에 jena-arq 및 jena-core libs가 필요합니다. 나는 당신이 후자를 잃어버린 것 같아요. – user205512
아, 그리고 예나 - 아이리. (가능한 경우 종속성 관리자를 사용하십시오.) – user205512