- From: Mikael Pesonen <mikael.pesonen@lingsoft.fi>
- Date: Thu, 22 Mar 2018 17:59:59 +0200
- To: semantic-web@w3.org
Thank you! This works great, just needed to filter out resources that
don't have label at all:
SELECT ?s ?s_label ?s_type
WHERE {
?s a ?s_type .
OPTIONAL { ?s <http://schema.org/name> ?s_label
FILTER(LANGMATCHES(LANG(?s_label), "en")) }
OPTIONAL { ?s <http://schema.org/name> ?s_label
FILTER(LANG(?s_label) = "") }
OPTIONAL { ?s <http://schema.org/name> ?s_label
FILTER(LANGMATCHES(LANG(?s_label), "fi")) }
OPTIONAL { ?s <http://schema.org/name> ?s_label }
FILTER ( EXISTS { ?s <http://schema.org/name> ?s_label } )
}
On 22.3.2018 16:12, Gregory Williams wrote:
>
>> On Mar 22, 2018, at 8:45 AM, Mikael Pesonen <mikael.pesonen@lingsoft.fi> wrote:
>>
>>
>> Hi,
>>
>> I'm having trouble contructing a basic query which selects a string so that it prefers one language, over others but always tries to return something.
>>
>> So I have names
>>
>> :item schema:name "name"@en
>> :item schema:name "nimi"@fi
>> :item schema:name "namn"
>>
>> I need query that returns the English name ("name"@en) , but if not found the name without language ("namn"), and as last resort name in Finnish ("nimi"@fi)
>>
>> This query returns one random name:
>>
>> SELECT
>> ?s
>> (SAMPLE(?s_label_g) as ?s_label)
>> ?s_type
>> FROM <http://some_graph/>
>> WHERE
>> {
>> ?s a ?s_type .
>> ?s <http://schema.org/name> ?s_label_g
>> }
>> GROUP BY ?s ?s_type
>>
>>
>> Anyone can help?
>
> Mikael,
>
> You can use OPTIONAL to do this by ordering the optional blocks by the preferred language tags:
>
> SELECT ?s ?s_label ?s_type
> WHERE {
> ?s a ?s_type .
> OPTIONAL { ?s <http://schema.org/name> ?s_label . FILTER(LANGMATCHES(LANG(?s_label), "en")) }
> OPTIONAL { ?s <http://schema.org/name> ?s_label . FILTER(LANG(?s_label) = "") }
> OPTIONAL { ?s <http://schema.org/name> ?s_label . FILTER(LANGMATCHES(LANG(?s_label), "fi")) }
> }
>
> If you want to fall back on *any* language for cases where there is no English, Finnish, or un-tagged literal, you can also add a fourth optional block to the end:
>
> SELECT ?s ?s_label ?s_type
> WHERE {
> ?s a ?s_type .
> OPTIONAL { ?s <http://schema.org/name> ?s_label . FILTER(LANGMATCHES(LANG(?s_label), "en")) }
> OPTIONAL { ?s <http://schema.org/name> ?s_label . FILTER(LANG(?s_label) = "") }
> OPTIONAL { ?s <http://schema.org/name> ?s_label . FILTER(LANGMATCHES(LANG(?s_label), "fi")) }
> OPTIONAL { ?s <http://schema.org/name> ?s_label . }
> }
>
> Hope that helps.
>
> .greg
>
--
Lingsoft - 30 years of Leading Language Management
www.lingsoft.fi
Speech Applications - Language Management - Translation - Reader's and Writer's Tools - Text Tools - E-books and M-books
Mikael Pesonen
System Engineer
e-mail: mikael.pesonen@lingsoft.fi
Tel. +358 2 279 3300
Time zone: GMT+2
Helsinki Office
Eteläranta 10
FI-00130 Helsinki
FINLAND
Turku Office
Kauppiaskatu 5 A
FI-20100 Turku
FINLAND
Received on Thursday, 22 March 2018 16:00:35 UTC