当前位置: 首页 > 知识库问答 >
问题:

RDF/XML本体:在Java中转换为JSON(-LD)树

唐元青
2023-03-14
<?xml version="1.0"?>
<rdf:RDF xmlns="urn:absolute:example.com/"
     xml:base="urn:absolute:example.com/"
     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#">
    <owl:Ontology rdf:about="urn:absolute:example.com/"/>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Classes
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- urn:absolute:example.com/#CPU -->

    <owl:Class rdf:about="urn:absolute:example.com/#CPU">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Hardware"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Enduser_Application -->

    <owl:Class rdf:about="urn:absolute:example.com/#Enduser_Application">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Software"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#GPU -->

    <owl:Class rdf:about="urn:absolute:example.com/#GPU">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Hardware"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#HDD -->

    <owl:Class rdf:about="urn:absolute:example.com/#HDD">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Storage"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Hardware -->

    <owl:Class rdf:about="urn:absolute:example.com/#Hardware"/>



    <!-- urn:absolute:example.com/#Keyboard -->

    <owl:Class rdf:about="urn:absolute:example.com/#Keyboard">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Peripherals"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Mainboard -->

    <owl:Class rdf:about="urn:absolute:example.com/#Mainboard">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Hardware"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Monitor -->

    <owl:Class rdf:about="urn:absolute:example.com/#Monitor">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Peripherals"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Mouse -->

    <owl:Class rdf:about="urn:absolute:example.com/#Mouse">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Peripherals"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Operating_System -->

    <owl:Class rdf:about="urn:absolute:example.com/#Operating_System">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Software"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Peripherals -->

    <owl:Class rdf:about="urn:absolute:example.com/#Peripherals">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Hardware"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Printer -->

    <owl:Class rdf:about="urn:absolute:example.com/#Printer">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Peripherals"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#SSD -->

    <owl:Class rdf:about="urn:absolute:example.com/#SSD">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Storage"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Software -->

    <owl:Class rdf:about="urn:absolute:example.com/#Software"/>



    <!-- urn:absolute:example.com/#Storage -->

    <owl:Class rdf:about="urn:absolute:example.com/#Storage">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Hardware"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Video_Game -->

    <owl:Class rdf:about="urn:absolute:example.com/#Video_Game">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Enduser_Application"/>
    </owl:Class>



    <!-- urn:absolute:example.com/#Word_Processor -->

    <owl:Class rdf:about="urn:absolute:example.com/#Word_Processor">
        <rdfs:subClassOf rdf:resource="urn:absolute:example.com/#Enduser_Application"/>
    </owl:Class>
</rdf:RDF>



<!-- Generated by the OWL API (version 4.2.8.20170104-2310) https://github.com/owlcs/owlapi -->
Thing
|-- Hardware
  |-- CPU
  |-- GPU
  |-- Mainboard
  |-- Peripherals
    |-- Keyboard
    |-- Monitor
    |-- Mouse
    |-- Printer
  |-- Storage
    |-- HDD
    |-- SSD
|-- Software
  |-- Enduser_Application
    |-- Video_Game
    |-- Word_Processor
  |-- Operating_System

我已经试过几种不同的方法了。

>

  • 使用Apache Jena

    Model model = ModelFactory.createOntologyModel();
    model.read(ontology, "OWL");
    model.write(new BufferedWriter(f), "JSON-LD");
    

    这似乎是目前“最好的”工作。我最终得到一个包含JSON-LD数据的字符串,它是一个树状表示。但是类关系是颠倒的:

    我注意到JSON-LD有一个所谓的“框架”特性,它基本上允许您将数据重新放入定义的框架中。

    我将JSON-LD的@reverse关键字与rdfs:subclassof结合起来进行了修改,希望从本质上颠倒关系。但是,我也不能让它起作用,而且我对JSON-LD也不是很有经验。因此,我有些挣扎。

    这已经导致了我的一些不眠之夜。如果有人知道这个问题的解决方法,或者只是能给我如何解决这个问题的提示,我会很高兴的。

  • 共有1个答案

    屈晨
    2023-03-14

    我检查了一下,我确实能够使用OWL API加载您的本体并将其保存为JsonLD格式。不过,我怀疑它能解决你的问题,就像@Ignazio指出的那样。为了打印出树结构,您需要访问一个推理器,从中可以查询包含关系。

    这里有一个代码样例,装载和保存你的本体,并将它打印在树状结构中。

    private static Logger logger = LoggerFactory
            .getLogger(owl.api.test.StandaloneOWLNamedIndividualRetrievalv5.AppHardwareTest.class);
    // Why This Failure marker
    private static final Marker WTF_MARKER = MarkerFactory.getMarker("WTF");
    
    static OWLReasoner reasoner;
    
    static void printChildren(NodeSet<OWLClass> owlClasses) {
        for (Node<OWLClass> node : owlClasses) {
            logger.trace(node.getRepresentativeElement().toString());
            if (!node.getRepresentativeElement().isBottomEntity())
                printChildren(reasoner.getSubClasses(node.getRepresentativeElement()));
        }       
    }
    
    public static void main(String[] args) {
        try {
            // Setup physical IRI for storing ontology
            Path path = Paths.get(".").toAbsolutePath().normalize();
            IRI loadDocumentIRI = IRI.create("file:" + path.toFile().getAbsolutePath() + "/hardware.owl");
            IRI saveDocumentIRI = IRI.create("file:" + path.toFile().getAbsolutePath() + "/hardwareSave.txt");
    
            // Initialize
            OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
            OWLOntology ontology = manager.loadOntologyFromOntologyDocument(loadDocumentIRI);
    
            // Write to JsonLD format
            OWLDocumentFormat ontologyFormat = new RDFJsonLDDocumentFormat();
            manager.saveOntology(ontology, ontologyFormat, saveDocumentIRI);        
    
            // Print tree structure
            OWLReasonerFactory reasonerFactory = new JFactFactory();
            reasoner = reasonerFactory.createReasoner(ontology);            
            Node<OWLClass> top = reasoner.getTopClassNode();
            logger.trace(top.getRepresentativeElement().toString());
            printChildren(reasoner.getSubClasses(top.getRepresentativeElement()));          
        } catch (Throwable t) {
            logger.error(WTF_MARKER, t.getMessage(), t);
        }
    }
    

    希望有帮助。祝你好运.

     类似资料:
    • 我想问Java中是否有一种方法可以读取,基本上是任何文件格式(N3,JSON,RDF-XML)等,然后将其转换为海龟(. ttl)。我在谷歌上搜索了一些想法,但他们主要只是解释特定的文件类型以及如何将文件类型转换为RDF,而我希望它以另一种方式。 编辑(按照答案中给出的代码示例): 我已将“eclipse-rdf4j-3.0.3-onejar.jar”添加到NetBeans中的Libraries文

    • 问题内容: 我是json的新手。我有一个程序可以从json对象生成xml。 输出为: 我最大的问题是如何编写自己的属性而不是json_type =“ number”,以及如何编写自己的子元素,例如。 问题答案: 使用中的(优秀)JSON-Java库,然后 可以使用第二个参数来提供XML根节点的名称。 该库还能够使用以下命令将XML转换为JSON POM

    • 问题内容: 我在SO上看到许多问题,询问将XML转换为JSON的方法,但我对采用其他方法感兴趣。是否有用于将JSON转换为XML的python库? 编辑: 什么都没有马上回来,所以我继续写了一个脚本来解决这个问题。 Python已经允许您将JSON转换为本地dict(使用或在版本2.6以下的中,),因此我编写了一个库,可将本地dict 转换为XML字符串。 https://github.com/q

    • 我希望通过一个Thymeleaf变量数组来生成JSON-LD(使用Schema.org),类似于Google的商店部门示例。 我知道您可以在HTML中遍历Thymeleaf中的数组,如下所示: 有没有办法将其转换为JSON-LD格式?

    • 问题内容: 我试图将JSON输出转换为XML。不幸的是我得到这个错误: JSON根对象具有多个属性。根对象必须具有单个属性才能创建有效的XML文档。考虑指定DeserializeRootElementName。 这就是我到目前为止所创建的。 这是我的JSON输出: 我怎么解决这个问题? 问题答案: 尽管问题中提供的JSON并不完整,但您在顶层具有多个属性,如异常所示。您必须为其定义根以获取有效的X

    • 问题内容: 有什么好的工具可以在Java中快速轻松地将XML转换为JSON? 问题答案: Java中的 JSON有一些很棒的资源。 Maven依赖项: XML.java 是您要寻找的课程: 输出为: