mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
Optimize SPARQL query for single entity metadata using wikibase:label service
- Use SERVICE wikibase:label for efficient retrieval of labels and descriptions in preferred language - Remove redundant label/description fetching logic - Prevent Cartesian product and improve query performance for
This commit is contained in:
parent
7500b6d374
commit
7aeb757fca
2 changed files with 22 additions and 46 deletions
|
|
@ -7,6 +7,7 @@ class NearbyResultItem(
|
|||
private val wikipediaArticle: ResultTuple?,
|
||||
private val commonsArticle: ResultTuple?,
|
||||
private val location: ResultTuple?,
|
||||
@field:SerializedName("itemLabel")
|
||||
private val label: ResultTuple?,
|
||||
@field:SerializedName("streetAddress") private val address: ResultTuple?,
|
||||
private val icon: ResultTuple?,
|
||||
|
|
@ -15,7 +16,7 @@ class NearbyResultItem(
|
|||
@field:SerializedName("commonsCategory") private val commonsCategory: ResultTuple?,
|
||||
@field:SerializedName("pic") private val pic: ResultTuple?,
|
||||
@field:SerializedName("destroyed") private val destroyed: ResultTuple?,
|
||||
@field:SerializedName("description") private val description: ResultTuple?,
|
||||
@field:SerializedName("itemDescription") private val description: ResultTuple?,
|
||||
@field:SerializedName("endTime") private val endTime: ResultTuple?,
|
||||
@field:SerializedName("monument") private val monument: ResultTuple?,
|
||||
@field:SerializedName("dateOfOfficialClosure") private val dateOfOfficialClosure: ResultTuple?,
|
||||
|
|
|
|||
|
|
@ -1,45 +1,26 @@
|
|||
SELECT
|
||||
?item
|
||||
(SAMPLE(?label) AS ?label)
|
||||
(SAMPLE(?class) AS ?class)
|
||||
(SAMPLE(?description) AS ?description)
|
||||
(SAMPLE(?classLabel) AS ?classLabel)
|
||||
(SAMPLE(?pic) AS ?pic)
|
||||
(SAMPLE(?destroyed) AS ?destroyed)
|
||||
(SAMPLE(?endTime) AS ?endTime)
|
||||
(SAMPLE(?wikipediaArticle) AS ?wikipediaArticle)
|
||||
(SAMPLE(?commonsArticle) AS ?commonsArticle)
|
||||
(SAMPLE(?commonsCategory) AS ?commonsCategory)
|
||||
(SAMPLE(?dateOfOfficialClosure) AS ?dateOfOfficialClosure)
|
||||
(SAMPLE(?pointInTime) AS ?pointInTime)
|
||||
?itemLabel
|
||||
?itemDescription
|
||||
?class
|
||||
?classLabel
|
||||
?pic
|
||||
?destroyed
|
||||
?endTime
|
||||
?wikipediaArticle
|
||||
?commonsArticle
|
||||
?commonsCategory
|
||||
?dateOfOfficialClosure
|
||||
?pointInTime
|
||||
WHERE {
|
||||
SERVICE <https://query.wikidata.org/sparql> {
|
||||
values ?item {
|
||||
${ENTITY}
|
||||
}
|
||||
VALUES ?item { ${ENTITY} }
|
||||
}
|
||||
|
||||
# Get the label in the preferred language of the user, or any other language if no label is available in that language.
|
||||
OPTIONAL {?item rdfs:label ?itemLabelPreferredLanguage. FILTER (lang(?itemLabelPreferredLanguage) = "${LANG}")}
|
||||
OPTIONAL {?item rdfs:label ?itemLabelAnyLanguage}
|
||||
BIND(COALESCE(?itemLabelPreferredLanguage, ?itemLabelAnyLanguage, "?") as ?label)
|
||||
# Get item label/class label/description in the preferred language of the user
|
||||
SERVICE wikibase:label { bd:serviceParam wikibase:language "${LANG},en". }
|
||||
|
||||
# Get the description in the preferred language of the user, or any other language if no description is available in that language.
|
||||
OPTIONAL {?item schema:description ?itemDescriptionPreferredLanguage. FILTER (lang(?itemDescriptionPreferredLanguage) = "${LANG}")}
|
||||
OPTIONAL {?item schema:description ?itemDescriptionAnyLanguage}
|
||||
BIND(COALESCE(?itemDescriptionPreferredLanguage, ?itemDescriptionAnyLanguage, "?") as ?description)
|
||||
|
||||
# Get the class label in the preferred language of the user, or any other language if no label is available in that language.
|
||||
OPTIONAL {
|
||||
?item p:P31/ps:P31 ?class.
|
||||
OPTIONAL {?class rdfs:label ?classLabelPreferredLanguage. FILTER (lang(?classLabelPreferredLanguage) = "${LANG}")}
|
||||
OPTIONAL {?class rdfs:label ?classLabelAnyLanguage}
|
||||
BIND(COALESCE(?classLabelPreferredLanguage, ?classLabelAnyLanguage, "?") as ?classLabel)
|
||||
}
|
||||
|
||||
OPTIONAL {
|
||||
?item p:P31/ps:P31 ?class.
|
||||
}
|
||||
OPTIONAL { ?item p:P31/ps:P31 ?class. }
|
||||
|
||||
# Get picture
|
||||
OPTIONAL {?item wdt:P18 ?pic}
|
||||
|
|
@ -54,15 +35,9 @@ WHERE {
|
|||
OPTIONAL {?item wdt:P373 ?commonsCategory}
|
||||
|
||||
# Get Wikipedia article
|
||||
OPTIONAL {
|
||||
?wikipediaArticle schema:about ?item.
|
||||
?wikipediaArticle schema:isPartOf <https://en.wikipedia.org/>. # TODO internationalization
|
||||
}
|
||||
OPTIONAL { ?wikipediaArticle schema:about ?item;schema:isPartOf <https://en.wikipedia.org/>. }
|
||||
|
||||
# Get Commons article
|
||||
OPTIONAL {
|
||||
?commonsArticle schema:about ?item.
|
||||
?commonsArticle schema:isPartOf <https://commons.wikimedia.org/>.
|
||||
}
|
||||
}
|
||||
GROUP BY ?item
|
||||
OPTIONAL { ?commonsArticle schema:about ?item; schema:isPartOf <https://commons.wikimedia.org/>. }
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue