2013-02-26 16 views
6

Sonuçları döndürmek için bir Sparql sorgusu kullanarak bir Mulgara RDF deposundan bir RDF grafiği oluşturmaya çalışıyorum. Basit sorgularla rahatça başlamaya başladım, etkili bir şekilde soruyorum, "hangi nesneler belirli bir koleksiyonun üyeleridir?"Koleksiyonların koleksiyonlarına göz atmak için SPARQL içindeki yinelemeli sorgular

Sorum şu: ve bu basit sorgudan sonuçları alıp sorgu nesnesine yeniden yönlendirip yeniden yorumlayamayacağımı her türlü tavsiyeye önem veriyorum. Bu sonuçlarla

SELECT ?x WHERE {?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>} 

:

"x" 
info:fedora/ramsey:ThelifeandadventuresofRobinsonCrusoe 
info:fedora/ramsey:Jackanapes 
info:fedora/ramsey:SundayJournalvol01no0219951126 
info:fedora/ramsey:Ideologyandchange 
info:fedora/ramsey:theshepherdofthepyrenees 
info:fedora/ramsey:ScenesinAmerica 
... 

Benim gol, gelen, ardından nesneyi, <info:fedora/collection:ramsey> bu benzersiz tanımlayıcıları alıp değiştirmektir

Örneğin, ben bu sparql sorgu var Özgün sorgu ve sorguyu yeniden çalıştırın.

Ben ilk sorguda bir kök elemanı tespit edecek bir senaryo sonuçları tüm üye nesneleri döndüren var hayal ediyorum, o zaman tüm bu nesnelerin üye nesneleri döndürmek sonsuza ...

Bu, Sparql sorguları ile mümkün mü? Özellikle, bir Mulgara RDF veritabanını sorguladığımı düşünüyorum. Herhangi bir düşünce, 'yapılabilir değil' olsa bile, büyük takdir.

+0

@ghkill Bunun hakkında daha iyi bir özet vermek için başlığı düzenledim. –

cevap

8

SPARQL 1.0'a bağlı kalmanız gerektiğini varsayalım. Eğer mulgara'nın eğer varsa SPARQL 1.1 için sınırlı desteği olduğuna inanıyorum. SPARQL 1.0 ile

muhtemelen sen gibi şeyler yapabilirsiniz sorgulamak istiyorum kaç seviye biliyorsanız:

İşte ?y
SELECT ?y WHERE { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?y <fedora-rels-ext:isMemberOfCollection> ?x 
} 

sizin kökünden 2. düzey elemanları ile bağlanacaktır. UNIONS ile bir sorgu ile birden çok düzey sorgulayabilirsiniz. Bir sorguda kökünden bir ve iki düzeyleri için bir örnek:

SELECT ?x WHERE { 
    { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> . 
    } UNION { 
     ?zz <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?x <fedora-rels-ext:isMemberOfCollection> ?zz . 
    } 
} 

bu sorun gerçekten bağlı olduğu hangi seviyede ?x de bilmiyorum olmasıdır. Bu nedenle bu tür sorgularla bir ağaç çizemezsiniz. SPARQL 1.1 bu bağlıdır hangi seviyede ?x döneceksin BIND AS

SELECT ?x ?level WHERE { 
    { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> . 
     BIND (1 AS ?level) 
    } UNION { 
     ?zz <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?x <fedora-rels-ext:isMemberOfCollection> ?zz . 
     BIND (2 AS ?level) 
    } 
} 

Bu ikinci sorgu ile çözülmüş olur. Ağacın maksimum derinliğine ulaşmaya çalışan çok sayıda sendika ile programlı olarak oluşturulan bazı sorguları hayal edebilirsiniz. Eğer Jena/ARQ kullanmayı deneyebilirsiniz, SPARQL 1.1 için tam destek istiyorsanız.

SELECT ?x WHERE { 
    ?x <fedora-rels-ext:isMemberOfCollection>+ <info:fedora/collection:ramsey> . 
} 

Sen yüklemi <fedora-rels-ext:isMemberOfCollection> aracılığıyla <info:fedora/collection:ramsey> erişilebilir ?x tüm düğümler de bağlamak istiyorum: Jena aylarında da aşağıdaki gibi Property paths ve bir şey kullanabilirsiniz.

+1

Siz efendim, bir bilgin ve beyefendisiniz, çok teşekkür ederim. Bu benim öğrenmeyi umduğum şey ve bana ileriye doğru çok fazla yem getiriyor. – ghukill