1

What is the easiest way to select one language tag from each language.

For example I have triples that looks like this:

102777157-n, wordnet-ontology:translation : "sac"@fra
102777157-n, wordnet-ontology:translation : "bossa"@cat
102777157-n, wordnet-ontology:translation : "taske"@dan
102777157-n, wordnet-ontology:translation : "käsilaukku"@fin
102777157-n, wordnet-ontology:translation : "kukkaro"@fin
102777157-n, wordnet-ontology:translation : "laukku"@fin
102777157-n, wordnet-ontology:translation : "lompakko"@fin
102777157-n, wordnet-ontology:translation : "porte-monnaie"@fra
102777157-n, wordnet-ontology:translation : "sac à main"@fra
102777157-n, wordnet-ontology:translation : "beg tangan"@ind
102777157-n, wordnet-ontology:translation : "dompet"@ind
102777157-n, wordnet-ontology:translation : "kantung"@ind
102777157-n, wordnet-ontology:translation : "karung"@ind
102777157-n, wordnet-ontology:translation : "tas tangan"@ind
102777157-n, wordnet-ontology:translation : "borsa"@ita
102777157-n, wordnet-ontology:translation : "borsetta"@ita
102777157-n, wordnet-ontology:translation : "borsetto"@ita
102777157-n, wordnet-ontology:translation : "ハンドバック"@jpn
102777157-n, wordnet-ontology:translation : "ハンドバッグ"@jpn
102777157-n, wordnet-ontology:translation : "bolsa"@por
102777157-n, wordnet-ontology:translation : "carteira"@por
102777157-n, wordnet-ontology:translation : "bolso"@spa
102777157-n, wordnet-ontology:translation : "กระเป๋า"@tha
102777157-n, wordnet-ontology:translation : "กระเป๋าถือ"@tha
102777157-n, wordnet-ontology:translation : "กระเป๋าถือสตรี"@tha
102777157-n, wordnet-ontology:translation : "dompet"@zsm
102777157-n, wordnet-ontology:translation : "kantung"@zsm

In my result set I want one language tag from each language.

Stanislav Kralin
  • 11,070
  • 4
  • 35
  • 58
Jay
  • 127
  • 9
  • 1
    Possible duplicate of [SPARQL select optional with language](http://stackoverflow.com/questions/7937302/sparql-select-optional-with-language) – Jeen Broekstra Nov 30 '15 at 22:43
  • I had that: optional { ?wnid31 rdf:label ?zhlabel . filter( langMatches(lang(?zhlabel),"zho") ) } optional { ?wnid31 rdf:label ?frlabel . filter( langMatches(lang(?frlabel),"fra") ) } optional { ?wnid31 rdf:label ?jpnlabel . filter( langMatches(lang(?jpnlabel),"jpn") ) } optional { ?wnid31 rdf:label ?hilabel . filter( langMatches(lang(?indlabel),"hin") ) } But I am looking for something shorter since the number of possibilities are large – Jay Nov 30 '15 at 23:19
  • can you edit your question to make it more clear exactly what you're after? Show what you've tried sofar, and why it doesn't do what you expect. As currently formulated, your question is too vague and broad to answer. – Jeen Broekstra Dec 01 '15 at 00:48

1 Answers1

3

If I understand the question you want something like:

102777157-n, wordnet-ontology:translation : "sac"@fra
# or "porte-monnaie"@fra, "sac à main"@fra

102777157-n, wordnet-ontology:translation : "bossa"@cat

102777157-n, wordnet-ontology:translation : "taske"@dan

102777157-n, wordnet-ontology:translation : "käsilaukku"@fin
# or "kukkaro"@fin, "laukku"@fin", lompakko"@fin

...

Start with the basics:

prefix wordnet-ontology: <...>

select ?word ?translation
{
    ?word wordnet-ontology:translation ?translation
}

We want one row per word, language pair, i.e.

prefix wordnet-ontology: <...>

select ?word ?translation
{
    ?word wordnet-ontology:translation ?translation
}
group by ?word ?language

But that won't work because:

  1. We don't have the language
  2. We're selecting a variable ?translation which isn't grouped.

To solve 1 we use the lang() function: BIND(lang(?translation) as ?language).

As for 2, since we don't care which translation we get, we can just pick any of them using sample: (SAMPLE(?translation) as ?onetranslation).

prefix wordnet-ontology: <...>

select ?word (SAMPLE(?translation) as ?onetranslation)
{
    ?word wordnet-ontology:translation ?translation
    BIND(lang(?translation) as ?language)
}
group by ?word ?language

Since we don't even want the language, we can simplify this further:

prefix wordnet-ontology: <...>

select ?word (SAMPLE(?translation) as ?onetranslation)
{
    ?word wordnet-ontology:translation ?translation
}
group by ?word lang(?translation)
user205512
  • 8,798
  • 29
  • 28