2011-08-08 8 views
4

몇백 만 개의 SPARQL 쿼리의 특정 구조적 속성을 테스트해야하며이 경우 WHERE 문 구조가 필요합니다. 나는 현재 fyzz를 사용하여이 작업을 시도하고 있지만 불행히도 그 문서는별로 유용하지 않습니다. 구문 분석은 쉽습니다. 문제는 구문의 구조를 복구 할 수 없었기 때문입니다. 예를 들어 :SPARQL 쿼리 구문 분석

>>> from fyzz import parse 
>>> a=parse("SELECT * WHERE {?x a ?y . {?x a ?z}}") 
>>> b=parse("SELECT * WHERE {?x a ?y OPTIONAL {?x a ?z}}") 
>>> a.where==b.where 
True 
>>> a.where 
[(SparqlVar('x'), ('', 'a'), SparqlVar('y')), (SparqlVar('x'), ('', 'a'), SparqlVar('y'))] 

는 대신 트리플의 fyzz의 실제 파스 트리, 또는 나에게이 작업을 수행 할 것 몇 가지 다른 도구를 복구 할 수있는 방법이 있나요? RDFLib는 과거에는 들소 SPARQL 파서를 가지고있는 것으로 보이지만, rdflib 또는 rdfextras.sparql 패키지에서는 찾을 수 없습니다.

답변

5

roqet 다른 도구는 rasqal 내에 패키지화 된 도구입니다. 구문 분석 된 트리를 반환하는 명령 줄 도구입니다. 예를 들어 :

roqet -i laqrs -d structure -n -e "SELECT * WHERE {?x a ?y OPTIONAL {?x a ?z}}"

것 출력 ..

Query: 
query verb: SELECT 
query bound variables (3): x, y, z 
query Group graph pattern[0] { 
    sub-graph patterns (2) { 
    Basic graph pattern[1] #0 { 
     triples { 
     triple #0 { triple(variable(x), uri<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>, variable(y)) } 
     } 
    } 
    Optional graph pattern[2] #1 { 
     sub-graph patterns (1) { 
     Basic graph pattern[3] #0 { 
      triples { 
      triple #0 { triple(variable(x), uri<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>, variable(z)) } 
      } 
     } 
     } 
    } 
    } 
} 

내가이 생각하지 않는 다른 대답에 댓글을 보면 무엇을 요 필요하다. 그리고 SPARQL 파서를 살펴볼 때 대답을 찾지 못할 것이라고 생각합니다. 쿼리에서 개체 (또는 트리플 패턴) 평가는 Query Engines에서 발생하며 잘 설계된 시스템에서는 쿼리 구문 분석과 분리되어 있습니다. 당신은 당신이 각 트리플 패턴 평가를 위해 수행 된 방법 쿼리가 실행 된 방법과 대체의 출력을 볼 것이다 옵션 -vvv (매우 상세)로 4s-query 명령을 볼 수 있었다 4store에서 예를 들어

.

+0

내가 알고있는 것은 내가 필요한 것은 쿼리 엔진에 전달되는 개체 트리입니다. 기본적으로 내가 할 필요가있는 것은 폼의 모든 하위 패턴 P '(P1 OPTIONAL P2)를 검사하는 것입니다. P1에서 P2와 P'외부에서 발생하는 모든 변수도 발생한다는 것입니다. 주어진 점을 감안할 때, 나는 원래의 패턴에 특정 다시 쓰기 규칙을 적용해야하고, 객체 트리를 갖는 것은 매우 유용 할 것이다. – ailnlv

3

ANTLR

덕분에 여기 SPARQL 문법이 있습니다 http://www.antlr.org/grammar/1200929755392/index.html

ANTLR 파이썬 실행하기위한 코드를 파싱 생성 할 수 있습니다.

+0

감사하지만, 필요한 것은 그보다 조금 더 복잡합니다. 쿼리 엔진에 의해 데이터베이스상에서 평가 될 객체를 얻고 싶습니다.';'와 같이 생략하지 않아도됩니다. 이것은 이미 어딘가에서 이루어져야합니다, 나는 파스 트리를 전처리하는 작업을 피하고 싶습니다. – ailnlv