diSparql

14
diSPARQL Alexandra-Elena IACOB Universitatea ”A.I.Cuza”, Facultatea de Informatic˘ a, Ia¸ si

Transcript of diSparql

Page 1: diSparql

diSPARQL

Alexandra-Elena IACOB

Universitatea ”A.I.Cuza”, Facultatea de Informatica, Iasi

Page 2: diSparql

Cuprins

diSPARQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Alexandra-Elena IACOB

1 Tehnologii - Scurta prezentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.1 RDF si RDFa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2 SPARQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Biblioteca SemWeb. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1 Generalitati[1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.2 Utilizare ın cadrul proiectului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3 Aplicatia diSPARQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3.1 Biblioteca Crawler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3.2 Cautare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.3 Interogare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.4 Pinging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

4 Directii de dezvoltare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Page 3: diSparql

3

Abstract. Lucrarea de fata ısi propune sa ofere o vedere de ansam-blu asupra unor domenii de interes precum RDF(Resource DescriptionFramework), RDFa, SPARQL. Va fi prezentata si libraria SemWeb careofera un API pentru lucrul cu RDF din aplicatii .NET. Ca studiu decaz se ofera o aplicatie intitulata diSPARQL care alcatuieste cu ajutorulunui crawler o lista de puncte terminale SPARQL. Acestea vor putea fiinterogate pentru obtinerea unor informatii de interes, sau se va puteaafla starea unui punct terminal (daca poate raspunde cererilor de in-terogare).

1 Tehnologii - Scurta prezentare

1.1 RDF si RDFa

RDF reprezinta un cadru abstract de descriere a resurselor de interes ın even-tualitatea interogarii ulterioare a informatiilor. Aceasta abordare a Web-uluisemantic priveste informatiile existente ca o baza de date. Informatiile stocateRDF sunt specificate sub forma unor triple (Subiect, Predicat, Obiect). Subiectuldenota resursa, Predicatul denota o anumita ınsusire a Subiectului, si definesterelatia pe care o are Subiectului cu Obiectul. O colectie de triple poate fi privitaca fiind un graf orientat, ın care Subiectul si Obiectul sunt noduri, iar Predi-catul reprezinta muchia dintre cele doua directionata de la Subiect la Obiect.Fiecare valoare din triplu are la baza un URI (Uniform Resource Identifier) careidentifica unic o resursa.

RDFa reprezinta o recomandare W3C pentru adnotarea elementelor prezenteıntr-o pagina web. Adnotarea se face prin adagarea de atribute (about, rel,href property, content, datatype, typeof ) elementelor XHTML existente. Ben-eficiul adus de RDFa este faptul ca datele existente ıntr-o pagina web vor puteastoca metadate care pot fi ulterior descoperite de utilizatori. Cu ajutorul acestoratribute se pot forma triple RDF care vor contine informatie reutilizabila.

<div xmlns:dc="http://purl.org/dc/elements/1.1/"

about="http://students.info.uaic.ro/~elena.carjan/WADE/proiect.pdf">

<span property="dc:title">diSparql</span>

<span property="dc:creator">Alexandra Iacob</span>

<span property="dc:date">01-19-2011</span>

</div>

1.2 SPARQL

SPARQL reprezinta un limbaj de interogare asemanator SQL-ul recomandat deConsortiul W3 din 2008. O interogare SPARQL este compusa din variabile cesunt legate de o anumita parte componenta a unui triplu (sunt precedate desemnul ’?’), constrangeri (utilizarea cuvantului rezervat FILTER) si alte regulide modelare. Un beneficiu al acestui limbaj de interogare ıl reprezinta faptul cautilizatorul va scrie o interogare neambigua.

Page 4: diSparql

4

2 Biblioteca SemWeb

2.1 Generalitati[1]

SemWeb este o biblioteca .NET care permite lucrul cu date stocate ın modelRDF. Ofera mai multe clase de citire, scriere, manipulare si interogare RDF. Nuofera suport pentru ontologii OWL.

Clasele cele mai importante ale bibliotecii se gasesc ın spatiul de numeSemWeb. Acestea sunt ın numar de 4 si anume: Resource, Statement, State-mentSource, StatementSink.

Clasa Resource este abstracta si ofera suport pentru termenii triplelor RDF.Resource are doua subclase Entity si Literal. Subiectul si Obiectul dintr-un tripluRDF pot fi exprimati folosind clasa Entity. Nodurile blank pot fi utilizate cuajutorul clasei BNode care este o subclasa a clasei Entity. Predicatul dintr-untriplu RDF poate fi exprimat cu ajutorul clasei Literal.

Structura Statement reprezinta o propozitie RDF. Statement este de fapt ostructura si nu o clasa din motive de scalabilitate, o aplicatie lucrand cu un numaridicat de triple. Acest struct este compus din urmatoarele campuri Subject - detipul Entity, Predicate de tipul Entity si Object care poate fi Resource.

Cu alte cuvinte construirea unui triplu va arata astfel:

new Statement(

new Entity("http://www.example.org/SemWeb"),

new Entity("http://www.example.org/hasName"),

new Literal("My Semantic Web library!") );

sau

new Statement(

new Entity("http://www.example.org/SemWeb"),

new Entity("http://www.example.org/relatedTo"),

new BNode() );

care foloseste nodul vid.Cand se construieste un obiect de tipul Entity nu are loc nici o validare a

URI-ului folosit ın constructor. Validarea trebuie facuta de utilizator.Interfata StatementSource reprezinta o colectie de Statement. Este imple-

mentata de clase precum RdfXmlReader si N3Reader care folosesc anumite for-mate pentru a stoca informatiile. Metoda cea mai importanta a acestei interfeteo reprezinta Select.

Interfata StatementSink este folosita pentru procesarea unui set de State-ment. Este implementata de clase precum RdfXmlWriter si N3Writer. In mo-mentul implementarii acestei interfete trebuie suprascrisa metoda Add, ın careutilizatorul poate opta sa retina instantele de tip Statement ıntr-un ArrayListsau poate sa proceseze fiecare instanta ın parte la momentul adagarii.

O alta clasa importanta a acestei biblioteci o reprezinta MemoryStore. Labaza poate fi privit ca fiind un ArrayList de instante Statement. Aceasta im-plementeaza atat StatementSource cat si StatementSink, ceea ce permite apelul

Page 5: diSparql

5

metodei Add, dar si Select. Deoarece implementeaza si IEnumerable aceasta clasaeste folosita pentru iteratie prin Statement-urile care ne intereseaza.

MemoryStore ms = new MemoryStore();

datasource.Select(ms);

foreach (Statement stmt in ms)

Console.WriteLine(stmt);

2.2 Utilizare ın cadrul proiectului

Biblioteca SemWeb ofera suport pentru a interoga prin HTTP puncte terminaleSPARQL. Clasa utilizata ın cadrul proiectului este SparqlHttpSource.

SparqlXmlQuerySink xml = new SparqlXmlQuerySink(Console.Out);

SparqlHttpSource source = new SparqlHttpSource("http://DBpedia.org/sparql");

source.RunSparqlQuery("SELECT * WHERE { ?s ?p ?w . }", Console.Out);

source.RunSparqlQuery("SELECT * WHERE { ?s ?p ?r . }", xml);

3 Aplicatia diSPARQL

Cerintele de dezvoltare ale acestui proiect sunt urmatoarele: Sa se realizezeun set de servicii Web care ofer posibilitatea descoperirii de puncte-terminaleSPARQL, eventual pe baza unui crawler. Datele descoperite vor putea fi in-terogate via SPARQL, iar documentele HTML generate vor include constructiiRDFa modeland resursele de interes. De asemenea, se va implementa un serviciude pinging util pentru testarea faptului ca un punct terminal SPARQL mai esteoperational. Se vor preveni posibilele atacuri ce pot surveni.

Aplicatia a fost dezvoltata folosind limbajul de programare C# si s-a recursla servicii web ın ASP.NET. Implementarea ofera 2 servicii web fiecare avandmai multe metode de interes.

Serviciul de catare are ca scop identificarea punctelor terminale SPARQL.Acest lucru este realizat cu ajutorul unui crawler care va primi ca seed-uri link-urile paginilor de catare de la Bing si Google. Apoi va retine toate elementelede tip ¡a¿ mai exact atributul href din pagina respectiva. Lista obtinuta vadeveni lista cu seed-uri pentru urmatoarea parcurgere a algoritmului urmarindu-se sa se atinga adancimea dorita ın momentul rularii. Pentru fiecare pagina nouadescoperita se va ıncerca sa se ruleze o interogare SPARQL (folosind bibliotecaSemWeb prezentata anterior), cunoscandu-se astfel daca pagina este un punctterminal SPARQL sau nu.

Serviciul de interogare are ca scop verificarea starii unui punct terminalSPARQL, dar si rularea unei interogarii SPARQL pe un anumit punct terminal.Aceste actiuni sunt ındeplinite tot folosindu-se biblioteca SemWeb.

3.1 Biblioteca Crawler

Totalitatea claselor care sunt necesare crearii serviciilor web mentionate mai susse afla ın aceasta biblioteca. Biblioteca este adagata ca referinta locala ın cadrulproiectului aplicatiei Web care implementeaza serviciile.

Page 6: diSparql

6

Csv Parser Aceasta clasa are ca functionalitate salvarea unei instante Hashtableıntr-un fisier format Comma Separated Values. Ofera 2 proceduri: LoadFromFilerespectiv SaveToFile.

Html Parser[2] Acest fisier ofera 2 clase: Html Tag si Html Parser. Cea de-adoua va fi folosita pentru a parsa continutul unei pagini web. Html Tag reprezintaun element HTML si are ca membru un obiect de tipul Dictionary cu douacampuri de tip String - aici vor fi memorate toate atributele pe care le va gasiparserul. Html Parser

Site Crawler Clasa Site Crawler are mai multe metode interesante pentruaplicatia de fata.

– String DownloadPage(String url) Este folosita clasa WebRequest pentruaccesarea unei anumite pagini cu o anumita adresa. Fiecarei pagini i se vaciti codul sursa acesta fiind returnat din metoda.

WebRequest wrGETURL;

wrGETURL = WebRequest.Create(url);

wrGETURL.Method = "GET";

WebResponse myResponse = wrGETURL.GetResponse();

StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);

string result = sr.ReadToEnd();

sr.Close();

myResponse.Close();

return result;

– Hashtable GetListOfLinks(String page) Avand ca parametru de in-trare sirul de caractere ce reprezinta ıntrega pagina, aceasta metoda va folosimetoda ParseTag din cadrul clasei Html Parser pentru a obtine o lista com-pleta a legaturilor existente. In cadrul acestei metode este facuta o optimizareın ceea ce priveste numarul de legaturi pe care le-am putea gasi ın interiorulpaginii. Sunt luate ın considerare doar legaturile a caror element href ıncepecu sirul de caractere http.O alta ımbunatatire adusa acestei metode este folosirea unei instante a claseiHashtable. Paginile retinute vor fi unice. Daca ın elementul HTML este oferitsi atributul name atunci acesta va fi folosit drept cheie ın momentul adaugariiın Hashtable, altfel folosindu-se tot elementul href.

while (parse.ParseNext("a", out tag))

{

string href, name;

tag.Attributes.TryGetValue("href", out href);

tag.Attributes.TryGetValue("name", out name);

Page 7: diSparql

7

if (href != null && href.StartsWith("http"))

{

if (name == null)

name = href;

try

{

res.Add(name, href);

}

catch (System.ArgumentException)

{

//Console.WriteLine("Item already added");

}

}

– bool IsEndpoint(String url) Metoda returneaza valoarea true daca laadresa oferita ca parametru se gaseste un punct terminal SPARQL. Estefolosita libraria SemWeb[1]. Se va cauta sa se trateze cazurile de exceptie -ın eventualitatea ın care adresa nu reprezinta un punct terminal valid atuncise va arunca exceptia System.net.WebException.

try{

SparqlHttpSource source = new SparqlHttpSource(url);

diSparqlResultSink sink = new diSparqlResultSink();

source.RunSparqlQuery("SELECT * WHERE { ?s ?p ?q. } LIMIT 1", sink);

result = sink.resultsCounter > 0;

}

catch (System.Net.WebException)

{}

return result;

In aceasta secventa de cod s-a folosit o clasa noua: diSparqlResultSink. Aceastaclasa a fost creata pentru a oferi siguranta faptului ca interogarea s-a exe-cutat si a returnat cel putin un rezultat. Aceasta clasa implementeaza clasaabstracta oferita de SemWeb si anume QueryResultSink, si suprascrie metodade Add care este apelata de fiecare data cand se obtine un nou triplu ın urmainterogarii unui punct terminal SPARQL. La fiecare apel al metodei se vaincrementa un contor, iar ın momentul finalizarii executiei se va sti numarulfinal de ınregistrari gasite.

public class diSparqlResultSink : QueryResultSink

{

public Int32 resultsCounter = 0;

public override bool Add(VariableBindings result)

{

foreach (Variable var in result.Variables)

{

if (var.LocalName != null && result[var] != null)

Page 8: diSparql

8

{

resultsCounter++;

}

}

return true;

}

}

– void FindPoints(int depth) Metoda are la baza algoritmul de functionareal unui crawler. Acesta primeste 2 pagini de start. In urma parsarii paginilorrespective va obtine o noua lista de legaturi. Paginile din aceasta lista vorfi trecute prin metoda IsEndpoint, daca raspunsul este da, atunci aceastapagina va fi adaugata ın lista de puncte terminale SPARQL, altfel va fiadaugata ın lista cu pagini de cautat mai departe. In functie de adancimeasetata algoritmul descris pentru un nivel va fi aplicat pentru celelalte nivele.Numarul de pagini gasite la nivelul al 3-lea a fost de 30000 de pagini, dincare ın jur de 25 de puncte terminale SPARQL.

Int32 currentDepth = 0;

Hashtable current = this._pages;

while (currentDepth < this._depth)

{

Console.WriteLine("Current depth: " + currentDepth);

currentDepth += 1;

Hashtable newList = new Hashtable();

foreach (DictionaryEntry page in current)

{

if (IsEndPoint(page.Value.ToString()) == false

{

Hashtable list = GetListOfLinks(page.Value.ToString());

Console.WriteLine("foreach page not endpoint: " + list.Count);

foreach (DictionaryEntry mem in list)

{

try

{

newList.Add(mem.Key, mem.Value);

}

catch (System.ArgumentException)

{

Console.WriteLine("Item already added");

}

}

}

else

{

try

{

Page 9: diSparql

9

this._sparql.Add(page.Key, page.Value);

Console.WriteLine("Adding endpoint: " + page.Value);

}

catch (System.ArgumentException)

{

}

}

}

current.Clear();

Console.WriteLine(newList.Count)

foreach (DictionaryEntry val in newList)

{

current.Add(val.Key, val.Value);

}

Console.WriteLine(current.Count);

foreach (DictionaryEntry mem in newList)

{

try

{

this._pages.Add(mem.Key, mem.Value);

}

catch (System.ArgumentException)

{

//Console.WriteLine("Item already added");

}

}

newList.Clear();

Console.WriteLine();

}

– LoadFromCSV si SaveToCSV Metodele vor fi folosite pentru pastrareapunctele descoperite la un moment dat ıntr-un fisier ın format Comma Sep-arated Values.

Interogate Clasa Interogate ofera metoda cea mai importanta a aplicatiei sianume aceea ın care se va rula o interogare la adresa indicata. Datele obtinuteın format XML vor fi procesate si transformate ıntr-un tabel HTML a caruielemente vor fi adnotate RDFa. Raspunsul obtinut ın urma unei interogari oferainformatii relevante cu privire la ce coloane sunt returnate (daca privim RDF-ulca o tabela, iar SPARQL ca SQL), si informatiile ın sine. Raspunsul obtinut cuajutorul librariei arata astfel:

<sparql xmlns="http://www.w3.org/2005/sparql-results#">

<head>

<variable name="bill" />

Page 10: diSparql

10

<variable name="person" />

<variable name="name" />

</head>

<results ordered="false" distinct="false">

<result>

<binding name="bill">

<uri>tag:govshare.info,2005:data/us/congress/108/bills/s1024</uri>

</binding>

<binding name="person">

<uri>tag:govshare.info,2005:data/us/congress/people/C001041</uri>

</binding>

<binding name="name">

<literal>Hillary Clinton</literal>

</binding>

</result>

<result>

<binding name="bill">

<uri>tag:govshare.info,2005:data/us/congress/108/bills/s1024</uri>

</binding>

<binding name="person">

<uri>tag:govshare.info,2005:data/us/congress/people/C000880</uri>

</binding>

<binding name="name">

<literal>Michael Crapo</literal>

</binding>

</result>

<result>

<binding name="bill">

<uri>tag:govshare.info,2005:data/us/congress/108/bills/s1024</uri>

</binding>

<binding name="person">

<uri>tag:govshare.info,2005:data/us/congress/people/L000174</uri>

</binding>

<binding name="name">

<literal>Patrick Leahy</literal>

</binding>

</result>

</results>

</sparql>

Dupa adnotarile RDFa un XML rezultat ın urma unei interogari ın punctulterminal SPARQL oferit de dpbedia, asemanator XML-ului de mai sus, va arataastfel:

<table xmlns:rdf="http://purl.org/dc/terms/"

xmlns:ale="http://localhost"

about="SELECT * WHERE { ?x ?y ?z. } LIMIT 1">

Page 11: diSparql

11

<tr>

<th property="rdf:identifier">x</th>

<th property="rdf:identifier">y</th>

<th property="rdf:identifier">z</th>

</tr>

<tr about="ale:row0>

<td property="ale:x"

resource="http://dbpedia.org/resource/Elizabeth_Peabody__Teacher">

http://dbpedia.org/resource/Elizabeth_Peabody__Teacher

</td>

<td property="ale:y"

resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#type">

http://www.w3.org/1999/02/22-rdf-syntax-ns#type

</td>

<td property="ale:z"

resource="http://www.w3.org/2002/07/owl#Thing">

http://www.w3.org/2002/07/owl#Thing

</td>

</tr>

</table>

3.2 Cautare

Serviciul de catare foloseste clasa Site Crawler pentru a parcurge mai multepagini ın cautare de noi legaturi.

Fig. 1. Serviciul de search

Page 12: diSparql

12

[WebMethod]

public String FindEndPoints(Int32 depth)

{

String path = Server.MapPath("~\\Files\\Endpoints.txt") ;

Site_Crawler sc = new Site_Crawler(depth, path);

sc.FindPoints();

sc.SaveToCSV();

Hashtable ht = new Hashtable();

ht = sc.Sparql();

String str = "";

foreach (DictionaryEntry de in ht)

{

str += de.Value.ToString() + "\n";

}

return str;

}

3.3 Interogare

Serviciul de interogare foloseste clasa Interogate pentru a obtine rezultatul uneiinterogari SPARQL. Asteapta ca parametri de intrare adresa la care se gasestepunctul terminal SPAQRL si interogarea care se doreste a fi executata.

[WebMethod]

public String OneQuery(String url, String select)

{

String result = "";

Hashtable ht = new Hashtable();

SparqlQuery sq = new SparqlQuery(ht, select);

result = sq.RunSparql(url);

return result;

}

3.4 Pinging

Serviciul de pinging foloseste aceeasi clasa ca mai sus, avand ca parametru deintrare doar adresa la care se gaseste punctul terminal SPARQL.

[WebMethod]

public String IsUp(String url)

{

String result = "";

String select = "SELECT * WHERE { ?x ?q ?z . } LIMIT 1";

SparqlQuery sq = new SparqlQuery(new Hashtable(), select);

try

{

Page 13: diSparql

13

Fig. 2. Serviciul de query

String response = sq.RunSparql(url);

result = "OK";

}

catch (System.Net.WebException)

{

result = "FAILED";

}

return result;

}

4 Directii de dezvoltare

Algoritmul de descoperire a punctelor terminale SPARQL poate fi ımbunatatitprin utilizarea unor algoritmi de calcul paralel. Timpul de executie al algorit-mului ın cazul ın care adancimea depaseste numarul 7 nu poate fi aproximat.Nu exista nici o rulare a aplicatiei ın conditii de acest tip. O alta ımbunatatirece poate fi adusa proiectul o poate reprezinta o aplicatie web care sa reuneascatoate serviciile prezentate ın aceasta lucrare.

Page 14: diSparql

14

Fig. 3. Serviciul de pinging si rezultat

References

1. SemWeb http://razor.occams.info/code/semweb/2. Jonathan Wood, ”Parsing HTML Tags in C#” 2010 (articolul se poate gasi la adresa

http://www.codeproject.com/Articles/57176/Parsing-HTML-Tags-in-Csharp.aspx)