0

I have designed a set of Jena rules, where some of these rules keep working for a very long time without returning results. I tried to reduce my OWL file to check whether the rules are entering an infinite loop or not. Fortunately, it does not appear that there is an infinite loop, and a small number of classes (e.g., 100) is processed very quickly. However, when I add more classes, even just one more class, it takes a much longer to process.

Is there any way to add a timer to each rule, e.g., to terminate a rule if it is taking longer than a certain amount of time without returning results? If it is possible, how can I do it? If not, is there some workaround that would achieve similar results?

My Jena rule

[rule1: (?a rdf:type owl:Class) (?b rdf:type owl:Class) (?d rdf:type owl:Class) 
        equal(?a,?b) notEqual(?b,?d) notEqual(?a,?d)  (?d rdfs:subClassOf ?a)
        (?d rdf:type ?c) 
        -> (?a rdf:type ?c) print(?a,'is a Type of',?c)]

Some of my ontology

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/"
   xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"
   xmlns:dbpediaR="http://dbpedia.org/resource/" xmlns:dbpediaO="http://dbpedia.org/ontology/"
   xmlns:dbpediaOP="http://dbpedia.org/ontology/PopulatedPlace/"
   xmlns:dbpediaOW="http://dbpedia.org/ontology/Work/"
   xmlns:dbpediaP2="http://dbpedia.org/property/2000"
   xmlns:dbpediaP21="http://dbpedia.org/property/2010" xmlns:dbpediaP="http://dbpedia.org/property/"
   xmlns:dbpedia="http://dbpedia.org/" xmlns:skos="http://www.w3.org/2004/02/skos/core#"
   xmlns:w3prov="http://www.w3.org/ns/prov#"
   xmlns:w3wgs84="http://www.w3.org/2003/01/geo/wgs84_pos#"
   xmlns:georss="http://www.georss.org/georss/">
   <owl:Class rdf:about="http://www.w3.org/2002/07/owl#Thing"/>
<owl:Class rdf:about="http://dbpedia.org/resource/Vrije">
      <dbpediaO:wikiPageDisambiguates rdf:resource="dbpediaR:Het_Vrije_Volk"/>
      <dbpediaO:wikiPageDisambiguates rdf:resource="dbpediaR:Vrije_Universiteit"/>
      <dbpediaO:wikiPageDisambiguates rdf:resource="dbpediaR:Vrije_Universiteit_Brussel"/>
      <dbpediaO:wikiPageDisambiguates rdf:resource="dbpediaR:Brugse_Vrije"/>
      <foaf:isPrimaryTopicOf rdf:resource="http://en.wikipedia.org/wiki/Vrije"/>
      <w3prov:wasDerivedFrom rdf:resource="http://en.wikipedia.org/wiki/Vrije%3Foldid%3D437015722"/>
   </owl:Class>
 </rdf:RDF>
Stephan Muller
  • 27,018
  • 16
  • 85
  • 126
  • 1
    It might be useful to include example data, rules and code that reproduces the problem. You seem to be assuming that Jena is at fault (which may be the case) but without seeing your data, rules and code it is impossible to say. There's always a chance that your data or rules induces a particular pathological situation for the rules engine and that you may be able to fix this by changing your rules or applying them in a different way. – RobV Jan 15 '14 at 16:57
  • 1
    Dear @RobV I added my rule that casues the problem and small part of the owl file, where this part do not satisfy the rule condition. – Abdullah Almuhaimeed Jan 15 '14 at 17:12

1 Answers1

3

It would help if you explained the intent of the rule, as written it looks a bit odd. You start by selecting a 3 way cross products of all types so you are immediately making life hard for the rule engine i.e.

(?a rdf:type owl:Class) (?b rdf:type owl:Class) (?d rdf:type owl:Class)

So given 100 owl:Class instances in your data your rule has to consider 100*100*100 combinations i.e 1 million combinations. Which is why adding a small amount of extra data makes this so much worse.

As for what the equal() and unequal() assertions are trying to do I am entirely unsure.

Are you simply trying to assert rdf:type for indirect super-classes? In which case this can be done more simply like so:

[(?a rdf:subClassOf ?b) (?b rdf:type ?c) -> (?a rdf:type ?c)]

Note that it doesn't matter if the triples generated already exist since RDF is a set of triples so duplicate data is simply ignored.

RobV
  • 28,022
  • 11
  • 77
  • 119