2012-01-20 11 views
8

Temelde verimli çalışan bir sorgum var (aşağıda gösterilmiştir). Ancak, aramamın, etiketin "yago" dizgisini içermekten ziyade gerçek dizgi "yago" olduğu durumlarda daha hassas olmasını istiyorum. Mümkünse FILTER kullanmanın DBpedia'nın daha uzun sürmesini gerektirdiğini düşündüğümden filtreler olmadan yapmaya çalışıyorum.DBpedia SPARQL Belli bir rdfs için sorgulama: etiket

SELECT ?uri ?label 
WHERE { 
?uri rdfs:label ?label. 
?label bif:contains "'yago'" . 
} 

cevap

13

sen filtresiz yapmak istiyorsanız aşağıdaki işlemleri deneyebilirsiniz:

SELECT ?uri ?label 
WHERE { 
?uri rdfs:label ?label . 
filter(?label="Yago"@en) 
} 
: Bu filtreleri ile karşılık gelen sorguya çok daha hızlıdır o eğer olsa

SELECT ?uri ?label 
WHERE { 
?uri rdfs:label "Yago"@en . 
?uri rdfs:label ?label 
} 

Emin değilim

+2

İlk sorguda üçlü modelin çoğaltıldığını düşünüyorum. –

+1

teşekkürler ikinci sorgu daha verimli çoğaltma yok – Sam

3

Orijinal yanıtın anahtar düzeltmesi. Eğer tam bir eşleşme varsa, dil etiketine sahip ardından şu çalışacaktır:

SELECT ?uit ?label 
WHERE { 
    ?uri rdfs:label ?label . 
    FILTER regex(str(?label), "yago", "i") 
} 
:

SELECT ?uit ?label 
WHERE { 
    ?uri rdfs:label "Yago"@en . 
} 

Ancak, tam eşleşen istediğini kullanmıyor olabilir, SPARQL standart düzenli ifade destekler

... karakter dizisinden bağımsız olarak dizeyle eşleşecek ve gerekli dize eşleşmesini almak için olağan normal ifade oyunlarını oynayabilirsiniz. (Tabii ki, STRSTARTS ve STRENDS gibi diğer dize işlevleri, istenen eşleme ölçütlerini karşılayanlarsa daha verimli olacaktır.)