2016-04-01 19 views
2

Belirli bir öznitelik için belirli bir sayı değerine sahip tüm varlıkları döndüren bir SPARQL sorgusu formüle etmem gerekiyor. Mesela, tam olarak iki başka ülkeyle sınırda olan tüm ülkelere sahip olmak istiyorum.Belirli bir özniteliği olmayan tüm varlıklar nasıl alınır?

Ayrıca, başka bir ülkeyle sınırlama yapmayan tüm ülkeleri bulmak isteyebilirim (böylece, "hasBorderWith" özniteliğinin değerlerinin sayısı sıfıra eşittir. Bu bağlamda, eğer bu bana açık değildir. ..

  1. bir işletme verilen varlık yoktur, belirtilen özelliklere sıfır değerlerini
  2. bir işletme sahip Örneğin

, bunu tahmin edebilirsiniz: aşağıdaki iki durum arasında bir fark olduğunu Diğer sayımlarla sınırları olmayan bir ülke ry "hasBorderWith" özelliğine sahip değil. Bir sorun çıkarır mı?

cevap

3

Burada gömülü birkaç soru var. Tam olarak iki ülke tarafından sınırlanmış ülkeleri bulmak için ülke maçına göre gruplandırmanız ve sayımı almanız gerekir. Sonra sayım kriterlerine göre filtrelemek için agrega hesaplanmıştır sonra çalıştırılan HAVING kullanın: İkinci soru için

SELECT ?country (count(?bordered) AS ?borderCount) 
WHERE { 
    ?country a :Country . 
    ?country :hasBorderWith ?bordered 
} GROUP BY ?country 
    HAVING (?borderCount = 2) 

, ben 0 ve hiçbir özelliği arasında bir fark görmüyorum ve bu hesaplanabilir

SELECT ?country 
WHERE { 
    ?country a :Country . 
    FILTER NOT EXISTS { 
     ?country :hasBorderWith ?x 
    } 
} 

DÜZENLEME: bir olumsuzluk sorgusu ile sorular Başına ve ASKW önerisi @ 0

bir sayısını bulmak için, hiçbirvarsa 0 sayımını alacağı aşağıdakiözellikleri: OPTIONAL fıkra maç oluşmaya ancak ?bordered 0.

sayımını alacak bir :hasBorderWith özelliği olmadan :Country dolayısıyla üyelerini bağlı değilse count(?bordered) agrega katkıda bulunmamaktadırlar verir

SELECT ?country (count(?bordered) AS ?borderCount) 
WHERE { 
    ?country a :Country . 
    OPTIONAL { 
     ?country :hasBorderWith ?bordered 
    } 
} GROUP BY ?country 
    HAVING (?borderCount = 0) 

+0

0 değeri ile özellik arasında fark yoksa, ilk örnekte 2'ye 0 yerine geçmek ve ikinci örneğinizle aynı sonucu almak mümkün olabilir mi? – Roman

+0

"GROUP BY", "hasBorderWith" deyimi "OPTIONAL" işlevini kullanıyor olsa bile yalnızca eşleşmelerde çalışır; dolayısıyla, ilk sorguyla 0 sonuç elde etmek mümkün değildir. – scotthenninger

+1

@scotthenninger Emin misin? Lütfen DBpedia'da bir örnek deneyin: http://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&qtxt=SELECT+%3Fcountry+%28count%28%3Fo%29+AS+%3FoCount%29 % 0D% 0AWHERE +% 7B% 0D% 0A +++% 3Fcountry + a + dbo% 3ACountry +.% 0D% 0A +++ isteğe% 7B% 3Fcountry + dbo% 3AbirthPlace +% 3Fo% 7D% 0D% 0A% 7D ++ GRUP + İLE + % 3Fcountry% 0D% 0Aorder + by + DESC% 28% 3FoCount% 29% 0D% 0A – AKSW