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, вы можете сделать это.

Другие вопросы по тегам