Open sszscm opened 6 years ago
Werde mir das anschauen, war mir noch nicht bekannt. Danke @sszscm
Dieser Fehler hat mit der Kombination von Umlauten und Regex zu tun.
Wenn ich im Eingabetext statt 'ö' den entsprechenden Unicode \u00F6
eingebe, dann matched er richtig: bev\u00F6lkerung
@ktk Ich hab bis jetzt nur herausgefunden, dass ich den Text im SPARQL mit replace()
aufbereiten könnte (eg. replace("^bevö", "ö", "\u00F6")
für alle Umlaute machen). Gibt es hier einen sinnvolleren Weg?
@mchlrch kannst Du mal schauen ob das mit Fuseki nachvollziehen kannst? Könnte auch ein Bug in der Implementation sein.
Bei Fuseki scheint das kein Problem zu sein.
$ tdbquery --mem=data.ttl --query=query.rq
-------------------------------
| p | name | regex |
===============================
| ex:p1 | "Löwenbräu" | "^Lö" |
-------------------------------
$ cat data.ttl
BASE <http://example.org/>
PREFIX schema: <http://schema.org/>
PREFIX ex: <http://example.org/>
ex:p1
a schema:Person;
schema:familyName "Löwenbräu".
$ cat query.rq
PREFIX schema: <http://schema.org/>
PREFIX ex: <http://example.org/>
SELECT *
WHERE {
?p a schema:Person;
schema:familyName ?name.
FILTER regex(?name, ?regex)
BIND("^Lö" AS ?regex)
}
LIMIT 10
Sieht für mich so aus, als ob irgendwo unterwegs das Encoding schief ist und nicht die Ausführung der Regex mit Umlauten prinzipiell ein Problem darstellt. Siehe folgendes SPARQL
Habs jetzt auch mit Stardog bei mir lokal ausprobiert. Auch hier funktioniert es.
$ stardog-admin db create -n umlaut_test1 data.ttl
Bulk loading data to new database umlaut_test1.
Loaded 2 triples to umlaut_test1 from 1 file(s) in 00:00:00.431 @ 0.0K triples/sec.
Successfully created database 'umlaut_test1'.
$ stardog query umlaut_test1 "SELECT * WHERE { ?s ?p ?o } LIMIT 10"
+-------+-------------------+---------------+
| s | p | o |
+-------+-------------------+---------------+
| ex:p1 | rdf:type | schema:Person |
| ex:p1 | schema:familyName | "Löwenbräu" |
+-------+-------------------+---------------+
Query returned 2 results in 00:00:00.064
$ stardog query umlaut_test1 query.rq
+-------+-------------+-------+
| p | name | regex |
+-------+-------------+-------+
| ex:p1 | "Löwenbräu" | "^Lö" |
+-------+-------------+-------+
Query returned 1 results in 00:00:00.120
$ cat data.ttl
BASE <http://example.org/>
PREFIX schema: <http://schema.org/>
PREFIX ex: <http://example.org/>
ex:p1
a schema:Person;
schema:familyName "Löwenbräu".
$ cat query.rq
PREFIX schema: <http://schema.org/>
PREFIX ex: <http://example.org/>
SELECT *
WHERE {
?p a schema:Person;
schema:familyName ?name.
FILTER regex(?name, ?regex)
BIND("^Lö" AS ?regex)
}
LIMIT 10
Der Vollständigkeit halber hab ich es auch noch über den SPARQL Endpoint vom lokalen Stardog ausprobiert. Auch hier funktioniert es.
$ curl -i -H "Accept: text/csv" --data-urlencode query@query.rq http://admin:admin@localhost:5820/umlaut_test1/query
HTTP/1.1 200 OK
Connection: keep-alive
SD-Query-Id: 15
Transfer-Encoding: chunked
Content-Type: text/csv
Date: Thu, 03 May 2018 14:55:10 GMT
p,name,regex
http://example.org/p1,Löwenbräu,^Lö
Wenn ich das Query dirkt auf dem SPARQL Endpoint von Stardog http://data.zazuko.com:5820/ssz/query
absetze, dann sieht es gut aus. Was sitzt alles vorne dran? varnish und trifid?
$ curl -i -H "Accept: text/csv" --data-urlencode query@query3.rq http://ssz-read:coo2aiw6itiT@data.zazuko.com:5820/ssz/query
HTTP/1.1 200 OK
Connection: keep-alive
SD-Query-Id: 14310
Transfer-Encoding: chunked
Content-Type: text/csv
Date: Thu, 03 May 2018 15:05:52 GMT
dataSet,label
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-HEL-SEX,"Bevölkerung nach Heimatland, Geschlecht"
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-HEL,Bevölkerung nach Heimatland
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-ALT,Bevölkerung nach Alter
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-AUA-HEL,"Bevölkerung nach Aufenthaltsart, Heimatland"
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-AUA-HEL-SEX,"Bevölkerung nach Aufenthaltsart, Heimatland, Geschlecht"
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-HEL-HEO-SEX,"Bevölkerung nach Heimatland, Heimatort, Geschlecht"
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-HEL-HEO,"Bevölkerung nach Heimatland, Heimatort"
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-ALT-HEL,"Bevölkerung nach Alter, Heimatland"
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-ALT-HEL-SEX,"Bevölkerung nach Alter, Heimatland, Geschlecht"
http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-ALT-SEX,"Bevölkerung nach Alter, Geschlecht"
$ cat query3.rq
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX qb: <http://purl.org/linked-data/cube#>
SELECT * WHERE {
?dataSet a qb:DataSet ;
rdfs:label ?label .
FILTER (regex(?label, "^Bevölkerung"))
}
LIMIT 10
Das gleich Query, auf den Endpunkt http://ld.integ.stadt-zuerich.ch/query
liefert ein leeres Resultat:
$ curl -i -H "Accept: text/csv" --data-urlencode query@query3.rq http://ld.integ.stadt-zuerich.ch/query
HTTP/1.1 200 OK
sd-query-id: 14674
content-type: text/csv
date: Thu, 03 May 2018 18:51:24 GMT
access-control-allow-origin: *
cache-control: public, max-age=120
Vary: Accept, Accept-Encoding
X-Varnish: 1146925
Age: 0
Via: 1.1 varnish-v4
Accept-Ranges: bytes
Transfer-Encoding: chunked
Connection: keep-alive
dataSet,label
Ok sehr abstrakt. Ja ist Varnish & Trifid
Wenn ich die config richtig gelesen habe, dann gilt folgendes für SSZ Integration:
http://data.zazuko.com:5820/ssz/query
SPARQL Endpoint von Stardoghttp://ld.integ.stadt-zuerich.ch/query
SPARQL Endpoint via Varnish & TrifidDas Query mit den Umlauten in der Regex funktioniert nur, wenn ich es direkt auf den SPARQL Endpoint von Stardog absetze. Wenn es via Varnish & Trifid läuft, dann funktioniert es nicht.
Da das Query in die URL encodiert wird, würde man vermutlich in den logfiles sehen, an welcher Stelle die Encodierung bricht.
Noch zur Ergänzung, das Problem ist beim Encoding des Requests, nicht die Regex. Im folgenden Beispiel wird auch der unschuldige Bär verunstaltet
$ curl -i -H "Accept: text/csv" --data-urlencode query@query4.rq http://ssz-read:coo2aiw6itiT@data.zazuko.com:5820/ssz/query
HTTP/1.1 200 OK
Connection: keep-alive
SD-Query-Id: 14744
Transfer-Encoding: chunked
Content-Type: text/csv
Date: Thu, 03 May 2018 19:20:02 GMT
foo,label
bär,Bevölkerung nach Alter
$ curl -i -H "Accept: text/csv" --data-urlencode query@query4.rq http://ld.integ.stadt-zuerich.ch/query
HTTP/1.1 200 OK
sd-query-id: 14745
content-type: text/csv
date: Thu, 03 May 2018 19:20:11 GMT
access-control-allow-origin: *
cache-control: public, max-age=120
Vary: Accept, Accept-Encoding
X-Varnish: 655415
Age: 0
Via: 1.1 varnish-v4
Accept-Ranges: bytes
Transfer-Encoding: chunked
Connection: keep-alive
foo,label
bär,Bevölkerung nach Alter
$ cat query4.rq
PREFIX qb: <http://purl.org/linked-data/cube#>
SELECT ?foo ?label WHERE {
<http://ld.stadt-zuerich.ch/statistics/dataset/BEW-RAUM-ZEIT-ALT> rdfs:label ?label .
BIND("bär" AS ?foo )
}
LIMIT 1
Habe einen Issue bei Trifid eröffnet https://github.com/zazuko/trifid/issues/38
Wenn ich nach Bev suche kriege ich alles im Suchfeld vorgeschlagen, was mit Bevölkerung zu tun habe. Sobald dann Bevö kommt, kriege ich keine Resultate mehr. Nicht reproduzierbar mit nicht-Umlauten, sprich bei Alt resp. Alte für Alter geht es. Liegt also wohl am Umlaut.
Bekannt? Bug?