Как обработать rdf-версию страницы DBpedia с Йеной? - PullRequest
3 голосов
/ 08 февраля 2011

На всех страницах dbpedia, например,

http://dbpedia.org/page/Ireland

есть ссылка на RDF-файл. В моем приложении мне нужно проанализировать код rdf и выполнить на нем некоторую логику. Я мог бы положиться на конечную точку dbpedia SPARQL, но я предпочитаю загружать код rdf локально и анализировать его, чтобы иметь полный контроль над ним.

Я установил JENA , и я пытаюсь проанализировать код и извлечь, например, свойство с именем: "geo: geometry".

Я пытаюсь с:

StringReader sr = new StringReader( node.rdfCode )      
Model model = ModelFactory.createDefaultModel()
model.read( sr, null )

Как я могу запросить модель, чтобы получить необходимую информацию?

Например, если бы я хотел получить утверждение:

<rdf:Description rdf:about="http://dbpedia.org/resource/Ireland">
<geo:geometry xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" rdf:datatype="http://www.openlinksw.com/schemas/virtrdf#Geometry">POINT(-7 53)</geo:geometry>
</rdf:Description>

или

<rdf:Description rdf:about="http://dbpedia.org/resource/Ireland">
<dbpprop:countryLargestCity xmlns:dbpprop="http://dbpedia.org/property/" xml:lang="en">Dublin</dbpprop:countryLargestCity>
</rdf:Description>

Что такое правильный фильтр?

Большое спасибо! Mulone

1 Ответ

5 голосов
/ 08 февраля 2011

После анализа файла в модели Jena вы можете выполнять итерацию и фильтрацию с помощью чего-то вроде:

//Property to filter the model
Property geoProperty = 
    model. createProperty("http://www.w3.org/2003/01/geo/wgs84_pos#",
                          "geometry");

//Iterator based on a Simple selector
StmtIterator iter =
  model.listStatements(new SimpleSelector(null, geoProperty, (RDFNode)null)); 

//Loop to traverse the statements that match the SimpleSelector
while (iter.hasNext()) {
   Statement stmt = iter.nextStatement();
   System.out.print(stmt.getSubject().toString());
   System.out.print(stmt.getPredicate().toString());
   System.out.println(stmt.getObject().toString());

}

SimpleSelector позволяет вам передавать любой (субъект, предикат, объект) шаблон для сопоставленияутверждения в модели.В вашем случае, если вы заботитесь только о конкретном предикате, тогда первый и третий параметры конструктора равны нулю.

Разрешение фильтрации двух разных свойств

Для более сложной фильтрацииВы можете реализовать метод selects в интерфейсе SimpleSelector, как здесь:

Property geoProperty = /* like before */;
Property countryLargestCityProperty = 
    model. createProperty("http://dbpedia.org/property/",
                          "countryLargestCity");

SimpleSelector selector = new SimpleSelector(null, null, (RDFNode)null) {
    public boolean selects(Statement s)
        { return s.getPredicate().equals(geoProperty) || 
                 s.getPredicate().equals(countryLargestCityProperty) ;}
}
StmtIterator iter = model.listStatements(selector);
while(it.hasNext()) {
     /* same as in the previous example */
}

Редактировать: включая полный пример

Этот код включает полный примерэто работает для меня.

import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.SimpleSelector;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.rdf.model.Statement;

public class TestJena {

    public static void main(String[] args) {
        FileManager fManager = FileManager.get();
        fManager.addLocatorURL();
        Model model = fManager.loadModel("http://dbpedia.org/data/Ireland.rdf");

        Property geoProperty = 
        model. createProperty("http://www.w3.org/2003/01/geo/wgs84_pos#",
                                  "geometry");

        StmtIterator iter =
            model.listStatements(new SimpleSelector(null, geoProperty,(RDFNode) null)); 

        //Loop to traverse the statements that match the SimpleSelector
        while (iter.hasNext()) {
            Statement stmt = iter.nextStatement();
            if (stmt.getObject().isLiteral()) {
                Literal obj = (Literal) stmt.getObject();
                System.out.println("The geometry predicate value is " + 
                                                          obj.getString());
            }   
        }   
    }   

}

Этот полный пример печатает:

The geometry predicate value is POINT(-7 53)

Примечания по связанным данным

http://dbpedia.org/page/Ireland - этоHTML-версия ресурса ресурса http://dbpedia.org/resource/Ireland

Чтобы получить RDF, необходимо решить:

http://dbpedia.org/data/Ireland.rdf

или

http://dbpedia.org/resource/Ireland+ Accept: application/rdfxml в заголовке HTTP.С curl это будет что-то вроде:

curl -L -H 'Accept: application/rdf+xml' <a href="http://dbpedia.org/resource/Ireland" rel="nofollow">http://dbpedia.org/resource/Ireland</a>

...