2017-02-16 2 views
1
ここ

は私のコードです:

それはエラースローplayingWithJenaReasoner()関数を実行するには
public class FunctionalityCheckTest1 { 

    InfModel infModel; 
    Model model = ModelFactory.createDefaultModel(); 
    String NS = "http://myweb.com/vocab#"; 

    @Test 
    public void playingWithJenaReasoner() 
    { 
     Resource alex = this.model.createResource(NS+"Alex"); 
     Resource bob = this.model.createResource(NS+"Bob"); 
     Resource alice = this.model.createResource(NS+"Alice"); 
     Property isFriendOf = this.model.createProperty(NS,"isFriendOf"); 
     alex.addProperty(isFriendOf,bob); 
     bob.addProperty(isFriendOf,alice); 
     StmtIterator stmtIterator1 = this.model.listStatements(); 
     while (stmtIterator1.hasNext()) 
     { 
      System.out.println(stmtIterator1.next()); 
     } 

     String customRule = "@prefix vocab: <http://myweb.com/vocab#>. " + 
       "[rule1: (?a vocab:isFriendOf ?b) (?b vocab:isFriendOf ?c) -> (?a vocab:isFriendOf ?c) ]"; 

     List<Rule> rules = new ArrayList<>(); 
     rules.add(Rule.parseRule(customRule)); 

     GenericRuleReasoner reasoner = new GenericRuleReasoner(rules); 
     reasoner.setDerivationLogging(false); 
     this.infModel = ModelFactory.createInfModel(reasoner, this.model); 
     StmtIterator stmtIterator2 = this.infModel.listStatements(); 
     while (stmtIterator2.hasNext()) 
     { 
      System.out.println(stmtIterator2.next()); 
     } 
    } 

} 

:の開始時に予想される '(':
com.hp.hpl.jena.reasoner.rulesys.Rule $をParserException句、見つかった単語:ラインrules.addから
(Rule.parseRule(customRule));

私は上記のコードにこれらの変更を追加した場合、すべてが正常に動作している間


PrintUtil.registerPrefix("vocab",NS); 
String customRule = "[rule1: (?a vocab:isFriendOf ?b) (?b vocab:isFriendOf ?c) -> (?a vocab:isFriendOf ?c) ]"; 
この Jena Documentationでこの

String customRule = "@prefix vocab: <http://myweb.com/vocab#>. " + 
        "[rule1: (?a vocab:isFriendOf ?b) (?b vocab:isFriendOf ?c) -> (?a vocab:isFriendOf ?c) ]"; 

とそういただきました!間違っ

、彼らはルールに@prefix言及しています。どこが間違っていますか?

答えて

2

私はあなたが今日持っていた同じ問題に遭遇し、それが

public static List<Rule> parseRules(String source)

は、文字列の接頭辞を可能にしない方法のように思えます。これがバグかこのメソッドの特徴かどうかはわかりません。

ルール・ファイルで、あなたのルールを述べると

public static List<Rule> rulesFromURL(String uri)

を経由して、それをロードした場合しかし、あなたは接頭辞を含めるルールをロードすることができるはずです。

これは動作するかどうかをテストする小さな例です。それはあなたのオントロジーは、ファイルシステムや、あなたのクラスパスに名前jena.ruleとルールファイルのどこかに保存されていることを前提としています

public class JenaRuleTest { 

    public static void main(String[] args) throws UnsupportedEncodingException { 

     OntModel model = ModelFactory.createOntologyModel();   
     model.read("C:\\path\\to\\ontology\\ontology.ttl");  

     String ruleResourceStr = JenaRuleTest.class.getResource("/jena.rule").toString(); 

     Reasoner reasoner = new GenericRuleReasoner(Rule.rulesFromURL(ruleResourceStr)); 
     reasoner.setDerivationLogging(true); 

     InfModel inf = ModelFactory.createInfModel(reasoner, model);   
     inf.write(System.out, "TURTLE");   
    } 
} 

より精巧な例、それはここで見つけることができない方法:http://tutorial-academy.com/jena-reasoning-with-rules/

Ruleクラスのドキュメントは、次のURLにあります。https://jena.apache.org/documentation/javadoc/jena/org/apache/jena/reasoner/rulesys/Rule.html

誰かがこの問題に直面した場合に役立ちます。

ご挨拶

関連する問題