#java #parsing #rdf #n-triples
#java #синтаксический анализ #rdf #n-тройки
Вопрос:
Я хочу проанализировать файл RDF, который имеет n-тройную форму.
Я могу написать свой собственный синтаксический анализатор, но я бы предпочел использовать библиотеку, и Jena кажется излишне сложной для этой цели (или, по крайней мере, я не вижу их документов, объясняющих, как разумно читать n-тройки).
Не могли бы вы, пожалуйста, либо указать мне на какие-либо полезные библиотеки, либо, если вы хорошо знакомы с Sesame или Jena, возможно, вы знаете что-нибудь о том, как они могут это решить.
Ответ №1:
С Jena это не так сложно:
Дан файл, rdfexample.ntriple
содержащий следующий RDF в N-ТРОЙНОЙ форме (пример взят из здесь):
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#year> "1988" .
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#price> "9.90" .
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#company> "CBS Records" .
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#country> "UK" .
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#artist> "Bonnie Tyler" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#year> "1985" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#price> "10.90" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#company> "Columbia" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#country> "USA" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#artist> "Bob Dylan" .
следующий код
public static void main(String[] args) {
String fileNameOrUri = "src/a/rdfexample.ntriple";
Model model = ModelFactory.createDefaultModel();
InputStream is = FileManager.get().open(fileNameOrUri);
if (is != null) {
model.read(is, null, "N-TRIPLE");
model.write(System.out, "TURTLE");
} else {
System.err.println("cannot read " fileNameOrUri);;
}
}
считывает файл и распечатывает его в черепашьей форме:
<http://www.recshop.fake/cd/Hide your heart>
<http://www.recshop.fake/cd#artist>
"Bonnie Tyler" ;
<http://www.recshop.fake/cd#company>
"CBS Records" ;
<http://www.recshop.fake/cd#country>
"UK" ;
<http://www.recshop.fake/cd#price>
"9.90" ;
<http://www.recshop.fake/cd#year>
"1988" .
<http://www.recshop.fake/cd/Empire Burlesque>
<http://www.recshop.fake/cd#artist>
"Bob Dylan" ;
<http://www.recshop.fake/cd#company>
"Columbia" ;
<http://www.recshop.fake/cd#country>
"USA" ;
<http://www.recshop.fake/cd#price>
"10.90" ;
<http://www.recshop.fake/cd#year>
"1985" .
Итак, с помощью Jena вы можете легко преобразовать RDF (в любой форме) в com.hp.hpl.jena.rdf.model.Model
объект, что позволяет программно манипулировать им.
Комментарии:
1. Спасибо Маркос, возможность изменять форматы, вероятно, пригодится в будущем.
Ответ №2:
Если вы просто хотите проанализировать NTriples и вам не нужно делать ничего, кроме базовой обработки и запросов, тогда вы могли бы попробовать NxParser. Это очень простой фрагмент Java-кода, который будет передавать любые NTriples, такие как format (so NQuads и т.д.), Что дает вам итератор по операторам в файле. Если вам нужны только NTriples, вы можете легко игнорировать инструкции, содержащие менее / более 3 элементов.
Адаптация примера на связанной странице привела бы к следующему простому коду:
NxParser nxp = new NxParser(new FileInputStream("filetoparse.nq"),false);
while (nxp.hasNext())
{
Node[] ns = nxp.next();
if (ns.length == 3)
{
//Only Process Triples
//Replace the print statements with whatever you want
for (Node n: ns)
{
System.out.print(n.toN3());
System.out.print(" ");
}
System.out.println(".");
}
}
Комментарии:
1. Ссылка на библиотеку NxParser, похоже, не работает. Является ли nxparser /nxparser новым местоположением библиотеки?
Ответ №3:
Старый вопрос, но поскольку вы явно спрашиваете о разных библиотеках, я подумал, что покажу, как выполнить простой синтаксический анализ RDF с помощью анализатора Rio от Eclipse RDF4J (раскрытие информации: я один из разработчиков RDF4J).
Например, чтобы разобрать файл и поместить все тройки в Model
, просто сделайте это:
FileInputStream in = new FileInputStream("/path/to/file.nt");
Model m = Rio.parse(in, RDFFormat.NTRIPLES);
Если вы хотите немедленно распечатать выходные данные анализатора в стандартный вывод (например, в формате Turtle), сделайте что-то вроде этого:
FileInputStream in = new FileInputStream("/path/to/file.nt");
RDFParser parser = Rio.createParser(RDFFormat.NTRIPLES);
parser.parse(in, "", Rio.createWriter(RDFFormat.TURTLE, System.out));
И, конечно, есть больше способов поиграть с этими базовыми инструментами, взгляните на документацию toolkit для получения подробной информации.
Парсеры Rio, кстати, доступны как отдельные артефакты maven, так что, если вы хотите использовать только парсеры, без остальных инструментов RDF4J, вы можете это сделать.