Ciao! Data la query per Listeria che mi sono copincollato per prova da it:Progetto:Wiki Loves Monuments 2018/Monumenti/Toscana/Provincia di Pistoia nella mia sandbox it:Utente:Epìdosis/Sandbox, volevo chiederti se secondo te sarebbe possibile applicare la seguente modifica (credo piuttosto complessa se non impossibile): mostrare la P131 come "Comune" soltanto quando il suo valore X ha instance of (P31) comune of Italy (Q747074); quando il valore X non abbia questa dichiarazione, mostrare al posto del valore X il valore Y della located in the administrative territorial entity (P131) contenuta in X. Banalmente, se K ha located in the administrative territorial entity (P131) Serravalle Pistoiese (Q102780) si mostra Serravalle Pistoiese (Q102780), se invece ha located in the administrative territorial entity (P131) Casalguidi (Q18490705) si mostra non Casalguidi (Q18490705), ma il valore della sua located in the administrative territorial entity (P131), cioè sempre Serravalle Pistoiese (Q102780). Questo per evitare che delle frazioni vengano mostrate come comuni. Perché altrimenti l'alternativa è usare la located in the administrative territorial entity (P131) solo per i comuni ... ma allora con che proprietà indico le frazioni?
Topic on User talk:ValterVB
Non so se ho capito bene tu vuoi che sia indicato il comune se P131 è un comune se invece non è un comune vuoi che mostri il P131 del P131. Questa query controlla se l'item è in un comune, se non è un comune mostra il P131 di quel P131. Forse è più facile a vedere che a spiegare.
- ?unitaAmmLabel è l'etichetta del P131 dell'item
- ?istanzaLabel è l'etichetta del P31 di ?unitaAmmLabel
- ?result ?resultLabel è l'item+etichetta del comune da utilizzare:
SELECT ?item ?itemLabel ?end ?unitaAmmLabel ?istanza ?istanzaLabel ?result ?resultLabel WHERE {
?item wdt:P131* wd:Q16245 .
?item wdt:P2186 ?wlmid .
MINUS { ?item p:P2186 [ pq:P582 ?end ] .
FILTER ( ?end <= "2018-09-01T00:00:00+00:00"^^xsd:dateTime ) }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?item wdt:P131 ?unitaAmm .
?unitaAmm wdt:P31 ?istanza .
?unitaAmm wdt:P131 ?secUnitaAmm .
BIND( IF(?istanza = wd:Q747074,?unitaAmm,?secUnitaAmm) AS ?result )
}
Tieni conto che però in quel elenco gestito da listeria viene utilizzato un template che sarebbe da modificare pesantemente
Sì, è chiaro che se si modificano tutte le query anche i template vanno modificati. Forse per quest'anno è un po' tardi, ma di certo una soluzione del genere è necessaria per gestire in modo chiaro le frazioni. Grazie mille!
Altra controindicazione: se un item ha più di un valore per P131 Listeria ne mostra solo uno credo il primo dei 2
Vero: mi insegneresti come trovare tutti gli elementi che hanno 2 o più valori di una qualunque proprietà, visto che non sono mai riuscito a capire come si fa?
Esempio: a partire da questa banalissima query, come faccio a prendere solo gli elementi che hanno multiple P131?
SELECT ?item
WHERE {
?item wdt:P131* wd:Q16245
}
Grazie!
Ecco qua:
SELECT ?item (count(?item) as ?num)
WHERE {
?item wdt:P131* wd:Q16245.
} GROUP BY ?item
ORDER BY DESC(?num)
Questa sopra li riporta comunque tutte, se invece vuoi solo quelle con più di un valore usa questa:
SELECT ?item (count(?item) as ?num)
WHERE {
?item wdt:P131* wd:Q16245.
}
GROUP BY ?item
HAVING(count(?item) > 1)
ORDER BY DESC(?num)
Ottimo, me le sono segnate entrambe. Comunque al momento non ci sono casi di valori multipli: basta tener "puliti" gli elementi e questo secondo problema non si dovrebbe porre. Il problema maggiore appunto è il primo, cioè modificare tutti i template e le pagine contenenti Listeria: per quello ne discuteremo con Nemo su Wikipedia. Grazie ancora!