Search code examples
sparqlrdfowlprotegevirtuoso

Protege sees relationship, Virtuoso doesn't


Viewing the go-plus ontology in a freshly installed, stock Protégé 5, I found a useful inference in the entities tab for http://purl.obolibrary.org/obo/GO_0003215:

'cardiac right ventricle morphogenesis' 'results in morphogenesis of' some 'cardiac ventricle'

'results in morphogenesis of' in this case is http://purl.obolibrary.org/obo/RO_0002298 and 'cardiac ventricle' is http://purl.obolibrary.org/obo/UBERON_0002082

If I load the same ontology into Virtuoso Open Source 07.20.3217 and describe http://purl.obolibrary.org/obo/GO_0003215, no relationship with 'cardiac ventricle' is listed. (Even after enabling OWL inference.)

However, http://purl.obolibrary.org/obo/GO_0003215 is linked to an anonymous node with

rdf:type           owl:Restriction 
owl:onProperty     n3:RO_0002298 
owl:someValuesFrom n3:UBERON_0002080 

Where n3 is http://purl.obolibrary.org/obo/

Is there a Virtuoso configuration that would make this relationship clear in a describe view?

Is there some concise SPARQL syntax that would make the relationship clear? Currently, I'm using

select distinct ?goid (str(?goterm) as ?go_str)
?svf (str(?anatomy ) as ?anat_str)
where
{
  ?goid obo:hasOBONamespace 'biological_process'^^xsd:string .
  ?goid  rdfs:label ?goterm .
  ?goid rdfs:subClassOf+ ?parent .
  ?parent owl:someValuesFrom* ?svf .
  ?svf rdfs:subClassOf+
  <http://purl.obolibrary.org/obo/UBERON_0001062> .
  ?svf rdfs:label ?anatomy
}

Solution

  • There are many things in play here.

    You can use Property Paths for transitivity, as described in comment by @ASKW.

    If you want to leverage Virtuoso's built-in reasoning for relationship types described by RDF Schema (rdfs:subClassOf, rdfs:subPropertyOf, rdfs:subClassOf) or OWL (owl:equivalentProperty, owl:equivalentClass, owl:SymmetricProperty, owl:inverseOf, etc.), then you can leverage the inference rules pragma as described in @MarkMiller's comments (note reference to a blog post about that usage pattern).

    If you want to write custom inference rules (i.e., use SPARQL as your Inference Rules language), then you will need Virtuoso 8.0 (coming soon) which delivers that capability. Note, this is the ultimate solution, as you can write your own algorithms using SPARQL.