2011-12-07 4 views
3

안녕하세요! 파이썬에 rdflib을 적용합니다. 나는 질문이있다. 변수를 SPARQL의 쿼리에 어떻게 넣을 수 있습니까? 과정에서 'OSPF'대신 : OSPF!SPARQL 매개 변수화 된 쿼리

qres = g.query(
    """SELECT ?x ?z ?y 
     WHERE { 
      course:OSPF course:termName ?x. 
      course:OSPF ?s ?t. 
      ?s ?d ?z. 
      ?t course:termName ?y. 
      FILTER (regex(?z,"[^a-z]","i") && isLiteral(?z)) 
     }""" 
     ,initNs=dict(course=Namespace..... 

내가 콘솔에서 내 변수를 입력 할 msalvadores @. ---> python parse.py OSPF 변수의 값 (OSPF)은 다른 변수 일 수 있습니다. 어떻게 그것을 질의로 초기화 할 수 있습니까 (WHERE)? 나는 며칠 전에 변수를 보간하여 내 질문을 해결했다. 좋아요 :

qtest = "OSPF","OSPF" 
    q =("""SELECT ?x ?z ?y\ 
      WHERE {\ 
       course:%s course:termName ?x.\ 
       course:%s ?s ?t.\ 
       ?s ?d ?z.\ 
       ?t course:termName ?y.\ 
       FILTER (regex(?z,'[^a-z0-9]','i') && isLiteral(?z))\ 
      }ORDER BY ASC(?s)\ 
      """)% qtest 
    qres = g.query(q, initNs=dict(course=Namespace 

하지만 다른 방법으로 수행 할 수 있습니다. 제 의견으로는 솔루션이 제게 맞지 않습니다.

답변

2

쿼리에 파이썬 변수를 의미하는 경우에 당신은 ... 그냥 할 수

qres = g.query(
    """SELECT ?x ?z ?y 
     WHERE { 
      """+some_uri+""" course:termName ?x. 
      """+some_uri+""" ?s ?t. 
      ?s ?d ?z. 
      ?t course:termName ?y. 
      FILTER (regex(?z,"[^a-z]","i") && isLiteral(?z)) 
     }""" 
     ,initNs=dict(course=Namespace..... 

은 물론 변환하려면

: 다음 SPARQL의 변수로 OSPF를 ...

qres = g.query(
    """SELECT ?newVar ?x ?z ?y 
     WHERE { 
      ?newVar course:termName ?x. 
      ?newVar ?s ?t. 
      ?s ?d ?z. 
      ?t course:termName ?y. 
      FILTER (regex(?z,"[^a-z]","i") && isLiteral(?z)) 
     }""" 
     ,initNs=dict(course=Namespace..... 

쿼리가 수행하는 작업과 데이터가 어떻게 보이는지에 대해 조금 더 설명하면 우리는 더 효과적으로 도움을 줄 수 있습니다.

편집

만 요 수행 할 수 있음을 변경하는 등, 뭔가를 변수를 반복하지 않고 SPARQL 쿼리를 공식화하는 것입니다 ...

q = """SELECT ?x ?z ?y 
     WHERE { 
      course:%s course:termName ?x; 
        ?s ?t. 
      ?s ?d ?z. 
      ?t course:termName ?y. 
      FILTER (regex(?z,'[^a-z0-9]','i') && isLiteral(?z)) 
     }ORDER BY ASC(?s) 
     """%var_value 

공지 사항의 끝에서 ; 첫 번째 트리플 패턴. 나는 실제로 ?s ?d ?z 패턴을 이해하지 못한다. 나는 샘플 데이터를 볼 필요가있다. 나는 당신이이 쿼리로 너무 많은 것을 얻으 려한다고 생각합니다. 데이터 집합이 크다면이 쿼리는 매우 느릴 것입니다. 나는 데이터를 보지 않고 이것보다 더 말할 수 없다.

+0

답변 해 주셔서 감사합니다. – zhalnin

+0

이것이 올바른 대답이라고 생각되면 동의를 선택하십시오. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work을 참조하십시오. –

+0

내 질문을 편집하고 그에 대한 해결책을 추가했습니다. – zhalnin