【问题标题】:SPARQL query does not find individual in imported ontology when run in jena在耶拿中运行时,SPARQL 查询在导入的本体中找不到个体
【发布时间】:2016-09-30 02:48:15
【问题描述】:

我有 3 个本体文件,其中第一个导入第二个,第二个导入第三个:

第一个本体导入第二个:

<?xml version="1.0"?>
<rdf:RDF xmlns="http://www.example.com/user/rainer/ontologies/2016/1/usecase_individuals#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xml="http://www.w3.org/XML/1998/namespace"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:uc="http://www.example.com/user/rainer/ontologies/2016/1/usecase#">
    <owl:Ontology rdf:about="http://www.example.com/user/rainer/ontologies/2016/1/usecase_individuals">
        <owl:imports rdf:resource="http://www.example.com/user/rainer/ontologies/2016/1/usecase"/>
    </owl:Ontology>
....

第二个本体导入第三个:

<?xml version="1.0"?>
<rdf:RDF xmlns="http://www.example.com/user/rainer/ontologies/2016/1/usecase#"
     xml:base="http://www.example.com/user/rainer/ontologies/2016/1/usecase"
     xmlns:fgcm="http://www.example.com/user/rainer/ontologies/2016/1/fgcm#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xml="http://www.w3.org/XML/1998/namespace"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:uc="http://www.example.com/user/rainer/ontologies/2016/1/usecase#">
    <owl:Ontology rdf:about="http://www.example.com/user/rainer/ontologies/2016/1/usecase">
        <owl:imports rdf:resource="http://www.boeing.com/user/rainer/ontologies/2016/1/fgcm"/>
    </owl:Ontology>

....

第三个本体(在 Protégé 中创建)断言一个个体:

<?xml version="1.0"?>
<rdf:RDF xmlns="http://www.boeing.com/user/rainer/ontologies/2016/1/fgcm#"

...

    <owl:NamedIndividual rdf:about="http://www.boeing.com/user/rainer/ontologies/2016/1/fgcm#admin">
        <rdf:type rdf:resource="http://www.boeing.com/user/rainer/ontologies/2016/1/fgcm#User"/>
        <userName>admin</userName>
    </owl:NamedIndividual>
...

当我在 Protégé 中打开第一个本体并执行 SPARQL 查询时

PREFIX fgcm: <http://www.example.com/user/rainer/ontologies/2016/1/fgcm#>
SELECT ?subject ?name WHERE { ?subject fgcm:userName ?name}

它可以毫无问题地在第三个本体中找到个体。当我从 Jena 中的代码运行相同的 SPARQL 查询时,我没有得到那个人。查询针对使用默认设置创建的 OntModel 运行。

我知道 Jena 能够加载和导入本体,因为我可以在 SPARQL 查询中和直接使用 Jena API 访问导入的本体中的类和属性。我的问题似乎仅限于在导入的本体中断言的个人。

我已经搜索了可能会改变这种行为但没有找到任何解决方案的设置(在加载本体时,例如不同的 OntModelSpecs 或创建/运行查询时)。

【问题讨论】:

  • 如果没有看到加载这些和运行查询的 java 代码,我认为我们无法诊断问题。

标签: sparql jena owl


【解决方案1】:

原来是我误以为 Jena 成功加载了导入的本体。 (没有报错并不意味着应该导入的本体确实找到了)。

在使用 OntDocumentManager 并告诉它在哪里可以找到需要导入的本体文件后,SPARQL 查询返回了预期的结果。这是对我有用的代码:

OntDocumentManager mgr = new OntDocumentManager ();
mgr.addAltEntry("http://www.boeing.com/user/rainer/ontologies/2016/1/usecase", "file:C:\\Dev\\luna_workspace\\fgcm_translate\\usecase.owl");
mgr.addAltEntry("http://www.boeing.com/user/rainer/ontologies/2016/1/fgcm", "file:C:\\Dev\\luna_workspace\\fgcm_translate\\fgcm.owl");
OntModelSpec spec = new OntModelSpec ( OntModelSpec .OWL_DL_MEM_TRANS_INF);
spec.setDocumentManager(mgr);

OntModel model = ModelFactory.createOntologyModel(spec);

我希望这对遇到类似问题的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多