Ваш код выглядит намного сложнее, чем нужно. Чтобы загрузить файл JSON -LD по удаленному URL-адресу как модель RDF с использованием RDF4J, вы можете просто сделать это:
String file = "https://www.ebi.ac.uk/biosamples/samples/SAMN03177689.ldjson";
try (InputStream input = new URL(file).openStream()) {
Model m = Rio.parse(input, file, RDFFormat.JSONLD);
}
Если вы затем wi sh, чтобы написать эту модель в синтаксисе Turtle, все, что вам нужно сделать, это:
// replace System.out with your own outputstream if you want to write to file
Rio.write(m, System.out, RDFFormat.TURTLE);
Если я запусту это на вашем примере файла, я получу это:
@prefix biosample: <http://identifiers.org/biosample/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
biosample:SAMN03177689 a schema:DataRecord;
schema:dateCreated "2014-12-12T06:54:48.957Z"^^schema:Date;
schema:dateModified "2019-03-13T09:41:33.81Z"^^schema:Date;
schema:identifier "biosample:SAMN03177689";
schema:isPartOf <https://www.ebi.ac.uk/biosamples/samples>;
schema:mainEntity <https://www.ebi.ac.uk/biosamples/samples/SAMN03177689> .
<https://www.ebi.ac.uk/biosamples/samples> a schema:Dataset .
<https://www.ebi.ac.uk/biosamples/samples/SAMN03177689> a <http://purl.obolibrary.org/obo/OBI_0000747>,
schema:Sample;
schema:additionalProperty _:genid-2e6f9d5c4cc34db8b5ab6e72e7857e31-b0 .
_:genid-2e6f9d5c4cc34db8b5ab6e72e7857e31-b0 a schema:PropertyValue;
schema:name "INSDC center name";
schema:value "FDA" .
[snip]
Обратите внимание, что здесь экземпляр schema:Sample
имеет фактический IRI как идентификатор, а не пустой узел: <https://www.ebi.ac.uk/biosamples/samples/SAMN03177689>
.
В вашем коде происходят некоторые странные вещи. Прежде всего это метод modifyIdentifier
. По какой-то причине он обрезает все вхождения biosample:
пустой строкой. Я не уверен, почему вы хотите это сделать (кажется плохой идеей манипулировать строковыми данными таким образом). Он также делает это таким образом, чтобы на выходе был неверный синтаксис Turtle. Если в приведенном выше примере вы замените biosample:
пустой строкой, вы получите в строке 1:
@prefix <http://identifiers.org/biosample/> .
, что не является допустимым определением префикса (после пропуска двоеточия) prefix
). И далее, у вас будет
SAMN03177689 a schema:DataRecord;
Это недействительная ссылка IRI.
Тогда есть этот TurtleWriterCustom
класс. Вы не показываете код для этого класса, но, учитывая его имя, я подозреваю, что он пытается выполнить дальнейшую нестандартную настройку выходных данных, и при этом портит идентификаторы вашего образца, как-то заменяя их (одинаковыми) пустыми узлами. .
Если честно, я даже не уверен, почему вы вообще конвертируете из JSON -LD в Turtle, потому что если ваша цель - загрузить эти данные в базу данных RDF, чтобы вы могли выполнять запросы SPARQL , вы можете просто загрузить файл JSON -LD напрямую:
Repository repo = ...; // your RDF4J database
try (RepositoryConnection conn = repo.getConnection()) {
conn.add(input, file, RDFFormat.JSONLD);
// data added to database - you can now query.
String query = "prefix schema: <http://schema.org/> "
+ "select ?r {?r a schema:DataRecord ; "
+ "schema:mainEntity [schema:additionalProperty [schema:name \"organism\" ; schema:value \"Escherichia coli\"] ] }";
conn.prepareTuplequery(query).evaluate().forEach(bs -> System.out.println(bs));
}
результат:
[r=http://identifiers.org/biosample/SAMN03177689]