为Jena规则添加计时器?

时间:2014-01-15 16:02:15

标签: rdf jena semantic-web jena-rules

我设计了一套Jena规则,其中一些规则在很长一段时间内保持工作而不返回结果。我试图减少我的OWL文件以检查规则是否进入无限循环。幸运的是,似乎没有无限循环,并且很快处理少量类(例如,100)。但是,当我添加更多类时,即使只增加一个类,处理也需要更长的时间。

有没有办法为每个规则添加一个计时器,例如,如果规则花费的时间超过一定时间而不返回结果,则终止规则?如果有可能,我该怎么办?如果没有,是否有一些可以达到类似结果的解决方法?

我的耶拿规则

[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)]

我的一些本体论

<?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>

1 个答案:

答案 0 :(得分:3)

如果您解释了规则的意图,那将会有所帮助,因为它写得有点奇怪。首先选择所有类型的3路交叉产品,这样你就可以立即为规则引擎制造生活,即

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

因此,在您的数据中给出100 owl:Class个实例,您的规则必须考虑100 * 100 * 100个组合,即100万个组合。这就是为什么添加少量额外数据会使情况变得更糟。

至于equal()unequal()断言试图做什么,我完全不确定。

您是否只是尝试为间接超类声明rdf:type?在这种情况下,这可以更简单地完成:

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

请注意,如果生成的三元组已存在,则无关紧要,因为RDF是一组三元组,因此只会忽略重复数据。