際際滷

際際滷Share a Scribd company logo
Studiu comparativ a librriilor de procesare a
                       documentelor RDF

                                      Antochi Anca Mihaela
                                      aantochi@infoiasi.ro



        Abstract. Acest document este un studiu comparativ 樽ntre librriile SemWeb i
        LinqToRdf de procesare RDF. Sunt comparate metodele de citire i de scriere a
        fiierelor RDF cu ajutorul celor dou librrii, suportul pentru triple i
        posibilitatea de interogare.

        Keywords: RDF, SPARQL, .NET, C#, LINQ




1 Introducere

   n 樽ncercarea de a gsi librrii de procesare RDF pentru framework-ul .Net am
observat c interesul dezvoltatorilor .Net este sczut, iar librriile care au fost
dezvoltate nu au mai fost actualizate de un timp 樽ndelungat.
   API-ul SemWeb a fost dezvoltat de ctre Joshua Tauberer i prima versiune a
aprut 樽n anul 2005. Librria a fost scris 樽n C# pentru versiunile 1.1 i 2.0 ale
limbajului. Pe data de 19 mai 2009 Joshua Tauberer a anun釘at ca renun釘 la acest
proiect din cauza interesului sczut pentru semantic Web a programatorilor .Net1.
   Proiectul LinqToRdf este un provider pentru LINQ, ce transform interogrile din
C# 樽n SPARQL i are ca autor pe Andrew Matthews. n LinqToRdf este folosit
librria SemWeb dezvoltat de Joshua Tauberer. Se pare c nici LinqToRdf nu a mai
fost actualizat i ultima versiune a aprut 樽n august 2008.
   Codul surs i librriile pentru SemWeb sunt disponibile la
http://razor.occams.info/code/semweb/. La aceeai adres se gsesc documenta釘ie i
exemple. Licen釘a SemWeb este 樽n termenii GNU GPL i Creative Commons
Attribution. n proiect sunt folosite i librrii externe: SPARQL engine cu licen釘
GNU LGPL, mecanism de validare Euler sub licen釘 W3C Software Licence i
IKVM care este compatibil GPL.
   LinqToRdf poate fi descrcat de la adresa http://code.google.com/p/linqtordf/ sub
forma unui fiier msi ce instaleaz librriile necesare i tot la aceast adres se gsesc
documenta釘ia i exemplele. Codul surs se gsete la http://linqtordf.googlecode.com/
svn/trunk/src/linqtordf. LinqToRdf se afl sub licen釘 BSD.




1   Anun釘ul lui Joshua Tauberer gsit la adresa http://razor.occams.info/code/semweb/
2    Suport pentru triple

   n proiectul SemWeb triplele din RDF sunt reprezentate de structura Statement.
Spre deosebire de specifica釘iile RDF 樽n care triplele sunt construite din subiect,
predicat i obiect, 樽n Statement exist i un c但mp meta. Astfel a putea spune c
specifica釘iile nu au fost 樽ntocmai respectate i a fost ad ugat meta care este specific
proiectului SemWeb, dar folosirea lui este op釘ional.
   La baza ierarhiei de clase pentru a reprezenta componentele unei triple se afl clasa
abstract Resource. Subiectul poate fi, conform specifica釘iilor, referin釘 URI sau nod
gol. Acestea sunt reprezentate 樽n SemWeb de clasele Entity i BNode. Entity este
subclas direct a clasei Resource, iar BNode motenete Entity. Predicatul poate fi
de tip referin釘 URI i, dupa cum am vazut mai sus, este reprezentat de clasa Entity.
Obiectul, pe l但ng referin釘 URI i nod gol, mai poate fi i literal, care este reprezentat
de clasa Literal, subclas a clase Resource. Se poate vedea 樽n figura de mai jos
ierarhia acestor clase:
Dup cum putem vedea 樽n diagram, exist o clas Variable ce poate fi utilizat la
interogri i reprezint o variabil 樽n interogare.
   Exemplu de creare a unei triple:
   Statement triple = new Statement(
     new Entity("http://www.example.org/Maria"),
     new Entity("http://www.example.org/hasMother"),
     new Literal("Alina") );
   Op釘ional, un literal poate avea tag de limb sau tipul datei. Tag-ul de limb i tipul
se transmit ca parametrii la instan釘ierea clasei Literal, dar cu restric釘ia de a fi transmis
doar unul dintre cei doi parametrii:
   new Literal("12", null, XSDNS + "#integer");
   new Literal("Alina", "ro_RO", null);
    LinqToRdf foloeste librria SemWeb, la care aduga suport pentru LINQ. Nu
exist 樽n acest proiect clase ce corespund triplelor din RDF i a componentelor din
triple (subiect, predicat i obiect). Modul de scriere a interogarilor este foarte
asemntor cu alte tipuri de interogri LINQ (LINQ la SQL sau LINQ la colec釘ii).
Pentru a crea fiiere RDF i pentru interograrea acestora este necesar s mapm
triplele din RDF la clase C# cu ajutorul atributelor OwlResource. Maparea se poate
face manual prin crearea claselor necesare cu attribute sau se pot genera clasele
pornind de la o ontologie cu ajutorul uneltei RdfMetal ce este descrcat 樽mpreun cu
LinqToRdf.
    Exemplu:
   [OwlResource(OntologyName="Genealogy",
      RelativeUriReference="Person")]
   public class Person : OwlInstanceSupertype
   {
     [OwlResource(OntologyName = "Genealogy",
       RelativeUriReference = "name")]
     public string Name { get; set; }
     [OwlResource(OntologyName = "Genealogy",
       RelativeUriReference="age")]
     public string Age { get; set;}
   }



3 Citirea fiierelor RDF

   Pentru procesarea unui set de triple (obiecte de tip Statement) trebuie s avem o
clas ce implementeaz interfa釘a StatementSink ce con釘ine o singur metod cu
semntura:
   public bool Add(Statement statement);
Autorul proiectului nu respect aici conven釘ia de nume din C# dup care ar fi
trebuit s numeasc aceast interfa釘 IStatementSink.
   De asemenea este necesar o clas ce implementeaz interfa釘a StatementSource ce
are o singur metod cu semntura:
  public void Select(StatementSink)
    Clasele ce implementeaz interfa釘a StatementSource reprezint o surs de obiecte
Statement. Clasa abstract RdfReader implementeaz interfa釘a StatementSource, iar la
r但ndul ei este motenit de clasele RdfXmlReader i N3Reader.
    O clas ce implementeaz ambele interfe釘e de mai sus este MemoryStore, ce re釘ine
triplele 樽n memorie.
    n exemplul urmtor se citete dintr-un RDF i triplele se re釘in 樽n MemoryStore:
  MemoryStore store = new MemoryStore();
  using (RdfReader reader = new RdfXmlReader("Test.rdf"))
  {
    reader.Select(store);
  }
   n LinqToRdf pentru a citi dintr-un fiier RDF trebuie mai int但i s mapm datele
din fiier la clase C#. De asemenea este nevoie de o clas de tip TripleStore pentru a
specifica loca釘ia triplelor i tipul de interogare.
   Exemplu:
  TripleStore store = new
  TripleStore(@"http://localhost/genealogy/Family.aspx");
  store.QueryType = QueryType.RemoteSparqlStore;
  RdfDataContext context = new RdfDataContext(store);
  var result = select parent in context.ForType<Parent>()
               where parent.Name = Mary
               select {parent.Name, parent.Age};
   Observm ca in LinqToRdf nu sunt 樽ntoarse triple ca urmare a citirii, ci obiecte de
tipul claselor ce au fost mapate la datele din RDF. De asemenea citirea se face ca o
interograe SPARQL, deoarece la execu釘ie interogarea de mai sus este transformat in
SPARQL. Asemnarea este foarte mare cu o interogare de tip Linq to SQL, doar
maparea datelor fiind diferit.


4 Creare de fiiere RDF

   Scriere 樽n fiiere RDF se face 樽n SemWeb cu ajutorul clasei abstracte RdfWriter ce
este extins de ctre clasele XmlTextWriter i N3Writer. RdfWriter implementeaz
interfa釘a StatementSink. Astfel putem apela metoda Add pentru a aduga c但te o tripl
sau metoda Write ce primete ca parametru un obiect de tip StatementSource.
   Exemplu:
  MemoryStore store = new MemoryStore();
  Entity subject = new Entity("http://ex.org/Mary");
Entity property = "http://ex.org/hasSon";
  Literal obj = new Literal("John", "en_US", null);
  store.Add(new Statement(subject, property, obj));
  XmlTextWriter xmlWriter = null;
  try
  {
    xmlWriter =
          new XmlTextWriter("Test.rdf",Encoding.UTF8);
    using (RdfWriter writer = new RdfXmlWriter(xmlWriter))
    {
       writer.Namespaces.AddNamespace(
            "http://ex.org/", "ex");
       writer.Write(store);
    }
  }
  catch (Exception ex)
  {
      Trace.TraceError(ex.Message);
  }
  finally
  {
      if (xmlWriter != null)
        xmlWriter.Close();
  }
   Proiectul LinqToRdf con釘ine i un designer grafic ce se integreaz 樽n Visual Studio
(versiunea 2008 sau urmtoare). Folosind acest designer este foarte simplu pentru a
crea ontologii i clasele C# ce sunt mapate la aceste ontologii. LinqToRdfDesigner
creaz ontologiile 樽n format N3 i autorul proiectului precizeaz 樽n documenta釘ie c
acest designer este suficient pentru ontologii simple, dar pentru a crea ontologii
complexe sau 樽n alte formate dec但t N3 am putea considera Protg.


5 Interogri SPARQL

   n SemWeb exist 3 tipuri de interogri ce pot fi executate: GraphMatch, SPARQL
local i SPARQL la distan釘. Pentru a executa interogri trebuie s avem un obiect de
tip Query. Clasa Query are metoda Run ce primete un parametru de tip
SelectableSource (subclas a clasei StatementSource) i un parametru de tip
QueryResultSink. GraphMatch i SparqlEngine motenesc clasa Query.
   Exemplu:
  MemoryStore store = new MemoryStore(new
     RdfXmlReader("genealogy.rdf"));
  StringBuilder queryBuilder = new StringBuilder();
  queryBuilder.AppendLine(@"PREFIX
     rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>");
  queryBuilder.AppendLine(
@"PREFIX g: <http://ex.org/genealogy/>");
  queryBuilder.AppendLine(
     "SELECT * WHERE { ?women rdf:type g:Woman)");
  queryBuilder.AppendLine("?women g:hasSon 'John'}");
  SparqlEngine query = new
     SparqlEngine(sparqlQuery.toString());
  query.Run(store, new SparqlXmlQuerySink(Console.Out));
   LinqToRdf transform toate interogrile 樽n SPARQL ce pot fi executate interogri
local sau la distan釘.




6 Documenta釘ie

   Pentru un programator ce a mai utilizat LINQ (la SQL sau la colec釘ii), LinqToRdf
este mai uor de utilizat, iar interogrile sunt tranformate 樽n SPARQL de ctre
providerul LinqToRdf fr a fi necesar ca progamatorul s cunosc SPARQL.
   Cu toate acestea, consider c documenta釘ia proiectul SemWeb este mai bine
structurat i este 樽mpr釘it 樽n documenta釘ie de baz i documenta釘ie API. Un minus
care l-am sesizat la documenta釘ia LinqToRdf este faptul c unele exemple folosesc o
clas care nu mai exist (clasa Rdf), astfel unele exemple sunt incorecte. Aceast
clas a aprut 樽n versiuni anterioare ale proiectului, iar apoi a fost 樽nlocuit cu clasa
RdfContext.


7 Referin釘e

1. Pagina proiectului SemWeb, http://razor.occams.info/code/semweb/
2. LinqToRdf, http://code.google.com/p/linqtordf/
3. LINQ For Dummies, John Paul Mueller, Wiley Publishing, Inc.

More Related Content

Viewers also liked (19)

Anderson, poul william pazitorii timpului
Anderson, poul william   pazitorii timpuluiAnderson, poul william   pazitorii timpului
Anderson, poul william pazitorii timpului
liviuciubara
tarea de c#tarea de c#
tarea de c#
Victor Guevara
Cum sa vinzi software online
Cum sa vinzi software onlineCum sa vinzi software online
Cum sa vinzi software online
GECAD ePayment
Web04 Semantic Web: Managementul datelor RDF
Web04 Semantic Web: Managementul datelor RDFWeb04 Semantic Web: Managementul datelor RDF
Web04 Semantic Web: Managementul datelor RDF
Sabin Buraga
Rute cu ASP.NET MVC
Rute cu ASP.NET MVCRute cu ASP.NET MVC
Rute cu ASP.NET MVC
Enea Gabriel
C# Sharp Mapa ConceptualC# Sharp Mapa Conceptual
C# Sharp Mapa Conceptual
Fidias Alfredo
Curs c#
Curs c#Curs c#
Curs c#
liviuuba
Introducere 樽n ASP.NET MVC prin exemple
Introducere 樽n ASP.NET MVC prin exempleIntroducere 樽n ASP.NET MVC prin exemple
Introducere 樽n ASP.NET MVC prin exemple
Enea Gabriel
Ce 樽nseamn s fii dezvoltator Web
Ce 樽nseamn s fii dezvoltator WebCe 樽nseamn s fii dezvoltator Web
Ce 樽nseamn s fii dezvoltator Web
Sabin Buraga
Instrumente optice luneta ( fizica )
Instrumente optice   luneta ( fizica )Instrumente optice   luneta ( fizica )
Instrumente optice luneta ( fizica )
LUNGUFLORIN
Adn vindecare-si-iluminare
Adn vindecare-si-iluminareAdn vindecare-si-iluminare
Adn vindecare-si-iluminare
Frimu Cristian
Autoaparare psihica
Autoaparare psihicaAutoaparare psihica
Autoaparare psihica
Nicu Barbi
Alfabetul corpului-uman
Alfabetul corpului-umanAlfabetul corpului-uman
Alfabetul corpului-uman
Stenberger Ianco
David baldacci-puterea-absoluta-v1-0
David baldacci-puterea-absoluta-v1-0David baldacci-puterea-absoluta-v1-0
David baldacci-puterea-absoluta-v1-0
Nicu Barbi
Albert leprince-undele-gandului
Albert leprince-undele-ganduluiAlbert leprince-undele-gandului
Albert leprince-undele-gandului
iuliana militaru
Anderson, poul william pazitorii timpului
Anderson, poul william   pazitorii timpuluiAnderson, poul william   pazitorii timpului
Anderson, poul william pazitorii timpului
liviuciubara
tarea de c#tarea de c#
tarea de c#
Victor Guevara
Cum sa vinzi software online
Cum sa vinzi software onlineCum sa vinzi software online
Cum sa vinzi software online
GECAD ePayment
Web04 Semantic Web: Managementul datelor RDF
Web04 Semantic Web: Managementul datelor RDFWeb04 Semantic Web: Managementul datelor RDF
Web04 Semantic Web: Managementul datelor RDF
Sabin Buraga
Rute cu ASP.NET MVC
Rute cu ASP.NET MVCRute cu ASP.NET MVC
Rute cu ASP.NET MVC
Enea Gabriel
C# Sharp Mapa ConceptualC# Sharp Mapa Conceptual
C# Sharp Mapa Conceptual
Fidias Alfredo
Curs c#
Curs c#Curs c#
Curs c#
liviuuba
Introducere 樽n ASP.NET MVC prin exemple
Introducere 樽n ASP.NET MVC prin exempleIntroducere 樽n ASP.NET MVC prin exemple
Introducere 樽n ASP.NET MVC prin exemple
Enea Gabriel
Ce 樽nseamn s fii dezvoltator Web
Ce 樽nseamn s fii dezvoltator WebCe 樽nseamn s fii dezvoltator Web
Ce 樽nseamn s fii dezvoltator Web
Sabin Buraga
Instrumente optice luneta ( fizica )
Instrumente optice   luneta ( fizica )Instrumente optice   luneta ( fizica )
Instrumente optice luneta ( fizica )
LUNGUFLORIN
Adn vindecare-si-iluminare
Adn vindecare-si-iluminareAdn vindecare-si-iluminare
Adn vindecare-si-iluminare
Frimu Cristian
Autoaparare psihica
Autoaparare psihicaAutoaparare psihica
Autoaparare psihica
Nicu Barbi
Alfabetul corpului-uman
Alfabetul corpului-umanAlfabetul corpului-uman
Alfabetul corpului-uman
Stenberger Ianco
David baldacci-puterea-absoluta-v1-0
David baldacci-puterea-absoluta-v1-0David baldacci-puterea-absoluta-v1-0
David baldacci-puterea-absoluta-v1-0
Nicu Barbi
Albert leprince-undele-gandului
Albert leprince-undele-ganduluiAlbert leprince-undele-gandului
Albert leprince-undele-gandului
iuliana militaru

Similar to Procesarea Rdf in .NET (20)

Fii linked data
Fii linked dataFii linked data
Fii linked data
teodora001
Fii linked data
Fii linked dataFii linked data
Fii linked data
teodora001
WADe 2017-2018 (6/12) RDF Data Management. Accessing RDF Data via SPARQL
WADe 2017-2018 (6/12) RDF Data Management. Accessing RDF Data via SPARQLWADe 2017-2018 (6/12) RDF Data Management. Accessing RDF Data via SPARQL
WADe 2017-2018 (6/12) RDF Data Management. Accessing RDF Data via SPARQL
Sabin Buraga
WADe 20142015 (06/12): Semantic WebManagementul datelor RDF. Interogarea da...
WADe 20142015 (06/12): Semantic WebManagementul datelor RDF. Interogarea da...WADe 20142015 (06/12): Semantic WebManagementul datelor RDF. Interogarea da...
WADe 20142015 (06/12): Semantic WebManagementul datelor RDF. Interogarea da...
Sabin Buraga
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
Sabin Buraga
Dezvoltarea Aplicatiilor Web
Dezvoltarea Aplicatiilor WebDezvoltarea Aplicatiilor Web
Dezvoltarea Aplicatiilor Web
danielnastase
Fundamentele Limbajului Java
Fundamentele Limbajului JavaFundamentele Limbajului Java
Fundamentele Limbajului Java
colaru
Biblioteci JavaScript pentru Ajax.pptx
Biblioteci JavaScript pentru Ajax.pptxBiblioteci JavaScript pentru Ajax.pptx
Biblioteci JavaScript pentru Ajax.pptx
Costea112
Tema10 iliuta-stoica-ontologies-web-semantics
Tema10 iliuta-stoica-ontologies-web-semanticsTema10 iliuta-stoica-ontologies-web-semantics
Tema10 iliuta-stoica-ontologies-web-semantics
Iliuta Stoica
Interconectarea Semantica A Datelor In Contextul Managementului Informatiilor...
Interconectarea Semantica A Datelor In Contextul Managementului Informatiilor...Interconectarea Semantica A Datelor In Contextul Managementului Informatiilor...
Interconectarea Semantica A Datelor In Contextul Managementului Informatiilor...
Ecaterina Moraru (Valica)
WADe 2017-2018 (10/12) Specifying Ontologies via OWL 2. Description Logics. R...
WADe 2017-2018 (10/12) Specifying Ontologies via OWL 2. Description Logics. R...WADe 2017-2018 (10/12) Specifying Ontologies via OWL 2. Description Logics. R...
WADe 2017-2018 (10/12) Specifying Ontologies via OWL 2. Description Logics. R...
Sabin Buraga
Fii linked data
Fii linked dataFii linked data
Fii linked data
teodora001
Fii linked data
Fii linked dataFii linked data
Fii linked data
teodora001
WADe 2017-2018 (6/12) RDF Data Management. Accessing RDF Data via SPARQL
WADe 2017-2018 (6/12) RDF Data Management. Accessing RDF Data via SPARQLWADe 2017-2018 (6/12) RDF Data Management. Accessing RDF Data via SPARQL
WADe 2017-2018 (6/12) RDF Data Management. Accessing RDF Data via SPARQL
Sabin Buraga
WADe 20142015 (06/12): Semantic WebManagementul datelor RDF. Interogarea da...
WADe 20142015 (06/12): Semantic WebManagementul datelor RDF. Interogarea da...WADe 20142015 (06/12): Semantic WebManagementul datelor RDF. Interogarea da...
WADe 20142015 (06/12): Semantic WebManagementul datelor RDF. Interogarea da...
Sabin Buraga
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
Sabin Buraga
Dezvoltarea Aplicatiilor Web
Dezvoltarea Aplicatiilor WebDezvoltarea Aplicatiilor Web
Dezvoltarea Aplicatiilor Web
danielnastase
Fundamentele Limbajului Java
Fundamentele Limbajului JavaFundamentele Limbajului Java
Fundamentele Limbajului Java
colaru
Biblioteci JavaScript pentru Ajax.pptx
Biblioteci JavaScript pentru Ajax.pptxBiblioteci JavaScript pentru Ajax.pptx
Biblioteci JavaScript pentru Ajax.pptx
Costea112
Tema10 iliuta-stoica-ontologies-web-semantics
Tema10 iliuta-stoica-ontologies-web-semanticsTema10 iliuta-stoica-ontologies-web-semantics
Tema10 iliuta-stoica-ontologies-web-semantics
Iliuta Stoica
Interconectarea Semantica A Datelor In Contextul Managementului Informatiilor...
Interconectarea Semantica A Datelor In Contextul Managementului Informatiilor...Interconectarea Semantica A Datelor In Contextul Managementului Informatiilor...
Interconectarea Semantica A Datelor In Contextul Managementului Informatiilor...
Ecaterina Moraru (Valica)
WADe 2017-2018 (10/12) Specifying Ontologies via OWL 2. Description Logics. R...
WADe 2017-2018 (10/12) Specifying Ontologies via OWL 2. Description Logics. R...WADe 2017-2018 (10/12) Specifying Ontologies via OWL 2. Description Logics. R...
WADe 2017-2018 (10/12) Specifying Ontologies via OWL 2. Description Logics. R...
Sabin Buraga

Procesarea Rdf in .NET

  • 1. Studiu comparativ a librriilor de procesare a documentelor RDF Antochi Anca Mihaela aantochi@infoiasi.ro Abstract. Acest document este un studiu comparativ 樽ntre librriile SemWeb i LinqToRdf de procesare RDF. Sunt comparate metodele de citire i de scriere a fiierelor RDF cu ajutorul celor dou librrii, suportul pentru triple i posibilitatea de interogare. Keywords: RDF, SPARQL, .NET, C#, LINQ 1 Introducere n 樽ncercarea de a gsi librrii de procesare RDF pentru framework-ul .Net am observat c interesul dezvoltatorilor .Net este sczut, iar librriile care au fost dezvoltate nu au mai fost actualizate de un timp 樽ndelungat. API-ul SemWeb a fost dezvoltat de ctre Joshua Tauberer i prima versiune a aprut 樽n anul 2005. Librria a fost scris 樽n C# pentru versiunile 1.1 i 2.0 ale limbajului. Pe data de 19 mai 2009 Joshua Tauberer a anun釘at ca renun釘 la acest proiect din cauza interesului sczut pentru semantic Web a programatorilor .Net1. Proiectul LinqToRdf este un provider pentru LINQ, ce transform interogrile din C# 樽n SPARQL i are ca autor pe Andrew Matthews. n LinqToRdf este folosit librria SemWeb dezvoltat de Joshua Tauberer. Se pare c nici LinqToRdf nu a mai fost actualizat i ultima versiune a aprut 樽n august 2008. Codul surs i librriile pentru SemWeb sunt disponibile la http://razor.occams.info/code/semweb/. La aceeai adres se gsesc documenta釘ie i exemple. Licen釘a SemWeb este 樽n termenii GNU GPL i Creative Commons Attribution. n proiect sunt folosite i librrii externe: SPARQL engine cu licen釘 GNU LGPL, mecanism de validare Euler sub licen釘 W3C Software Licence i IKVM care este compatibil GPL. LinqToRdf poate fi descrcat de la adresa http://code.google.com/p/linqtordf/ sub forma unui fiier msi ce instaleaz librriile necesare i tot la aceast adres se gsesc documenta釘ia i exemplele. Codul surs se gsete la http://linqtordf.googlecode.com/ svn/trunk/src/linqtordf. LinqToRdf se afl sub licen釘 BSD. 1 Anun釘ul lui Joshua Tauberer gsit la adresa http://razor.occams.info/code/semweb/
  • 2. 2 Suport pentru triple n proiectul SemWeb triplele din RDF sunt reprezentate de structura Statement. Spre deosebire de specifica釘iile RDF 樽n care triplele sunt construite din subiect, predicat i obiect, 樽n Statement exist i un c但mp meta. Astfel a putea spune c specifica釘iile nu au fost 樽ntocmai respectate i a fost ad ugat meta care este specific proiectului SemWeb, dar folosirea lui este op釘ional. La baza ierarhiei de clase pentru a reprezenta componentele unei triple se afl clasa abstract Resource. Subiectul poate fi, conform specifica釘iilor, referin釘 URI sau nod gol. Acestea sunt reprezentate 樽n SemWeb de clasele Entity i BNode. Entity este subclas direct a clasei Resource, iar BNode motenete Entity. Predicatul poate fi de tip referin釘 URI i, dupa cum am vazut mai sus, este reprezentat de clasa Entity. Obiectul, pe l但ng referin釘 URI i nod gol, mai poate fi i literal, care este reprezentat de clasa Literal, subclas a clase Resource. Se poate vedea 樽n figura de mai jos ierarhia acestor clase:
  • 3. Dup cum putem vedea 樽n diagram, exist o clas Variable ce poate fi utilizat la interogri i reprezint o variabil 樽n interogare. Exemplu de creare a unei triple: Statement triple = new Statement( new Entity("http://www.example.org/Maria"), new Entity("http://www.example.org/hasMother"), new Literal("Alina") ); Op釘ional, un literal poate avea tag de limb sau tipul datei. Tag-ul de limb i tipul se transmit ca parametrii la instan釘ierea clasei Literal, dar cu restric釘ia de a fi transmis doar unul dintre cei doi parametrii: new Literal("12", null, XSDNS + "#integer"); new Literal("Alina", "ro_RO", null); LinqToRdf foloeste librria SemWeb, la care aduga suport pentru LINQ. Nu exist 樽n acest proiect clase ce corespund triplelor din RDF i a componentelor din triple (subiect, predicat i obiect). Modul de scriere a interogarilor este foarte asemntor cu alte tipuri de interogri LINQ (LINQ la SQL sau LINQ la colec釘ii). Pentru a crea fiiere RDF i pentru interograrea acestora este necesar s mapm triplele din RDF la clase C# cu ajutorul atributelor OwlResource. Maparea se poate face manual prin crearea claselor necesare cu attribute sau se pot genera clasele pornind de la o ontologie cu ajutorul uneltei RdfMetal ce este descrcat 樽mpreun cu LinqToRdf. Exemplu: [OwlResource(OntologyName="Genealogy", RelativeUriReference="Person")] public class Person : OwlInstanceSupertype { [OwlResource(OntologyName = "Genealogy", RelativeUriReference = "name")] public string Name { get; set; } [OwlResource(OntologyName = "Genealogy", RelativeUriReference="age")] public string Age { get; set;} } 3 Citirea fiierelor RDF Pentru procesarea unui set de triple (obiecte de tip Statement) trebuie s avem o clas ce implementeaz interfa釘a StatementSink ce con釘ine o singur metod cu semntura: public bool Add(Statement statement);
  • 4. Autorul proiectului nu respect aici conven釘ia de nume din C# dup care ar fi trebuit s numeasc aceast interfa釘 IStatementSink. De asemenea este necesar o clas ce implementeaz interfa釘a StatementSource ce are o singur metod cu semntura: public void Select(StatementSink) Clasele ce implementeaz interfa釘a StatementSource reprezint o surs de obiecte Statement. Clasa abstract RdfReader implementeaz interfa釘a StatementSource, iar la r但ndul ei este motenit de clasele RdfXmlReader i N3Reader. O clas ce implementeaz ambele interfe釘e de mai sus este MemoryStore, ce re釘ine triplele 樽n memorie. n exemplul urmtor se citete dintr-un RDF i triplele se re釘in 樽n MemoryStore: MemoryStore store = new MemoryStore(); using (RdfReader reader = new RdfXmlReader("Test.rdf")) { reader.Select(store); } n LinqToRdf pentru a citi dintr-un fiier RDF trebuie mai int但i s mapm datele din fiier la clase C#. De asemenea este nevoie de o clas de tip TripleStore pentru a specifica loca釘ia triplelor i tipul de interogare. Exemplu: TripleStore store = new TripleStore(@"http://localhost/genealogy/Family.aspx"); store.QueryType = QueryType.RemoteSparqlStore; RdfDataContext context = new RdfDataContext(store); var result = select parent in context.ForType<Parent>() where parent.Name = Mary select {parent.Name, parent.Age}; Observm ca in LinqToRdf nu sunt 樽ntoarse triple ca urmare a citirii, ci obiecte de tipul claselor ce au fost mapate la datele din RDF. De asemenea citirea se face ca o interograe SPARQL, deoarece la execu釘ie interogarea de mai sus este transformat in SPARQL. Asemnarea este foarte mare cu o interogare de tip Linq to SQL, doar maparea datelor fiind diferit. 4 Creare de fiiere RDF Scriere 樽n fiiere RDF se face 樽n SemWeb cu ajutorul clasei abstracte RdfWriter ce este extins de ctre clasele XmlTextWriter i N3Writer. RdfWriter implementeaz interfa釘a StatementSink. Astfel putem apela metoda Add pentru a aduga c但te o tripl sau metoda Write ce primete ca parametru un obiect de tip StatementSource. Exemplu: MemoryStore store = new MemoryStore(); Entity subject = new Entity("http://ex.org/Mary");
  • 5. Entity property = "http://ex.org/hasSon"; Literal obj = new Literal("John", "en_US", null); store.Add(new Statement(subject, property, obj)); XmlTextWriter xmlWriter = null; try { xmlWriter = new XmlTextWriter("Test.rdf",Encoding.UTF8); using (RdfWriter writer = new RdfXmlWriter(xmlWriter)) { writer.Namespaces.AddNamespace( "http://ex.org/", "ex"); writer.Write(store); } } catch (Exception ex) { Trace.TraceError(ex.Message); } finally { if (xmlWriter != null) xmlWriter.Close(); } Proiectul LinqToRdf con釘ine i un designer grafic ce se integreaz 樽n Visual Studio (versiunea 2008 sau urmtoare). Folosind acest designer este foarte simplu pentru a crea ontologii i clasele C# ce sunt mapate la aceste ontologii. LinqToRdfDesigner creaz ontologiile 樽n format N3 i autorul proiectului precizeaz 樽n documenta釘ie c acest designer este suficient pentru ontologii simple, dar pentru a crea ontologii complexe sau 樽n alte formate dec但t N3 am putea considera Protg. 5 Interogri SPARQL n SemWeb exist 3 tipuri de interogri ce pot fi executate: GraphMatch, SPARQL local i SPARQL la distan釘. Pentru a executa interogri trebuie s avem un obiect de tip Query. Clasa Query are metoda Run ce primete un parametru de tip SelectableSource (subclas a clasei StatementSource) i un parametru de tip QueryResultSink. GraphMatch i SparqlEngine motenesc clasa Query. Exemplu: MemoryStore store = new MemoryStore(new RdfXmlReader("genealogy.rdf")); StringBuilder queryBuilder = new StringBuilder(); queryBuilder.AppendLine(@"PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>"); queryBuilder.AppendLine(
  • 6. @"PREFIX g: <http://ex.org/genealogy/>"); queryBuilder.AppendLine( "SELECT * WHERE { ?women rdf:type g:Woman)"); queryBuilder.AppendLine("?women g:hasSon 'John'}"); SparqlEngine query = new SparqlEngine(sparqlQuery.toString()); query.Run(store, new SparqlXmlQuerySink(Console.Out)); LinqToRdf transform toate interogrile 樽n SPARQL ce pot fi executate interogri local sau la distan釘. 6 Documenta釘ie Pentru un programator ce a mai utilizat LINQ (la SQL sau la colec釘ii), LinqToRdf este mai uor de utilizat, iar interogrile sunt tranformate 樽n SPARQL de ctre providerul LinqToRdf fr a fi necesar ca progamatorul s cunosc SPARQL. Cu toate acestea, consider c documenta釘ia proiectul SemWeb este mai bine structurat i este 樽mpr釘it 樽n documenta釘ie de baz i documenta釘ie API. Un minus care l-am sesizat la documenta釘ia LinqToRdf este faptul c unele exemple folosesc o clas care nu mai exist (clasa Rdf), astfel unele exemple sunt incorecte. Aceast clas a aprut 樽n versiuni anterioare ale proiectului, iar apoi a fost 樽nlocuit cu clasa RdfContext. 7 Referin釘e 1. Pagina proiectului SemWeb, http://razor.occams.info/code/semweb/ 2. LinqToRdf, http://code.google.com/p/linqtordf/ 3. LINQ For Dummies, John Paul Mueller, Wiley Publishing, Inc.