Java n-тройной синтаксический анализ RDF
Я хочу проанализировать файл RDF, который находится в n-тройной форме.
Я могу написать свой собственный синтаксический анализатор, но я бы предпочел использовать библиотеку, и Йена кажется излишне сложной для этой цели (или, по крайней мере, я не вижу, чтобы их документы объясняли, как правильно читать n-тройки).
Не могли бы вы указать мне какие-нибудь полезные библиотеки или, если вы хорошо знаете Сезам или Йену, вы могли бы кое-что узнать о том, как они могут решить эту проблему.
3 ответа
Если вы просто хотите проанализировать NTriples и не должны делать ничего, кроме базовой обработки и запросов, тогда вы можете попробовать NxParser. Это очень простой фрагмент кода Java, который будет передавать любые NTriples, такие как формат (например, 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(".");
}
}
С Йеной это не так сложно
Данный файл rdfexample.ntriple
содержащий следующий RDF в форме N-TRIPLE (пример взят здесь):
<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);;
}
}
читает файл и печатает его в виде TURTLE:
<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
объект, который позволяет программно манипулировать им.
Старый вопрос, но поскольку вы явно задаете вопрос о разных библиотеках, я подумал, что покажу, как выполнять простой синтаксический анализ 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));
И, конечно же, есть больше способов поиграть с этими базовыми инструментами, подробнее смотрите в документации к инструментарию.
Кстати, парсеры Rio доступны как отдельные артефакты maven, так что если вы хотите использовать только парсеры, без остальных инструментов RDF4J, вы можете сделать это.