2016-03-24 32 views
1

Gruplama sonucu için sparql sorgusu yaptım ve sorguyu SPARQL son noktası http://glam.iptime.org/sparql aracılığıyla gerçekleştirdim.Neden sparql sorgum sonuç vermiyor?

Ancak, hiçbir sonuç ve hata iletisi almadım.

Sorgu, aşağıdakine benzer.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX cfo: <http://lod.culture.go.kr/ontology/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?age ?typeName (count(?s) as ?cnt) 
WHERE { 
{ 
select * where { 
?s rdf:type cfo:CulturalObject. 
?s rdfs:label ?label. 
?s cfo:temporal ?time. 
?time cfo:begin ?begin.  

BIND (STRDT(replace(?begin, 'BC', '-'), xsd:float) as ?year). 
BIND(IF(?year > 1897, "modern", IF(?year > 1392, "chosun", IF(?year > 918, "goryeo", IF(?year > 700, "north_south", IF(?year > -58, "three_states", "ancient"))))) as ?age). 

?s dc:type ?type. 
?type rdfs:label ?typeName. 
} 
} 
FILTER(BOUND(?age)). 
} 
GROUP BY ?age ?typeName 
LIMIT 100 

Sparql sorgumun bir sorunu var mı? Hangi sorun var?

Sparql sorgu bildirim sırası yanlış olduğunu düşünüyorum. Başka bir fikrin var mı?

+0

Kimsenin, sorgulama yaptığınız veriyi anlamadan söyleyebildiği bir yöntem yoktur. SPARQL'in mükemmel bir şekilde geçerli olması olabilir, ancak verilerinizde bir eşleşme yoktur. Birkaç ipucu: çoklu IF yerine COALESCE'e bakın ve alt-seçim, toplamları bir araya getirmek için kullanılmadıkça hemen hemen her zaman bir hatadır. – scotthenninger

+2

Ayrıca, "sorgu bildirme sırası yanlış" ile ne ifade edildiğini net değil. SPARQL bir bildirim dilidir ve bu nedenle sorgu cümlelerinin sırasının sonuç üzerinde hiçbir etkisi olmaz. Sipariş sorgu etkinliğini etkileyebilir, ancak bu farklı bir konu. – scotthenninger

cevap

6

Sizin için çalışmayı yapmak ve sorgunuzla son noktayı vurmak yerine, size sorunu nasıl çözeceğinizi bildirmek isterim. Temel olarak sorguyu pedagojik olarak oluşturun. Tek bir üçlü desenle başlayın. Sorguyu yürütün - LIMIT arkadaşın burada. Sonra bir sonraki üçlü modeli ekleyin. Gittiğiniz sonuçlarla denemeler yapın.

Yani ilk sorgu basitçe şöyle olacaktır:

SELECT * 
WHERE { 
    ?s a cfo:CulturalObject. 
} LIMIT 100 

, o Yürütme o sonuçlar getirdiğini kontrol edin. Bir sonraki sorgu şudur:

SELECT * 
WHERE { 
    ?s a cfo:CulturalObject. 
    ?s rdfs:label ?label. 
} LIMIT 100 

Bunun başarısız olduğunu varsayalım - sonuç almazsınız. Yani belki de skos:prefLabel kullanıyorlardı.

SELECT * 
WHERE { 
    ?s a cfo:CulturalObject. 
    ?s ?p ?o 
} LIMIT 100 

Kontrol ?p ve ?o değerleri veri gerçekte nasıl yapılandırıldığını görmek için: Aşağıdaki deneyebilirsiniz böylece SPARQL, çok keşif dildir. Biraz daha görmek için LIMIT'u artırın. Bir sonraki üçlü modeli oluşturmak için sonuçları kullanın.

Sonuçta, her şey veriyi araştırmakla ilgilidir ve OWL ya da benzer sorgu dillerinden farklı olarak, başarılı bir sorguyu yürütmek için neredeyse hiçbir bilgiye ihtiyaç duymazsınız. veri deposu boş değilse Aslında, şunu bil ki, aşağıdaki sorgu HER ZAMAN, sonuçlar verecektir: alt select olmadıkça açıklamada belirtildiği gibi

SELECT ?s ?p ?o 
WHERE { 
    ?s ?p ?o . 
} LIMIT 1000 

, alt seçme bir hata hemen hemen her zaman olduğu bilgi işlem kümeleri. Çok fazla gördüğüm bir SPARQL anti-pattern ve sadece alt seçimleri yanlış kullanan bazı örnekler olduğunu varsayabilirim. Dikkat etmemiz gereken birşey.

2

Verilerdeki bazı yıllar, bazı şeyleri parçalayan bazı karakterler içeriyor. FILTER(REGEX(?begin, "^(BC)?[0-9]+$"))

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX cfo: <http://lod.culture.go.kr/ontology/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?age ?typeName (count(?s) as ?cnt) WHERE { 
    ?s rdf:type cfo:CulturalObject. 
    ?s rdfs:label ?label. 
    ?s cfo:temporal ?time. 
    ?time cfo:begin ?begin. 
    # Filter the dates 
    FILTER(REGEX(?begin, "^(BC)?[0-9]+$")) 
    ?s dc:type ?type. 
    ?type rdfs:label ?typeName. 
    BIND (STRDT(replace(?begin, 'BC ', '-'), xsd:integer) as ?year). 
    BIND(IF(?year > 1897,"modern", 
      IF(?year > 1392, "chosun", 
       IF(?year > 918, "goryeo", 
       IF(?year > 700, "north_south", 
        IF(?year > -58, "three_states", 
         "ancient"))))) as ?age) 
} 
GROUP BY ?age ?typeName 
LIMIT 100 

Sen alt sorgu gerekmez: Boş bir ?age olan satırları dışında tutmak istiyorsanız Bunun bir çözümü, yani gibi bir regex ile böyle karakter içeren değerleri filtrelemek için Sorgunuzda var.

Aşağıdaki sorgu, sözcük olmayan karakterler içeren (sorunlu karakterler dahil) tüm cfo:begin değerlerini alır. Zaten onunla aşina değilseniz arada

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX cfo: <http://lod.culture.go.kr/ontology/> 

SELECT ?begin (count(?s) as ?cnt) WHERE 
{ 
    ?s cfo:temporal ?time. 
    ?time cfo:begin ?begin. 
    FILTER(REGEX(?begin, "\\W")) 
} 
GROUP BY ?begin 
LIMIT 100 

, ben sorguları denemek için YASGUI önerilir.