Java n-triple RDF-синтаксический анализ

Я хочу проанализировать RDF файл, который находится в n-тройной форме.

Я могу написать свой собственный синтаксический анализатор, но я предпочел бы использовать библиотеку, а Йена кажется излишне сложной для этой цели (или, по крайней мере, я не могу видеть их документы, объясняющие, как читать n-тройки разумным образом).

Не могли бы вы указать мне какие-либо полезные библиотеки, или если вы знаете, что есть кунжут или Йена, вы можете что-то узнать о том, как они могут это решить.

Ответ 1

Если вы просто хотите проанализировать 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(".");
  }
}

Ответ 2

С Йейной это не так сложно:

Для файла 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, который позволяет вам программно манипулировать им.

Ответ 3

Старый вопрос, но поскольку вы явно спрашиваете о разных библиотеках, я подумал, что покажу, как сделать простой синтаксический разбор RDF с помощью Eclipse RDF4J Рио-парсер (раскрытие: я являюсь одним из разработчиков RDF4J).

Например, чтобы проанализировать файл и поместить все троек в Model, просто выполните следующее:

FileInputStream in = new FileInputStream("/path/to/file.nt");

Model m = Rio.parse(in, RDFFormat.NTRIPLES);

Если вы хотите сразу распечатать вывод парсера в stdout (например, в формате Turtle), сделайте что-то вроде этого:

FileInputStream in = new FileInputStream("/path/to/file.nt");

RDFParser parser = Rio.createParser(RDFFormat.NTRIPLES);
parser.parse(in, "", Rio.createWriter(RDFFormat.TURTLE, System.out));

И, конечно, есть больше способов играть с этими базовыми инструментами, посмотрите подробности документации инструментария.

Партизаны Рио доступны как отдельные артефакты maven, кстати, поэтому, если вы хотите использовать только синтаксические анализаторы, без остальной части инструментов RDF4J, вы можете это сделать.