我设计了一套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>
答案 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是一组三元组,因此只会忽略重复数据。