2011-04-28 14 views
11

Chcę przeanalizować plik RDF, który jest w n-potrójnej formie.Java n-triple RDF parsing

Potrafię napisać własny parser, ale wolałbym korzystać z biblioteki, a Jena wydaje się w tym celu skomplikowana (a przynajmniej nie widzę, żeby ich doktorzy tłumaczyli, jak w rozsądny sposób czytać n-trójki).

Czy możesz wskazać mi jakieś przydatne biblioteki lub jeśli znasz dobrze Sezamę lub Jena, możesz wiedzieć, jak mogą rozwiązać ten problem.

Odpowiedz

7

Jeśli chcesz tylko przeanalizować wersje i nie musisz robić nic poza podstawowym przetwarzaniem i zapytaniami, możesz wypróbować numer NxParser. Jest to bardzo prosty fragment kodu Java, który będzie przekazywał dowolny format podobny do NTriples (tak NQuads itp.), Który daje ci iterator względem instrukcji w pliku. Jeśli chcesz tylko NTriples możesz łatwo zignorować wyciągi zawierające mniej/więcej niż 3 elementy.

Adaptacja przykład na powiązanej stronie dałoby następujący prosty kod:

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("."); 
    } 
} 
+0

Po to poszedłem, dzięki. – Ankur

+0

Link do biblioteki NxParser wydaje się nie działać. Czy [nxparser/nxparser] (https://github.com/nxparser/nxparser) jest nową lokalizacją biblioteki? – DuffJ

8

Z Jena to nie jest takie trudne:

Biorąc plik rdfexample.ntriple zawierającą następujące RDF w N-Triple forma (przykład pochodzi z here)

<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" . 

dodaje kod

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);; 
    } 
} 

czyta plik i drukuje go w formie 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" . 

Tak, z Jeny można łatwo analizować RDF (w dowolnej formie) do com.hp.hpl.jena.rdf.model.Model obiektu, który pozwala programowo manipulować .

+0

Dzięki MarcoS, możliwość zmiany formatów prawdopodobnie przyda się w przyszłości. – Ankur

2

Stare pytanie, ale ponieważ wyraźnie pytasz o różne biblioteki, pomyślałem, że pokażę, jak zrobić proste przetwarzanie RDF z Eclipse RDF4J 's Rio parser (ujawnienie: Jestem jednym z programistów RDF4J).

Na przykład, aby przeanalizować plik i umieścić wszystkie trójek w Model, po prostu to zrobić:

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

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

Jeśli chcesz natychmiast wydrukować parser na standardowe wyjście (na przykład w formacie Turtle), wykonaj coś takiego:

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

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

I oczywiście istnieje więcej sposobów, aby grać z tymi podstawowymi narzędziami, przyjrzeć się dokumentacji toolkit dla szczegółów.

Parsery Rio są dostępne jako osobne artefakty z maven, więc jeśli chcesz używać tylko parserów, bez reszty narzędzi RDF4J, możesz to zrobić.