2011-02-11 7 views
7

비교적 기본적인 작업을 위해 SPARQL을 사용하려고합니다. FOAF 그래프를 보면, 거기에서 발견 한 요소를 파서 드하고 싶습니다. 존재하는 경우), 그런 사람들에 대한 정보를 찾을 수있는 새로운 그래프로 사용하십시오.SPARQL의 'GRAPH'키워드를 사용하여 원격 그래프 가져 오기

예를 들어, 내가 좋아하는 음식 (FOAF 파일 당)과 내 친구들 모두가 좋아하는 음식을 나열하는 SPARQL 쿼리를 실행하려는 간단한 사용 사례를 상상해보십시오.

다음은 현재이 모양입니다. 테스트를 위해, 아래 쿼리로 수행하려고하는 순간에? name3 변수를 통해 친구의 이름을 가져옵니다. 이 쿼리를 실행해도? graph 및? name3에 대한 결과는 반환되지 않습니다. 비록 적어도 두 개에 이름 속성이 있어야하는 유효한 RDF 파일에 rdfs : seeAlso 링크가 있음을 알고 있습니다. 가지고 계신 모든 의견을 보내 주셔서 감사합니다!

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?name1 ?name2 ?graph ?name3 
FROM <my-rdf-file> 
WHERE { 
    ?person1 foaf:knows ?person2 . 
    ?person1 foaf:name ?name1 . 
    ?person2 foaf:name ?name2 . 
    OPTIONAL { 
     ?person2 rdfs:seeAlso ?graph . 
     GRAPH ?graph { 
      ?person3 foaf:name ?name3 .   
     } 
    }  
} 

답변

4

GRAPH는 원격 데이터를 암시 적으로 저장소로 가져 오지 않습니다. 보안 위험이 너무 큽니다. 이 기능을 사용할 수있는 시스템이있을 수 있지만 비표준입니다.

그러나, SPARQL 1.1 업데이트에서,하지만이 작업을 수행 키워드 LOAD가있다, 당신은 쓸 수 있습니다 : 당신이 쓸 수 있도록 저장소로 그래프를 가져옵니다

LOAD <uri> 

:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT DISTINCT ?graph 
FROM <my-rdf-file> 
WHERE { 
    ?person1 foaf:knows ?person2 . 
    ?person1 foaf:name ?name1 . 
    ?person2 foaf:name ?name2 . 
    OPTIONAL { 
     ?person2 rdfs:seeAlso ?graph . 
    }  
} 

? graph에 대한 바인딩을 LOAD 문 집합에 넣은 다음 원래 쿼리를 실행합니다.

N.B. 일부 시스템에서, 예를 들어. LOAD를 활성화해야하는 4store, 기본적으로 허용되지 않으므로 사용중인 상점의 문서를 확인하십시오.

+0

스티브에게 감사드립니다! RDF 그래프의 "자동 발견"이 문제가 될 수 있다고 생각합니다. 특히 그래프 크기가 ​​폭발적으로 증가하는 경우 특히 그렇습니다. 여전히 SPARQL 질의에서 매우 강력한 기술이 될 것 같습니다. 어쨌든, 나는 상대적으로 간단한 문제에 대한 트릭을 수행하는 대안을 찾았습니다. – Geoffroy

5

LOAD를 사용하는 대신 위에 포함 된 Steve의 예제에 포함시켜야하는 그래프를 찾았 으면 FROM NAMED를 사용하여 결과 쿼리의 모든 관련 그래프 즉

을 표시하는 것이 합리적이지 않습니까?
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?name1 ?name2 ?name3 
FROM <my-rdf-file> 
FROM NAMED <discovered-graph-URI-1> 
FROM NAMED <discovered-graph-URI-n> 
WHERE { 
GRAPH <my-rdf-file> { 
    ?person1 foaf:knows ?person2 . 
    ?person1 foaf:name ?name1 . 
    ?person2 foaf:name ?name2 . 
} 
    OPTIONAL { 
     ?person2 rdfs:seeAlso <discovered-graph-URI-1> . 
     GRAPH <discovered-graph-URI-1> { 
      ?person3 foaf:name ?name3 .   
     } 
     ?person2 rdfs:seeAlso <discovered-graph-URI-n> . 
     GRAPH <discovered-graph-URI-n> { 
      ?person3 foaf:name ?name3 .   
     } 
    }  
} 

그런 식으로 보안 문제를 해결할 수 있으며 자신의 triplestore에서 데이터를 유지 관리 할 필요가 없습니다.

+0

그것은 현명한 해결책처럼 들립니다. 너 해봤 어? 다음 번엔 JENA를 열어 볼게. 감사합니다 윌리엄. – Geoffroy

+0

Geoffroy - 괜찮 았지만 실제 그래프로 시도하지 않았습니다. –