Обслуживание RDF-представления модели Java с помощью Spring MVC?

Как я могу обслуживать RDF-представление модели Java через Spring MVC?

У меня есть представления JSON и XML, работающие с использованием механизмов согласования содержимого Spring, и я хотел бы сделать то же самое для RDF.


person user86834    schedule 26.06.2013    source источник


Ответы (3)


Предполагая, что вы используете конфигурацию на основе аннотаций для своего приложения MVC, на самом деле это может быть довольно просто. Используя Проблемы типов носителей для Текстовые форматы RDF в качестве руководства по спецификации типа контента, довольно легко расширить существующее решение. Реальный вопрос заключается в том, какой тип сериализации вам нужен при запросе RDF? Если мы используем Jena в качестве базовой технологии модели, то поддержка любой из стандартных сериализаций является тривиальной из коробки. Json - единственный, который доставил мне небольшую трудность, но вы уже решили это.

Как видите, реализовать сериализацию (используя стандартную Jena, без дополнительных библиотек) на самом деле довольно просто! В конечном итоге проблема заключается в том, чтобы просто сопоставить правильную сериализацию с предоставленным типом контента.

ИЗМЕНИТЬ 19 апреля 2014 г.

Предыдущие типы контента были из документа, отражающего обсуждения рабочей группы. Пост был отредактирован, чтобы отразить типы контента реестр IANA Media Type дополнен RDF1.1 N-Triples и JSON-LD стандарты.

@Controller
public class SpecialController 
{
    public Model model = null; // set externally

    @RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"application/x-javascript", "application/json", "application/ld+json"})
    public @ResponseBody String getModelAsJson() {
       // Your existing json response
    }

    @RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"application/xml", "application/rdf+xml"})
    public @ResponseBody String getModelAsXml() {
       // Note that we added "application/rdf+xml" as one of the supported types
       // for this method. Otherwise, we utilize your existing xml serialization
    }

    @RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"application/n-triples"})
    public @ResponseBody String getModelAsNTriples() {
       // New method to serialize to n-triple
       try( final ByteArrayOutputStream os = new ByteArrayOutputStream() ){
           model.write(os, "N-TRIPLE");
           return os.toString();
       }
    }

    @RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"text/turtle"})
    public @ResponseBody String getModelAsTurtle() {
       // New method to serialize to turtle
       try( final ByteArrayOutputStream os = new ByteArrayOutputStream() ){
           model.write(os, "TURTLE");
           return os.toString();
       }
    }

    @RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"text/n3"})
    public @ResponseBody String getModelAsN3() {
       // New method to serialize to N3
       try( final ByteArrayOutputStream os = new ByteArrayOutputStream() ){
           model.write(os, "N3");
           return os.toString();
       }
    }
}
person Rob Hall    schedule 27.06.2013

Я предварю это, упомянув, что я ничего не знаю о Spring MVC. Но если у вас есть объект Java, который вы хотите сериализовать как RDF, библиотека, такая как Empire (я автор) может вам помочь. Вы можете аннотировать объект, чтобы указать, какие вещи должны быть преобразованы в RDF, а затем использовать класс RdfGenerator, чтобы вернуть граф RDF, представляющий объект. Затем вы можете использовать что-то вроде RIO модуля записи RDF из среды Sesame для сериализации графа в соответствии с запрошенной сериализацией RDF.

Я знаю, что это не специфично для Spring MVC, но если вы можете получить OutputStream и запрошенный тип контента, вы сможете заставить его работать с RIO Empire & Sesame.

person Michael    schedule 26.06.2013
comment
Спасибо, выглядит интересно. Я вытащил из git, но выполнение mvn clean install приводит к следующей ошибке. The following artifacts could not be resolved: com.clarkparsia:cp-common-openrdf:jar:0.8 - person user86834; 26.06.2013
comment
материал maven устарел, потому что я его не использую. просто используйте 'ant clean dist' для создания банок дистрибутива - person Michael; 26.06.2013
comment
Спасибо, могу ли я использовать модуль записи Jena для записи объекта Graph? - person user86834; 26.06.2013
comment
не так просто, объект Graph получен из Sesame API, поэтому вам нужно будет преобразовать его из Sesame в Jena. Вы можете сохранить Empire в модели Jena, которую вы предоставляете, но тогда вам нужно будет настроить EntityManager, который может быть более тяжелым, чем вы хотите. - person Michael; 26.06.2013

Кроме того, необходимо добавить параметр charset. StringHttpMessageConverter по умолчанию использует кодировку символов ISO-8859-1, если вы ее не измените. Если выходной формат имеет фиксированную кодировку, отличную от ISO-8859-1 (например, UTF-8), он должен быть объявлен в produces. Такое поведение соответствует спецификациям. Например, если модель содержит символы, отличные от ASCII, и закодирована в turtle, в спецификации указано, что тип носителя text/turtle должен содержать параметр charset со значением UTF-8. В противном случае это необязательно.

  @RequestMapping(value = "your/service/location", method = RequestMethod.GET, 
        produces = { "text/turtle;charset=UTF-8"})
  public @ResponseBody String getModelAsTurtle() throws IOException {
    try (final ByteArrayOutputStream os = new ByteArrayOutputStream()) {
        RDFDataMgr.write(os, model, RDFFormat.TURTLE_PRETTY);
        return os.toString();
    }
  }
person Francisco J. Lopez-Pellicer    schedule 05.10.2014