Transcript
Page 1: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

3rd Status report of degree project

Integrating SWI-Prolog for semantic reasoning in Bioclipse

Samuel Lampa, 2010-04-07Project blog: http://saml.rilspace.com

3rd Status report of degree project

Integrating SWI-Prolog for semantic reasoning in Bioclipse

Samuel Lampa, 2010-04-07Project blog: http://saml.rilspace.com

Page 2: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

How do biochemical questions

formulated as Prolog queries

compare to other solutions

available in Bioclipse in terms of

speed and expressiveness?

Research questionResearch question

Page 3: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

● Jena● General RDF querying (via SPARQL)

● Pellet● OWL-DL Reasoning (via SPARQL)

● General querying via Jena (via SPARQL)

● SWI-Prolog● Access to RDF triples (both assertion and querying) via the

rdf( Subject, Predicate, Object ) method● Complex wrapper/convenience methods can be built

Compared Semantic ToolsCompared Semantic Tools

Page 4: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

Interesting use case: Querying NMRShiftDB data● Characteristics:

–Rather shallow RDF graph–Numeric (float value) interval

matching

Use Case: NMRShiftDBUse Case: NMRShiftDB

Page 5: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

NMR Spectrum Similarity SearchNMR Spectrum Similarity Search

What to test: Given a spectrum, represented as a list of shift values, find spectra with the same shifts, (allowing variation within a limit).

“→ Dereferencing” spectra

Shift

Intensity

Page 6: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

<http://pele.farmbio.uu.se/nmrshiftdb/?moleculeId=234>

:hasSpectrum <http://pele.farmbio.uu.se/nmrshiftdb/?spectrumId=4735>;

:moleculeId "234".

<http://pele.farmbio.uu.se/nmrshiftdb/?spectrumId=4735>

:hasPeak <http://pele.farmbio.uu.se/nmrshiftdb/?s4735p0>,

<http://pele.farmbio.uu.se/nmrshiftdb/?s4735p1>,

<http://pele.farmbio.uu.se/nmrshiftdb/?s4735p2>,

<http://pele.farmbio.uu.se/nmrshiftdb/?s4735p0>

:hasShift "17.6"^^xsd:decimal .

<http://pele.farmbio.uu.se/nmrshiftdb/?s4735p1>

:hasShift "18.3"^^xsd:decimal .

<http://pele.farmbio.uu.se/nmrshiftdb/?s4735p2>

:hasShift "22.6"^^xsd:decimal .

Example DataExample Data

Page 7: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

% Register RDF namespaces, for use in the convenience methods at the end

:- rdf_register_ns(nmr, 'http://www.nmrshiftdb.org/onto#').

:- rdf_register_ns(xsd, 'http://www.w3.org/2001/XMLSchema#').

find_mol_with_peak_vals_near( SearchShiftVals, Mols ) :-

% Pick the Mols in 'Mol', that match the pattern:

% list_peak_shifts_of_mol( Mol, MolShiftVals ), contains_list_elems_near( SearchShiftVals, MolShiftVals )

% and collect them in 'Mols'.

setof( Mol,

( list_peak_shifts_of_mol( Mol, MolShiftVals ), % A Mol's shift values are collected

contains_list_elems_near( SearchShiftVals, MolShiftVals ) ), % and compared against the given SearchShiftVals

[Mols|MolTail] ). % In 'Mols', all 'Mol's, for which their shift

% values match the SearchShiftVals, are collected.

% Given a 'Mol', give it's shiftvalues in list form, in 'ListOfPeaks'

list_peak_shifts_of_mol( Mol, ListOfPeaks ) :-

has_spectrum( Mol, Spectrum ),

findall( ShiftVal,

( has_peak( Spectrum, Peak ),

has_shift_val( Peak, ShiftVal ) ),

ListOfPeaks ).

% Compare two lists to see if list2 has near-matches for each of the values in list1

contains_list_elems_near( [ElemHead|ElemTail], List ) :-

member_close_to( ElemHead, List ),

( contains_list_elems_near( ElemTail, List );

ElemTail == [] ).

%%%%%%%%%%%%%%%%%%%%%%%%

% Recursive construct: %

%%%%%%%%%%%%%%%%%%%%%%%%

% Test first the end criterion:

member_close_to( X, [ Y | Tail ] ) :-

closeTo( X, Y ).

% but if the above doesn't validate, then recursively continue with the tail of List2:

member_close_to( X, [ Y | Tail ] ) :-

member_close_to( X, Tail ).

% Numerical near-match

closeTo( Val1, Val2 ) :-

abs(Val1 - Val2) =< 0.3.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Convenience accessory methods %

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

has_shift_val( Peak, ShiftVal ) :-

rdf( Peak, nmr:hasShift, literal(type(xsd:decimal, ShiftValLiteral))),

atom_number_create( ShiftValLiteral, ShiftVal ).

has_spectrum( Subject, Predicate ) :-

rdf( Subject, nmr:has_spectrum, Predicate).

has_peak( Subject, Predicate ) :-

rdf( Subject, nmr:has_peak, Predicate).

% Wrapper method for the atom_number/2 method which converts atoms (string constants) to number.

% The wrapper methods avoids exceptions on empty atoms, instead converting into a zero.

atom_number_create( Atom, Number ) :-

atom_length( Atom, AtomLength ), AtomLength > 0 -> % IF atom is not empty

atom_number( Atom, Number ); % THEN Convert the atom to a numerical value

atom_number( '0', Number ). % ELSE Convert to a zero ");

Prolog code

Page 8: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

PREFIX owl: <http://www.w3.org/2002/07/owl#>

PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#>

PREFIX fn: <http://www.w3.org/2005/xpath-functions#>

PREFIX nmr: <http://www.nmrshiftdb.org/onto#>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?s

WHERE {

?s nmr:hasPeak [ nmr:hasShift ?s1 ] ,

[ nmr:hasShift ?s2 ] ,

[ nmr:hasShift ?s3 ] ,

[ nmr:hasShift ?s4 ] ,

[ nmr:hasShift ?s5 ] ,

[ nmr:hasShift ?s6 ] ,

[ nmr:hasShift ?s7 ] ,

[ nmr:hasShift ?s8 ] ,

[ nmr:hasShift ?s9 ] ,

[ nmr:hasShift ?s10 ] ,

[ nmr:hasShift ?s11 ] ,

[ nmr:hasShift ?s12 ] ,

[ nmr:hasShift ?s13 ] ,

[ nmr:hasShift ?s14 ] ,

[ nmr:hasShift ?s15 ] ,

[ nmr:hasShift ?s16 ] .

FILTER ( fn:abs(?s1 - 17.6) < 0.3 ) .

FILTER ( fn:abs(?s2 - 18.3) < 0.3 ) .

FILTER ( fn:abs(?s3 - 22.6) < 0.3 ) .

FILTER ( fn:abs(?s4 - 26.5) < 0.3 ) .

FILTER ( fn:abs(?s5 - 31.7) < 0.3 ) .

FILTER ( fn:abs(?s6 - 33.5) < 0.3 ) .

FILTER ( fn:abs(?s7 - 33.5) < 0.3 ) .

FILTER ( fn:abs(?s8 - 41.8) < 0.3 ) .

FILTER ( fn:abs(?s9 - 42.0) < 0.3 ) .

FILTER ( fn:abs(?s10 - 42.2) < 0.3 ) .

FILTER ( fn:abs(?s11 - 78.34) < 0.3 ) .

FILTER ( fn:abs(?s12 - 140.99) < 0.3 ) .

FILTER ( fn:abs(?s13 - 158.3) < 0.3 ) .

FILTER ( fn:abs(?s14 - 193.4) < 0.3 ) .

FILTER ( fn:abs(?s15 - 203.0) < 0.3 ) .

FILTER ( fn:abs(?s16 - 0) < 0.3 ) . }

SPARQL code

Page 9: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

“Expressiveness”“Expressiveness”

Page 10: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

““Expressivity”: SPARQL vs PrologExpressivity”: SPARQL vs Prolog

SPARQL PROLOG

Page 11: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

Prolog predicate taking variablesProlog predicate taking variables

How to change “input parameters”?● SPARQL: Modify SPARQL query● Prolog: Change input parameter

Page 12: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

● SPARQL● Fewer lines of code● Easier to understand the code

● Prolog● Easier to change input parameters● Easier to re-use existing logic

(call a method rather than cut and paste SPARQL code)

● Easier to change aspects of the execution logic

ObservationsObservations

Page 13: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

PerformancePerformance

Page 14: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

Prolog vs Jena vs JenaTDB vs PelletProlog vs Jena vs JenaTDB vs Pellet

Page 15: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

Prolog vs Jena vs JenaTDBProlog vs Jena vs JenaTDB

Page 16: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

● Prolog is the fastest (in-memory only)● Jena faster with disk based than with

in-memory RDF store!● Pellet with in-memory store is slow● Pellet with disk based store out of

question

ObservationsObservations

Page 17: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

Project plan from lastProject plan from last

Planned final presentation: 28 april 2010 (BMC B7:101a)Everybody is welcome!

Page 18: 3rd Proj. Update: Integrating SWI-Prolog for Semantic Reasoning in Bioclipse

Thank you!

Project blog: http://saml.rilspace.com

Thank you!

Project blog: http://saml.rilspace.com


Recommended