2017-02-06 8 views
1

여러 개의 명명 된 그래프/모델이 저장되어있는 RDF4J 기본 triplestore를 사용하고 있습니다. 내 Java 프로그램에서 SPARQL CONSTRUCT 쿼리 양식을 사용하여 명명 된 그래프에서 부분 그래프를 검색하려고합니다. 부분 그래프는 특정 정수 값으로 식별되어야합니다. 내 저장된 이름이 그래프의SPARQL 구조체를 사용하여 부분 RDF 그래프를 쿼리하십시오.

하나는 예를 들어, 다음과 같습니다

@prefix nif: <http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 
@prefix app: <http://example.org/> . 
@prefix onto: <http://example.org/ontology/> . 

app:context#char=0,54 a nif:Context , nif:RFC5147String , nif:String ; 
    nif:beginIndex "0"^^xsd:int ; 
    nif:endIndex "54"^^xsd:int ; 
    nif:isString "Barack Obama lives in Washington. He studied at Harvard" . 

app:sentence#char=0,31 a nif:RFC5147String , nif:String , nif:Sentence ; 
    onto:index "0"^^xsd:int ; 
    nif:beginIndex "0"^^xsd:int ; 
    nif:endIndex "31"^^xsd:int ; 
    onto:entity app:entity#char=0,12 , app:entity#char=22,30 ; 
    nif:referenceContext app:context#char=0,54 ; 
    nif:nextSentence app:sentence#char=32,54 ; 
    nif:anchorOf "Barack Obama lives in Washington." . 

app:sentence#char=32,54 a nif:RFC5147String , nif:String , nif:Sentence ; 
    onto:index "1"^^xsd:int ; 
    nif:beginIndex "32"^^xsd:int ; 
    nif:endIndex "54"^^xsd:int ; 
    onto:entity app:entity#char=46,53 ; 
    nif:referenceContext app:context#char=0,54 ; 
    nif:previousSentence app:sentence#char=0,31 ; 
    nif:anchorOf "He studied at Harvard." . 

app:entity#char=0,12 a nif:RFC5147String , nif:String , nif:Phrase ; 
    nif:beginIndex "0"^^xsd:int ; 
    nif:endIndex "12"^^xsd:int ; 
    onto:type "PERSON" ; 
    nif:referenceContext app:context#char=0,54 ; 
    nif:sentence app:sentence#char=0,31 ; 
    nif:anchorOf "Barack Obama" .  

app:entity#char=22,30 a nif:RFC5147String , nif:String , nif:Phrase ; 
    nif:beginIndex "22"^^xsd:int ; 
    nif:endIndex "30"^^xsd:int ; 
    onto:type "LOCATION" ; 
    nif:referenceContext app:context#char=0,54 ; 
    nif:sentence app:sentence#char=0,31 ; 
    nif:anchorOf "Washington" . 

app:entity#char=46,53 a nif:RFC5147String , nif:String , nif:Phrase ; 
    nif:beginIndex "46"^^xsd:int ; 
    nif:endIndex "53"^^xsd:int ; 
    onto:type "ORGANIZATION" ; 
    nif:referenceContext app:context#char=0,54 ; 
    nif:sentence app:sentence#char=32,54 ; 
    nif:anchorOf "Harvard" . 

위의 그래프는 NLP 도구로 주석 한 두 문장을 설명합니다. 문맥, 문장 자체 및 해당 문장의 모든 엔티티를 포함하여 이러한 문장 중 하나를 나타내는 하위 그래프를 쿼리하려고합니다.

모든 문장에는 특정 문장을 식별하기 위해 사용하려는 술어 onto:index의 색인이 있습니다. 문장에 속한 엔티티는 onto:entity으로 식별됩니다.

그래서, 원하는 서브 그래프는 과목 모두 각각의 술어와 객체와 app:context#char=0,54, app:sentence#char=0,31, app:entity#char=0,12app:entity#char=22,30로 구성되어야합니다. 따라서 이 아닌에는 app:sentence#char=32,54app:entity#char=46,53이라는 주제가 포함되어야합니다.

내 SPARQL 쿼리는 지금까지 다음과 같습니다

PREFIX nif: <http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX app: <http://example.org/location#> 
PREFIX onto: <http://example.org/ontology/> 

CONSTRUCT { 
    ?s ?p ?o . 
} 

WHERE { 
    GRAPH app:12345 { 
     ?s onto:index sentenceIndex . 
    } 
} 

자바에서는 다음과 같습니다

String nif: "http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#"; 
String xsd: "http://www.w3.org/2001/XMLSchema#"; 
String app = "http://example.org/location#" + modelID; 
String onto = "http://example.org/ontology/"; 

    String sparqlQuery = "PREFIX nif: <" + nif + "> \n"; 
    sparqlQuery += "PREFIX xsd: <" + xsd + "> \n"; 
    sparqlQuery += "PREFIX onto: <" + onto + "> \n"; 
    sparqlQuery += "CONSTRUCT { \n"; 
    sparqlQuery += " ?s ?p ?o . \n"; 
    sparqlQuery += "} \n"; 
    sparqlQuery += "WHERE { \n"; 
    sparqlQuery += " GRAPH <" + app + "> { \n"; 
    sparqlQuery += "  ?s onto:index " + sentenceIndex + " . \n"; 
    sparqlQuery += " } \n"; 
    sparqlQuery += "}"; 

sentenceIndex 표현은 실제 onto:index 값을 제공하는 자바 INT 변수입니다. app:location#12345은 우수한 명명 된 그래프입니다.

테스트 목적으로 위의 쿼리는 처음에는 문맥이나 엔터티가없는 지정된 인덱스로 전체 문장 제목을 반환해야합니다. 그러나이 쉬운 작업조차도 실패합니다. 그냥 빈 RDF4J 모델을 반환합니다.

이제 onto:index 술어로 식별되는 원하는 하위 그래프를 얻으려면 올바른 SPARQL 쿼리는 무엇입니까?

SPARQL에 익숙하지 않으므로 도움을 주시면 대단히 감사하겠습니다. 미리 감사드립니다!

+0

이 쿼리는 문법적으로 올바르지 않으며 빈 모델을 반환하지 않습니다. 대신 접두사 선언 뒤의 전체 중단으로 인해 구문 오류가 발생하여 쿼리가 실패합니다. 아마도 복사 - 붙여 넣기 오류 일 뿐이며 쉽게 수정할 수 있습니다. 나중에 참조 할 수 있도록 게시중인 정확한 코드를 테스트 해보십시오. –

+0

죄송합니다. 이것은 실제로 복사 및 붙여 넣기 오류입니다. 내 게시물을 편집하고 실제 Java 코드를 추가했습니다. 이 코드에는 컴파일 오류가 없지만 빈 모델이 반환됩니다. – phly

답변

3
  1. 접두사는 는 RDF4J

  2. 가 왜 꺾쇠 괄호로 앞에 둔 그래프 URI를 배치해야합니까 쿼리에서 컴파일하지 말아야 즉, SPARQL의 점으로 구분하지입니까?어느 쪽이든 당신은 사용

    1. 전체 당신은 쉽게 작업을 만들기 위해 접두어 URI app:12345
PREFIX app: <http://example.org/location#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX nif: <http://persistence.unileipzig.org/nlp2rdf/ontologies/nif-core#> 
PREFIX onto: <http://example.org/ontology/> 

CONSTRUCT 
    { 
    ?s ?p ?o . 
    } 
WHERE 
    { GRAPH app:12345 
     { ?s onto:index sentenceIndex } 
    } 
+0

죄송합니다. 이것은 실제 Java 코드와 거북 데이터가 혼합되어 발생하는 복사 및 붙여 넣기 오류입니다. 원래 게시물을 편집했습니다. 그러나 여전히 작동하지 않고 그냥 빈 모델을 반환합니다. – phly

+0

그래프 URI의 사용법도 변경 했습니까? 귀하의 Java 코드는'GRAPH '를 생성하고 그래프는'app : location # 12345'라고 말합니다. – AKSW

+0

예, 저의 예에서 변경했습니다. 그러나 의미 론적으로 차이를 만들어서는 안됩니다. 그렇죠? – phly

1

app의 네임 스페이스 선언을 변경하고 사용

  • URI <http://example.org/location#12345> 또는
  • I 현재는 접두사를 사용하지 말 것을 권장합니다. 다음과 같은 구조의 쿼리가 작동하는지 확인하는 첫 번째 시도 :

    CONSTRUCT { 
        ?s ?p ?o . 
    } 
    
    WHERE { 
        GRAPH <http://example.org/location#12345> { 
         ?s <http://example.org/ontology/index> 0 . 
        } 
    } 
    

    를 문제가 해결되지 않으면, 검사 데이터가 정말, 정말, 100 % 다음 쿼리를 사용하여 "http://example.org/location#12345"그래프에있는 경우 :

    SELECT * 
    WHERE { 
        ?s ?p ?o 
    
        optional{ 
        GRAPH ?g { 
        ?s ?p ?o 
        } 
    } 
    } 
    

    이 쿼리는 모든 데이터와 데이터가있는 그래프를 보여줍니다. 이 조회를 사용하여 조회하려는 술어 (색인)가 올 Y 른지 여부를 점검 할 수도 있습니다.

    희망 사항은 문제를 찾는 데 도움이되며 행복한 SPARQLing입니다!