2016-10-26 1 views
-1

Как извлечь объект, предикат, объект из файла RDF формата N-Triples и сохранить в CSV-файле?Извлечь объект, предикат, объект из файла RDF N-Triples

+0

Бит широкий и расплывчатый. Зачем тебе это нужно? Какой язык/инструмент программирования должен произойти? Что вы пробовали, и где вы застряли? –

+0

На самом деле, я хочу извлечь объект, предикат, объект из любого формата файла RDF в три столбца таблицы тройки. Например, значения столбцов объекта subject, predicate, будут ID1, Type, Book соответственно. – Mahmud

+0

Я вижу. Пожалуйста, отредактируйте свой вопрос, чтобы отразить это: поставите свой вопрос как можно более конкретным и конкретным. Также не забудьте включить то, что вы пробовали до сих пор, и на каком языке это должно (желательно) произойти. Наконец: посмотрите [ask] советы о том, как задавать хорошие вопросы - используя эти советы сейчас и в будущее улучшит ваши шансы получить хороший ответ. –

ответ

0

Простое преобразование просто выполнит глобальный поиск и заменит файл 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. Как сказано: варианты бесконечны.

+0

Спасибо, Jeen. Я попробую и дам вам знать. – Mahmud

+0

У меня возникает ошибка, когда я пишу заявление «Модель rdf = Rio.parse (ntriples, RDFFormat.NTRIPLES);». Метод parse (InputStream, String, RDFFormat, Resource ...) в типе Rio не применим для аргументов (File, RDFFormat) – Mahmud

+0

А, незначительная ошибка в моем примере кода. Исправлено. Для справок в будущем вы можете найти документацию RDF4J (включая API Javadoc и примеры) по адресу http://docs.rdf4j.org/. –

Смежные вопросы