0

我设计了一套耶拿规则,其中一些规则会持续工作很长时间而不会返回结果。我试图减少我的 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>
4

1 回答 1

3

如果您解释规则的意图会有所帮助,因为它看起来有点奇怪。您首先选择所有类型的 3 路交叉产品,因此您会立即让规则引擎变得困难,即

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

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

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

您是否只是试图断言rdf:type间接超类?在这种情况下,这可以更简单地完成,如下所示:

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

请注意,生成的三元组是否已经存在并不重要,因为 RDF 是一组三元组,因此简单地忽略重复数据。

于 2014-01-15T17:38:26.617 回答