为什么 SPARQLTarget 不适用于 Apache Jena?

问题描述

我在使用 Apache Jena 创建 NodeShape 时遇到问题。 我想定义一个针对属于 owl:Class 的所有命名个体的形状(因此不包括空白节点)。 例如,这种形状将有助于评估一个本体的所有类是否至少有一个标签

我定义了这个形状

@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix os: <https://w3id.org/OWLunit/shapes/ontology.ttl#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-Syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .


os:ClassShape
    a sh:NodeShape ;
    sh:target [
        a sh:SPARQLTarget ;
        sh:select """
            PREFIX owl: <http://www.w3.org/2002/07/owl#>
            SELECT ?this
            WHERE {
                ?this a owl:Class .
                FILTER(!isBlank(?this))
            }
        """ ;
    ] ;
    sh:property [
        sh:path rdfs:label ;
        sh:minCount 1 ;
    ] .

并且,按照 here 提供的说明,我编写了以下代码来评估 DUL ontology 上的形状。

    public static void test() {
        String SHAPES = "test_shape.ttl";
        String DATA = "http://www.ontologydesignpatterns.org/ont/dul/DUL.owl";

        String q = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "
                + "PREFIX owl: <http://www.w3.org/2002/07/owl#> " 
                + "SELECT ?this  WHERE {"
                + " ?this a owl:Class . FILTER NOT EXISTS {?this rdfs:label ?l}" 
                + "FILTER (!isBlank(?this))}";

        Graph shapesGraph = RDFDataMgr.loadGraph(SHAPES);

        Graph dataGraph = RDFDataMgr.loadGraph(DATA,Lang.RDFXML);

        System.out.println(ResultSetFormatter
                .asText(QueryExecutionFactory.create(q,ModelFactory.createModelForgraph(dataGraph)).execSelect()));

        Shapes shapes = Shapes.parse(shapesGraph);

        System.out.println("Number of shapes " + shapes.getTargetShapes().size());

        ValidationReport report = ShaclValidator.get().validate(shapes,dataGraph);
        System.out.println(report.conforms());
        ShLib.printReport(report);
    }

方法 test() 的执行产生以下结果:

--------------------------------------------------------------------------------
| this                                                                         |
================================================================================
| <http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#DesignedSubstance>    |
| <http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#TimeIndexedRelation>  |
| <http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#ObjectAggregate>      |
| <http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#SpatioTemporalRegion> |
| <http://www.w3.org/2002/07/owl#Thing>                                        |
| <http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#informationEntity>    |
--------------------------------------------------------------------------------

Number of shapes 0
true
Conforms

注意本体中定义的6个类没有标签查询q打印它们),因此本体不符合形状。 未加载任何形状,因此 DUL 结果符合形状。

这里出了点问题。是形状原因还是代码原因?

PS:我使用的是 apache-jena 4.0.0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...