This just happened to catch my eye, and while I don't have a solution, it does look like there could be something going on with datatypes. If nothing else, here's some short code that might help in testing. Using just ?locale:
prefix xsd: <http://www.w3.org/2001/XMLSchema#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select * where { values ?x { "color"@en-us "colour"@en-gb } values ?locale { "gb"^^xsd:string "gb"^^rdf:plainLiteral } filter langMatches(lang(?x), concat("en","-", ?locale)) } ------------------------------------- | x | locale | ===================================== | "colour"@en-gb | "gb"^^xsd:string | ------------------------------------- And now, using str(?locale) prefix xsd: <http://www.w3.org/2001/XMLSchema#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select * where { values ?x { "color"@en-us "colour"@en-gb } values ?locale { "gb"^^xsd:string "gb"^^rdf:plainLiteral } filter langMatches(lang(?x), concat("en","-", str(?locale))) } ------------------------------------------- | x | locale | =========================================== | "colour"@en-gb | "gb"^^xsd:string | | "colour"@en-gb | "gb"^^rdf:plainLiteral | ------------------------------------------- This is in Jena 2.12, though: $ sparql --version Jena: VERSION: 2.12.1 Jena: BUILD_DATE: 2014-10-02T16:36:17+0100 ARQ: VERSION: 2.12.1 ARQ: BUILD_DATE: 2014-10-02T16:36:17+0100 RIOT: VERSION: 2.12.1 RIOT: BUILD_DATE: 2014-10-02T16:36:17+0100 On Thu, Jan 28, 2016 at 9:29 AM, Bardo Nelgen <mailing.list.in...@bnnperformances.de> wrote: > > Hi Rob, > > thanks for the hint – seems you hit something here: > > The binding you described works properly as > > BIND(concat(str(?lang),"-",str(?locale)) AS ?langMatch) . > > indeed returns "de-de" for the ?langMatch variable. > > However simple string-making via > > langMatches( (lang(?mailHeaderSubject)) , > (str(concat(str(?lang),"-",str(?locale))) ) ) > > still won't match. > > Also tried to get around possibly implied datatypes in SPARQL by explicitly > making the values for ?lang and ?locale to be of xsd:string in the RDF > datamodel already. > > But unfortunately with no changes in the (not) matches. > > Any ideas ? > > As Andy already suggested, I'll try to compile a minimum working model > (which may take some time, as the original is rather complex…) or set up a > trial account on the test machine. > > Best, > > Bardo > > > On 28.01.16 12.48 Uhr, Rob Vesse wrote: >> >> I wonder if the problem is to do with the datatype of the string resulting >> from concat()? >> >> Can you try doing a BIND(concat(str(?lang),"-",str(?locale)) AS >> ?langMatch) in your query and selecting that variable out to see what >> value you get, in particular I'm wondering if you are getting a typed >> literal? >> >> langMatches() wants a simple literal as the second argument and it is >> possible that concat() is produced a typed literal >> >> One possibility is simply to put str() around the concat() call and see if >> that resolves things >> >> There may also be some RDF 1.1 interaction going on here (if this is Jena >> 3.x) since literals without a type have an implicit type in RDF 1.1 that >> may be causing the function evaluation to do the wrong thing which would >> be a bug >> >> Rob >> >> On 28/01/2016 10:32, "Bardo Nelgen" >> <mailing.list.in...@bnnperformances.de> wrote: >> >>> Hi Andy, >>> >>> thanks for the immediate reply. >>> >>> We actually use "en-gb" for UK English in our model – but anyway… >>> >>> My test-Scenario looks like >>> >>> ?lang = "de" >>> ?locale = "de" >>> >>> which in >>> >>> langMatches(lang("wort"@de-de),(concat(str(?lang),"-",str(?locale))) ) >>> >>> unfortunately does not evaluate as true, althoughthe "hard-coded" variant >>> >>> langMatches(lang("wort"@de-de),"de-de") >>> >>> indeed does… >>> >>> Since we *always* deploy language-locale *combinations* throughout the >>> data model – for fine grained targeting – using an adaption of your >>> other example >>> >>> langMatches(lang("wort"@de-de),(concat("de","-","de")) ) >>> >>> evaluates to "true" as well – outputting "wort"@de-de >>> >>> So the problem seems do lie in the string-making via str(?lang) and >>> str(?locale). >>> >>> I also output both variables separately with the same query (for further >>> processing) which tells me they are filled correctly; also being quoted >>> in the result to demonstrate the string-property on both. >>> >>> What else could possibly go wrong with a simple to-string conversion ? >>> >>> Slightly confused greets, >>> >>> Bardo >>> >>> On 28.01.16 10.25 Uhr, Andy Seaborne wrote: >>>> >>>> On 27/01/16 20:35, Bardo Nelgen wrote: >>>>> >>>>> Hi all, >>>>> >>>>> most likely I am missing something here, but maybe I am simply doing it >>>>> the wrong way: >>>>> >>>>> I need to match a language-locale value where both language and locale >>>>> come from different branches in the data model. >>>>> >>>>> So what I came up with in my FILTER clause is >>>>> >>>>> langMatches(lang(?Headline),(concat(str(?lang),"-",str(?locale))) ) >>>>> >>>>> Is it meant to work this way or is the approach doomed by itself ? >>>>> >>>>> Any suggestions very welcome. :-) >>>>> >>>>> Regards, >>>>> >>>>> Bardo >>>>> >>>> If ?Headline, ?lang and ?locale are right it will work but did you >>>> mean the arguments the other way round? >>>> >>>> langMatches(lang("word"@EN-uk),(concat("en","-","uk")) ) ==> true >>>> >>>> But >>>> langMatches(lang("word"@EN),(concat("en","-","uk")) ) ==> false >>>> >>>> The second argument is the language range, >>>> >>>> langMatches("en-UK","EN") => true >>>> >>>> Andy >>>> >> >> >> >> > -- Joshua Taylor, http://www.cs.rpi.edu/~tayloj/