Hi Andy,
I found the bad line eventually with
grep -a -v -n -P "^[A-Za-z0-9\"\(\:\,\|\)
\;\.\-\=\+\/\'\[\]\\\\_\?\@\<\>\#\*]+$" swisslipids.ttl
5796196: rdfs:label "�-D-galactosyl-(11')-sphing-4-enine" ;
That was quite a distance away from the reported line
Where the ? is a badly written
https://en.wikipedia.org/wiki/%C3%9F
in the upstream data set.
head -n 5796196 swisslipids.ttl| tail -n 1 | hexdump -C
r d f s : l a b e l " <bad>
00000000 20 20 72 64 66 73 3a 6c 61 62 65 6c 20 22 df 2d
| rdfs:label ".-|
00000010 44 2d 67 61 6c 61 63 74 6f 73 79 6c 2d 28 31 31
|D-galactosyl-(11|
00000020 27 29 2d 73 70 68 69 6e 67 2d 34 2d 65 6e 69 6e
|')-sphing-4-enin|
00000030 65 22 20 3b 20 0a
|e" ; .|
The upstream code has some logic to replace some unicode into "ascii"
expecting beta etc. but not a german double s.
Thanks again for having such a nice set of strict tools. It really helps
us data publishers not to put out "crap" by accident.
Regards,
Jerven
On 15/06/2021 11:52, Andy Seaborne wrote:
In the SO report, the data has 3 byte encoded surrogate pairs
https://unicode.org/faq/utf_bom.html#utf8-4
This is illegal in UTF-8. Java (as of Java8) enforces this.
Jena was not handling this as gracefully as it might (it can't fix the
problem without replacing JDK charset decoding).
JENA-2118 changes handling to put in the Unicode replacement character
but the data is changed.
Jerven - this might or might not be what your data has in it. Be good to
know if it is.
Andy
On 14/06/2021 20:25, Andy Seaborne wrote:
On 14/06/2021 18:56, Andy Seaborne wrote:
PS Try Jena 4.1.0.
PPS Spoke too soon. 4.1.0 does not handle surrogate unless presented
as explicit unicode escapes: \u or \U .
Andy
There were changes relating to:
* Handing of Unicode surrogate pairs
* not being sensitive to the Unicode version supported by the Java
runtime platform.
Depending on how you use the data, it may output as one or two U+FFFD
("unmappable") characters but that's an output issue.
Andy
On 14/06/2021 15:50, Andy Seaborne wrote:
Hi Jerven,
This is java.nio.charset.MalformedInputException wrapped up.
Unfortunately, the line/col aren't right because the standard Java
decoder does not provide the information. It will be after the
reported point in the input so slicing the front off should get you
a smaller file to look at, then binary chop to find a slice
containing the error.
For efficiency reasons (and it does make a notable difference), RIOT
grabs large chunks of characters from the UTF-8 => java characters
decoder (128K chunks). Down side - encoding errors are reported as
"somewhere" and can be anywhere in the chunk.
There is a Jena tool "utf8" which more carefully translates UTF-8 -
it may help pinpoint the error. It's better in 4.1.0: in 4.0.0 it
got left in verbose mode - it needs a small slice of data and it may
not find the error helpfully because of the different ways it can fail.
I'd be interested in knowing whether mapping to "unmappable" U+FFFD
would help - but it's a silent translation so not a perfect solution.
Andy
Is this connected with a Q today:
https://stackoverflow.com/questions/67970538/is-it-possible-to-ignore-riotparseexception-in-apache-jena
On 14/06/2021 14:59, jerven Bolleman wrote:
Dear Jena team,
I have a turtle file that fails validation with the following error.
riot --validate swisslipids.ttl
15:19:08 ERROR riot :: [line: 5794892, col: 6 ] Bad
character encoding
But I can't spot the error on that line so I did a hexdump.
sed -n '5794892p' swisslipids.ttl | hexdump -C
00000000 20 20 53 4c 4d 3a 72 61 6e 6b 20 53 4c 4d 3a 49 |
SLM:rank SLM:I|
00000010 73 6f 6d 65 72 69 63 5f 53 75 62 73 70 65 63 69
|someric_Subspeci|
00000020 65 73 20 3b 0a |es ;.|
00000025
Which is the same as a different earlier line which passed
sed -n '5794877p' swisslipids.ttl | hexdump -C
00000000 20 20 53 4c 4d 3a 72 61 6e 6b 20 53 4c 4d 3a 49 |
SLM:rank SLM:I|
00000010 73 6f 6d 65 72 69 63 5f 53 75 62 73 70 65 63 69
|someric_Subspeci|
00000020 65 73 20 3b 0a |es ;.|
00000025
The file is unfortunatly to large to attach at 29MB of xz
compressed data. I would be more than happy to share it or a subset.
Riot version is 4.0.0
Regards,
Jerven
PS nearby lines with their line numbers
5794876 SLM:000501095 a owl:Class ;
5794877 SLM:rank SLM:Isomeric_Subspecies ;
5794878 rdfs:label
"(12S)-hydroperoxy-(5Z,8Z,10E,14Z,17Z)-eicosapentaenoate" ;
5794879 skos:altLabel "(12S)-Hp-(5Z,8Z,10E,14Z,17Z)-EPE" ;
5794880 rdfs:subClassOf SLM:000501324 ;
5794881 chebislash:inchi
"InChI=1S/C20H30O4/c1-2-3-4-5-10-13-16-19(24-23)17-14-11-8-6-7-9-12-15-18-20(21)22/h3-4,7-11,13-14,17,19,23H,2,5-6,12,15-16,18H2,1H3,(H,21,22)/p-1/b4-3-,9-7-,11-8-,13-10-,17-14+/t19-/m0/s1"
;
5794882 chebislash:inchikey "HDMYXONNVAOHFR-UOLHMMFFSA-M" ;
5794883 owl:equivalentClass
5794884 CHEBI:90772
5794885 ;
5794886 rdfs:seeAlso lipidmaps:LMFA03070012 ;
5794887 chebislash:charge "-1" ;
5794888 chebislash:smiles
'''C(=C\\C\\C=C/C=C/[C@H](C/C=C\\C/C=C\\CC)OO)\\CCCC([O-])=O''' ;
5794889 SLM:citation citation:22984144 ;
5794890 chebislash:formula "C20H29O4" .
5794891 SLM:000501145 a owl:Class ;
5794892 SLM:rank SLM:Isomeric_Subspecies ;
--
*Jerven Tjalling Bolleman*
Principal Software Developer
*SIB | Swiss Institute of Bioinformatics*
1, rue Michel Servet - CH 1211 Geneva 4 - Switzerland
t +41 22 379 58 85
[email protected] - www.sib.swiss