2013-04-15 12 views
10

bubirden rdf belirtin: türlerini bir SPARQL sorguda

PREFIX prefix: <http://example.org/ns#> 
SELECT * 
WHERE 
{ 
    ?x rdf:type ?type . 
} 

gibi SPARQL sorgu ben prefix:type1 veya prefix:type2 ya varlık olarak ?type türünü belirtmek istiyorum şimdi varsayalım var; Bu nasıl yapılmalı?

cevap

10

UNION kullanabilirsiniz.

PREFIX prefix: <http://example.org/ns#> 
SELECT * 
WHERE { 
    { ?x a prefix:type1 } UNION { ?x a prefix:type2 } 
} 

Not

FILTER maddeleri ile kullanmak bu gibi yapmak için başka yolları da vardır URI http://www.w3.org/1999/02/22-rdf-syntax-ns#type yüklem konumda kullanılabilir ve RDF tipine karşılık gelen edilebilen bir SPARQL anahtar kelime a kullanımı çeşitli ifadeler: ?type = prefix:type1 ait

  • Serisi koşullu veya operatörü ile kombine ||
  • ?type IN (prefix:type1, prefix:type2)

Yoksa ?type

sorgu daha karmaşık olduğunu ve her iki tarafın üzerine sorgunun çok çoğaltmak istemiyorsanız Bunlar daha iyi olabilir seçeneklerini belirtmek için bir VALUES maddesini kullanabilir UNION ya da düşünmek için daha fazla iki olasılık var.

+0

"? Yazın" ilginç görünüyor, ancak çalışmıyor, kesinlikle sözdizimi üzerinde bir hata yapıyorum, doğru mu? SELECT * WHERE { ? X rdf: tür? ? Türünde (wo: Kingdom, wo: Phylum) } – Noor

+2

Bunlar bir FİLTRE deyiminde kullanılabilecek ifadelerdir. IN yazın (wo: Kingdon, wo: Phylum)) – RobV

9

FILTER IN işlevinden çok daha hızlı BINDINGS kullanımıdır. FILTER(?type IN (wo:Kingdon, wo:Phylum) yerine aşağıdaki sorgunun satırları boyunca bir şey kullanmanızı öneririm. BINDINGS kullanma

SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)} 

bunları filtreleme önce tüm sonuçları ziyade işlendiği için, SPARQL motoru sonuçlarını sınırlamak için izin verir. Bu sonuçların daha hızlı geri dönmesini sağlar.

+4

Artık BINDINGS değil; VALUES. Bu yaklaşım, UNION kullananlardan daha güzel ve FILTER (? IN IN) 'den daha güzel. –

2

Bunu, FİLTRE sözdizimi kullanarak bunu yapabilirsiniz:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX prefix: <http://example.org/ns#> 

SELECT ?s ?p ?o ?type 
WHERE { 
    ?s a ?type . 
    ?s ?p ?o . 
    FILTER(?type IN (prefix:Type1, prefix:Type2)) 
} 

tüm sonuçlar iade edilecektir sonra filtreleme uygulanacaktır eğer bilmiyorum ben, verimliliği garanti edemez unutmayınız veya değil.

İlgili konular