2016-10-18 3 views
1

Europeana's Virtuoso SPARQL Endpoint을 사용하고 있습니다.dc : SPARQL의 creator string 리터럴 대 regex FILTER

저는 특정 기여자에 대한 내용을 SPARQL에서 검색하려고했습니다. 내 이해를 위해,이 방법을 수행 할 수 있습니다 :

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT ?title 
WHERE { 
    ?objectInfo dc:title ?title . 
    ?objectInfo dc:creator 'Picasso' . 

} 

그럼에도 불구하고, 나는 아무것도 얻지 못했습니다.

또는 FILTER regex을 사용하여 리터럴을 검색했습니다.

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT ?title ?creator 
WHERE { 
    ?objectInfo dc:title ?title . 
    ?objectInfo dc:creator ?creator . 
    FILTER regex(?creator, 'Picasso') 
} 

이것은 실제로 매우 잘 작동하고 결과를 올바르게 반환했습니다.

제 질문은 FILTER을 사용하지 않고 SPARQL 쿼리를 생성하여 특정 아티스트의 작품을 검색 할 수 있습니까?

감사합니다.

+0

당신이 질의하고 종점을 말씀해? 내 첫 번째 추측은 문자열 리터럴 'Picasso'에 대한 데이터 유형을 지정해야한다는 것입니다. 또한 첫 번째 쿼리에서 두 개의 트리플 패턴 사이에 관계가없는 것처럼 보입니다. –

+0

또한 첫 번째 쿼리에서 두 개의 트리플 패턴 사이에 관계 (공유 변수)가없는 것처럼 보입니다. –

+0

감사합니다. 방금 정보를 업데이트했습니다 : 유럽의 Virtuoso Endpoint를 사용하고 있습니다 : http://sparql.europeana.eu/ – Trinker

답변

1

"피카소"라는 문자가 생성자로서 문자 그대로 있다고는 생각하지 않습니다. 정규식 필터는 좋은 선택이지만 속도는 느립니다. 여기

는 정규식이 일치되는 문자열을 찾을 수있는 방법 :

당신이 볼 쉽게되었을 수 있습니다
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT ?creator, (count(?creator) as ?ccount) 
WHERE { 
    ?objectInfo dc:title ?title . 
    ?objectInfo dc:creator ?creator . 
    FILTER regex(?creator, 'Picasso') 
} 
group by ?creator 
order by ?ccount 

당신의 SELECT 문에있는 모든 변수를 표시 한 경우 :

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT * 
WHERE { 
    ?objectInfo dc:title ?title . 
    ?objectInfo dc:creator ?creator . 
    FILTER regex(?creator, 'Picasso') 
} 

정규식 필터를 사용하지 않으려는 경우, 찾고있는 모든 피카소 변형을 열거 할 수 있습니다.

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT * 
WHERE { 
     values ?creator { "Picasso, Pablo" "Pablo Picasso" } . 
     ?objectInfo dc:title ?title . 
     ?objectInfo dc:creator ?creator 
    } 
BIF

:이 엔드 포인트에 작품을 포함하고 꽤 빠른 :

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT * 
WHERE { 
    ?objectInfo dc:title ?title . 
    ?objectInfo dc:creator ?creator . 
    ?creator bif:contains 'Picasso' 
    #FILTER regex(?creator, 'Picasso') 
} 
+1

'bif : contains'가 필요하다고 생각하지 않습니다. 표준에는 [** contains **] (https://www.w3.org/TR/sparql11-query/#func-contains)가 포함됩니다. –

+0

감사합니다. 이것은 내가 찾고 있었던 바로 그 것이다. – Trinker

+0

'values'를 사용하는 것이'regex'보다 빨리 작동한다고합니까? – Trinker

0

1) 첫 번째 쿼리에는 연결되지 않은 트리플 패턴이 있습니다.

2) the vocabulary description에 따르면, dc:creator은 리소스, 즉 URI를 예상합니다. 엔터티의 URI를 사용하여 Picasso가 작동하지 않습니까?

+--------------------+------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Term Name: creator |                                    | 
| URI:    | http://purl.org/dc/elements/1.1/creator                          | 
| Label:    | Creator                                  | 
| Definition:  | An entity primarily responsible for making the resource.                      | 
| Comment:   | Examples of a Creator include a person, an organization, or a service. Typically, the name of a Creator should be used to indicate the entity. | 
+--------------------+------------------------------------------------------------------------------------------------------------------------------------------------+ 

리터럴에 FILTER가 필요한지 여부를 결정하기 위해 데이터를 확인하는 것이 좋습니다.