【问题标题】:Explain inference in Jena在耶拿解释推理
【发布时间】:2014-04-21 09:45:37
【问题描述】:

在耶拿,我使用 InfModel 类创建了一个 RDFS 推理模型:

InfModel infmodel = ModelFactory.createRDFSModel(schema, data);

给定一个来自 infmodel 的推断语句,我们如何获得用于推断它的两个语句,类似于 Protégé 中的“解释推断”选项?例如,如果infModel 包含语句:a rdf:type :t,我们可能会得到两个用于推断它的语句,例如:a :p :b:p rdfs:domain :t

【问题讨论】:

    标签: jena protege inference rdfs


    【解决方案1】:

    根据the documentation(并使用Jena 2.11.1 进行测试),您可以访问Derivation 对象,该对象将允许您创建对所发生事件的文本描述。在以下示例中,我们检索RuleDerivation 对象,这些对象公开了更多关于内部状态的信息。

    以下是文档示例的经过测试的实现,它以以下模型开头:

    <urn:eg:C>  <urn:eg:p>  <urn:eg:D> .
    <urn:eg:B>  <urn:eg:p>  <urn:eg:C> .
    <urn:eg:A>  <urn:eg:p>  <urn:eg:B> .
    

    ...以及以下规则:

    [rule1: (?a urn:eg:p ?b) (?b urn:eg:p ?c) -> (?a urn:eg:p ?c)]
    

    ...生成这个结果模型:

    <urn:eg:B>  <urn:eg:p>  <urn:eg:D> , <urn:eg:C> .
    <urn:eg:A>  <urn:eg:p>  <urn:eg:D> , <urn:eg:C> , <urn:eg:B> .
    <urn:eg:C>  <urn:eg:p>  <urn:eg:D> .
    

    这个基本的传递推理成为下面示例的核心方面。请注意,我们获得了一个 RuleDerivation 的实例,这是您实现最终目标的开始。

    final Resource A = ResourceFactory.createResource("urn:eg:A");
    final Resource B = ResourceFactory.createResource("urn:eg:B");
    final Resource C = ResourceFactory.createResource("urn:eg:C");
    final Resource D = ResourceFactory.createResource("urn:eg:D");
    final Property p = ResourceFactory.createProperty("urn:eg:p");
    
    final Model rawData = ModelFactory.createDefaultModel();
    rawData.add(A, p, B);
    rawData.add(B, p, C);
    rawData.add(C, p, D);
    
    final String rules = "[rule1: (?a urn:eg:p ?b) (?b urn:eg:p ?c) -> (?a urn:eg:p ?c)]";
    final Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(rules));
    reasoner.setDerivationLogging(true);
    final InfModel inf = ModelFactory.createInfModel(reasoner, rawData);
    
    final PrintWriter out = new PrintWriter(System.out);
    for (StmtIterator i = inf.listStatements(A, p, D); i.hasNext(); )
    {
        Statement s = i.nextStatement();
        System.out.println("Statement is " + s);
        for (final Iterator<Derivation> id = inf.getDerivation(s); id.hasNext(); ) {
            final RuleDerivation deriv = (RuleDerivation) id.next();
            deriv.printTrace(out, true);
        }
    }
    out.flush();
    

    这个例子的输出是:

    Statement is [urn:eg:A, urn:eg:p, urn:eg:D]
    Rule rule1 concluded (urn:eg:A urn:eg:p urn:eg:D) <-
        Rule rule1 concluded (urn:eg:A urn:eg:p urn:eg:C) <-
            Fact (urn:eg:A urn:eg:p urn:eg:B)
            Fact (urn:eg:B urn:eg:p urn:eg:C)
        Fact (urn:eg:C urn:eg:p urn:eg:D)
    

    编辑 - 提示

    如果您正在寻找有关如何探索推导的示例,请查看 RuleDerivation#printTrace(...) 的内部结构。如果要将三元组(从 RuleDerivation#getMatches())转换回语句,请使用 StatementImpl#toStaetment(Triple,ModelCom)

    EDIT2 - 完成 假设您使用的是 Jena 内置的基于规则的推理器之一,以下代码将允许您探索推理器报告的特定推导的匹配项。

    final StmtIterator input = inf.listStatements(A, p, D);
    assert( input.hasNext() );
    
    final Iterator<Derivation> derivations = inf.getDerivation(input.next());
    assert( null != derivations );
    assert( derivations.hasNext() );
    
    final RuleDerivation oneDerivation = (RuleDerivation) derivations.next();
    final ExtendedIterator< Statement > matches = 
            new NiceIterator< Triple >()
            .andThen( oneDerivation.getMatches().iterator())
            .mapWith( new Map1< Triple, Statement >(){
                @Override
                public Statement map1( final Triple t )
                {
                    /* Note that it seems that this model doesn't really mean anything. While
                     * the statement will be associated with the infModel, the triple that led
                     * to the match could have been from either the deductions graph or the
                     * raw graph. This does not actually add any triples to the underlying
                     * store.
                     */
                    return StatementImpl.toStatement(t, (ModelCom)inf);
                }});
    

    【讨论】:

    • 有没有一种方法可以创建涉及数学运算的规则,例如求和或减法?
    • 可以,比如可以使用sumdifference来构造这样的规则。
    • @RobHall Map1 是什么?由于这个未知类,无法编译您的代码。
    • 编译:.mapWith( t -&gt; StatementImpl.toStatement(t, (ModelCom)inf));
    • com.hp.hpl.jena.util.iterator.Map1 不再存在。 Apache Jena 已弃用并删除了 Java 流已消除的功能。正如您所展示的,NiceIterator.mapWith(...) 现在只接受 java.util.function.Function,它可以由 lambda 表达式提供。
    猜你喜欢
    • 2015-06-15
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多