Как извлечь объект, предикат, объект из файла RDF формата N-Triples и сохранить в CSV-файле?Извлечь объект, предикат, объект из файла RDF N-Triples
ответ
Простое преобразование просто выполнит глобальный поиск и заменит файл N-Triples, введя запятые в нужные места и удалив полную остановку в конце каждой строки.
Однако есть несколько проблем с этим: значения RDF могут содержать запятые, а значения Literal могут иметь тип данных (^^xsd:int
) или тег языка (@en
). В зависимости от того, для чего вы хотите использовать CSV, вам нужно как-то избежать этого значения.
Возможно, самый простой способ это поставить все вещи в кавычках и избежать всех вхождений запятые и кавычки, так:
"a literal, like, string"@en
становится:
"\"a literal\, like\, string\"@en"
Учитывая все это, вы можете работайте с малым регулярным выражением в текстовом редакторе (vim - это хороший выбор), или вы можете написать простую программу для преобразования вашего файла. Например, с помощью Java и RDF4J, вы можете преобразовать файл, используя что-то вроде этого:
FileInputStream ntriples = new FileInputStream("...");
Model rdf = Rio.parse(ntriples, "", RDFFormat.NTRIPLES);
try (FileWriter csvWriter = new FileWriter(...)) {
for (Statement st: rdf) {
csvWriter.write(convert(st.getSubject()));
csvWriter.write(", ");
csvWriter.write(convert(st.getPredicate()));
csvWriter.write(", ");
csvWriter.write(convert(st.getObject()));
csvWriter.write("\n");
}
}
... где метод convert
делает необходимым волшебство преобразовать IRI
, BNode
или Literal
к адекватно цитируемый и ускользнул от String value - вы должны иметь возможность работать для себя, учитывая то, что я упомянул выше. Дополнительным преимуществом этого подхода является то, что он работает не только для N-Triples, но и для любого типа синтаксиса RDF, для которого у Рио есть парсер.
Вы также можете попробовать использовать библиотеку разбора/записи CSV, такую как opencsv или jackson-dataformat-csv. Как сказано: варианты бесконечны.
Спасибо, Jeen. Я попробую и дам вам знать. – Mahmud
У меня возникает ошибка, когда я пишу заявление «Модель rdf = Rio.parse (ntriples, RDFFormat.NTRIPLES);». Метод parse (InputStream, String, RDFFormat, Resource ...) в типе Rio не применим для аргументов (File, RDFFormat) – Mahmud
А, незначительная ошибка в моем примере кода. Исправлено. Для справок в будущем вы можете найти документацию RDF4J (включая API Javadoc и примеры) по адресу http://docs.rdf4j.org/. –
Бит широкий и расплывчатый. Зачем тебе это нужно? Какой язык/инструмент программирования должен произойти? Что вы пробовали, и где вы застряли? –
На самом деле, я хочу извлечь объект, предикат, объект из любого формата файла RDF в три столбца таблицы тройки. Например, значения столбцов объекта subject, predicate, будут ID1, Type, Book соответственно. – Mahmud
Я вижу. Пожалуйста, отредактируйте свой вопрос, чтобы отразить это: поставите свой вопрос как можно более конкретным и конкретным. Также не забудьте включить то, что вы пробовали до сих пор, и на каком языке это должно (желательно) произойти. Наконец: посмотрите [ask] советы о том, как задавать хорошие вопросы - используя эти советы сейчас и в будущее улучшит ваши шансы получить хороший ответ. –