StatistikStadtZuerich / stat.stadt-zuerich.ch

API Backend for the linked open statistical data of the Municipality of Zurich
Other
0 stars 0 forks source link

Suche ab Umlaut keine Resultat mehr #23

Open sszscm opened 6 years ago

sszscm commented 6 years ago

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.

image

image

Bekannt? Bug?

mchlrch commented 6 years ago

Werde mir das anschauen, war mir noch nicht bekannt. Danke @sszscm

mchlrch commented 6 years ago

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?

ktk commented 6 years ago

@mchlrch kannst Du mal schauen ob das mit Fuseki nachvollziehen kannst? Könnte auch ein Bug in der Implementation sein.

mchlrch commented 6 years ago

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
mchlrch commented 6 years ago

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

http://ld.integ.stadt-zuerich.ch/sparql/#query=PREFIX+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0APREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0APREFIX+qb%3A+%3Chttp%3A%2F%2Fpurl.org%2Flinked-data%2Fcube%23%3E%0A%0ASELECT+*+WHERE+%7B%0A++FILTER+(regex(%3FsyntheticLabel%2C+%3Fregex))%0A++BIND(%22%5EBev%C3%B6lk%22+AS+%3Fregex)%0A++%7B%0A++++SELECT+*+WHERE+%7B%0A++++++%3FdataSet+a+qb%3ADataSet+%3B%0A+++++++++++++++rdfs%3Alabel+%3Flabel+.%0A++++++FILTER+(regex(%3Flabel%2C+%22%5EBev%22))%0A++++++BIND(%22Bev%C3%B6lkerung%22+AS+%3FsyntheticLabel)%0A++++%7D%0A++%7D%0A%7D+%0ALIMIT+10&contentTypeConstruct=text%2Fturtle&contentTypeSelect=application%2Fsparql-results%2Bjson&endpoint=http%3A%2F%2Fld.integ.stadt-zuerich.ch%2Fquery&requestMethod=POST&tabTitle=Query+15&headers=%7B%7D&outputFormat=table

mchlrch commented 6 years ago

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
mchlrch commented 6 years ago

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ö
mchlrch commented 6 years ago

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
ktk commented 6 years ago

Ok sehr abstrakt. Ja ist Varnish & Trifid

mchlrch commented 6 years ago

Wenn ich die config richtig gelesen habe, dann gilt folgendes für SSZ Integration:

Das 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.

mchlrch commented 6 years ago

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
mchlrch commented 6 years ago

Habe einen Issue bei Trifid eröffnet https://github.com/zazuko/trifid/issues/38