簡體   English   中英

RDF / XML本體:用Java轉換為JSON(-LD)樹

[英]RDF/XML Ontology: Convert into JSON(-LD) Tree in Java

我正在嘗試處理以Protégé創建的RDF / XML格式存儲的現有本體(OWL 2.0),以Java中的JSON / JSON-LD樹表示形式。 目標是在單獨的vue.js Web應用程序中使用此處理后的數據進行可視化。

不幸的是,我正在努力做到這一點。

我正在嘗試處理的數據:

這是我要處理的本體(示例本體):

<?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 -->

這是我想將此本體轉換成的結構(最好是在JSON或JSON-LD中):

Protégé屏幕截圖(Imgur)

Thing
|-- Hardware
  |-- CPU
  |-- GPU
  |-- Mainboard
  |-- Peripherals
    |-- Keyboard
    |-- Monitor
    |-- Mouse
    |-- Printer
  |-- Storage
    |-- HDD
    |-- SSD
|-- Software
  |-- Enduser_Application
    |-- Video_Game
    |-- Word_Processor
  |-- Operating_System

但是,本體通過其subclassOf屬性定義了類之間完全相反的關系。 因此,事情似乎變得更加困難。

先前的方法

我已經嘗試了幾種不同的方法。

  1. 使用Apache Jena

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

    目前,這似乎工作“最佳”。 我最終得到一個以樹表示形式包含JSON-LD數據的字符串。 但是,類關系是相反的:

    例如,頂層由元素Keyboard,Monitor,Mouse,Printer等組成。 它們各自的超類作為子元素附加。

如果有一種使用Apache Jena來逆轉關系的方法,那將非常酷。 我目前無法想到一種可能的方式。

  1. 使用owlapi

    由於某種原因,owlapi對我完全不起作用。 它一直無法解析我的本體。

  2. 使用JSON-LD框架(使用方法1的輸出)

    我注意到JSON-LD具有所謂的“成幀”功能,該功能實質上允許您將數據重新適配到已定義的框架中。

    我修改了JSON-LD的@reverse關鍵字以及rdfs:subclassOf希望從本質上扭轉這種關系。 但是,我也無法使它正常工作,而且我對JSON-LD也不完全了解。 因此,我有些掙扎。

這已經給我帶來了一些不眠之夜。 如果有人知道解決方案,或者可以給我提示如何解決此問題,我將非常高興。

非常非常感謝。

我檢查了一下,確實可以使用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);
    }
}

希望對您有所幫助。 祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM