Java 使用Jena列出类和子类的问题

Java 使用Jena列出类和子类的问题,java,api,jena,Java,Api,Jena,我不会列出一个类的所有子类。我列出了这些类,我的算法检查每个类是否都有一个子类。如果为true,则为列出所有子类。但这并没有发生,它似乎忽略了条件“if”(essaclase.hasSubClass)。有人能帮我吗?下面是代码部分 谢谢 黛博拉 (里约热内卢-巴西) 完整代码: package testejena; import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; import

我不会列出一个类的所有子类。我列出了这些类,我的算法检查每个类是否都有一个子类。如果为true,则为列出所有子类。但这并没有发生,它似乎忽略了条件“if”(essaclase.hasSubClass)。有人能帮我吗?下面是代码部分

谢谢

黛博拉 (里约热内卢-巴西)

完整代码:

package testejena;

import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import java.io.InputStream;
import java.util.Iterator;


public class testeProp {

    static final String inputFileName = "OBRecortada3.owl";

    public static void main(String args[]) {

        try {

            //create the reasoning model using the base
            OntModel inf = ModelFactory.createOntologyModel();

            // use the FileManager to find the input file
            InputStream in = FileManager.get().open(inputFileName);
            if (in == null) {
                throw new IllegalArgumentException("File: " + inputFileName + " not found");
            }

            inf.read(in, "");

            String URI = "http://www.owl-ontologies.com/OntologyBase.owl#";

            ExtendedIterator classes = inf.listClasses();
            while (classes.hasNext()) {
                OntClass essaClasse = (OntClass) classes.next();

                String vClasse = essaClasse.getLocalName().toString();

                if (essaClasse.hasSubClass()) {
                    System.out.println("Classe: " + vClasse);
                    OntClass cla = inf.getOntClass(URI + vClasse);
                    for (Iterator i = cla.listSubClasses(); i.hasNext();) {
                        OntClass c = (OntClass) i.next();
                        System.out.print("   " + c.getLocalName() + " " + "\n");
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}}

您没有显示数据或完整的代码(包括设置OntModel对象的位),因此很难给出明确的建议。
hasSubClass
方法是在Jena单元测试中测试的,因此它不太可能(尽管不是不可能)包含错误。我建议检查:

  • 在运行上述代码之前,您正在使用调试器或日志语句将数据正确加载到
    模型中,例如,显示加载的三元组数

  • 您正在加载的本体实际上包含子类语句,包括检查用于在任何
    rdfs:subassof
    三元组中定义
    rdfs
    的前缀声明(它必须是
    http://www.w3.org/2000/01/rdf-schema#


您的算法不起作用,因为您没有在
OntModel
中指定
OntModelSpec
。指定
OntModelSpec
此代码非常有效

OntModel inf = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);

嗨,伊恩!我的代码和本体都很小,所以我可以用本体检查算法结果。下面(或以上)是完整的代码。我不知道我是否可以在这里发布我正在使用的本体,所以我会发布算法结果。我没多少时间在这个论坛上,所以请原谅我的失言“。非常感谢。我无法发布代码结果的图片,但我是论坛的新手。抱歉。我认为问题出在“classe.hasSubClass”中,但我不知道如何解决。您可以将代码的完整细节发布到gist或pastebin,并将链接放在此处的注释中。或者,你可以编辑你的问题来包含你的源代码:确保你将所有代码缩进四个额外的空格,这样它就被认为是源代码。我用其他本体测试了它,也遇到了同样的问题,我意识到我不会列出所有的类和子类。如果我删除“If(essaclase.hasSubClass())”将给出相同的结果,即,此条件无效。另一个问题,每个类都是事物的一个子类,对吗?为了完整性,你可以包含文件
OBRecortada3.owl
,或者在网上发布一个链接到可以找到它的地方。我在上面发布了完整的代码。谢谢。本体的内容仍然没有显示。您的代码在我看来还可以,所以我怀疑这是您的数据有问题。然而,除非我们能够查看数据,否则就不可能确切地说,或者说,确切地说,是什么问题,以及如何解决它。