sanjeev
sanjeev

Reputation: 601

Unable to load individuals from the owl/rdf file using python owlready2

I am beginner to ontology using owlready2 in python. Despite trying all the options, it is failing while printing the individuals.

from owlready2 import get_ontology
import logging

logging.basicConfig(level=logging.INFO)

try:
    # Load the ontology    
    ontology = get_ontology("traffic_ontology.owl")  # Replace if your file path is different
    ontology.load()

    # Display all classes
    print("Classes:")
    for cls in ontology.classes():
        print(f"- {cls.name}")

    # Display all object properties
    print("\nObject Properties:")
    for prop in ontology.object_properties():
        print(f"- {prop.name}")



    print("\nIndividuals:")
    for ind in ontology.individuals():
        print(f"- {ind.name}")
        
    # Create a new individual for Signal with a green color
    green_signal = ontology.Signal("GreenSignal")
    green_color = ontology.Green("GreenColor")
    green_signal.hasColor = green_color

    # Get the required action for the green color
    green_action = green_color.requiresAction[0]

    # Display the required action
    print(f"\nFor the GreenSignal, the required action is: {green_action.name}")

except Exception as e:
    logging.error(f"Error loading ontology: {e}")
    logging.error("Please make sure the ontology file 'traffic_ontology.owl' exists and is a valid OWL ontology.")

Here is the error

Individuals: ERROR:root:Error loading ontology: 'NoneType' object is not callable ERROR:root:Please make sure the ontology file 'traffic_ontology.owl' exists and is a valid OWL ontology.

My traffic_ontology.owl file looks like this

<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>

<rdf:RDF xmlns="http://example.com/traffic-ontology#"
     xml:base="http://example.com/traffic-ontology"
     xmlns:rdfs="&rdfs;"
     xmlns:owl="&owl;"
     xmlns:xsd="&xsd;"
     xmlns:rdf="&rdf;">

    <!-- Define the classes -->
    <owl:Class rdf:about="#Signal">
        <rdfs:label>Signal</rdfs:label>
        <rdfs:comment>A traffic signal with different colors</rdfs:comment>
    </owl:Class>

    <owl:Class rdf:about="#Color">
        <rdfs:label>Color</rdfs:label>
        <rdfs:comment>The color of a traffic signal</rdfs:comment>
    </owl:Class>

    <owl:Class rdf:about="#Action">
        <rdfs:label>Action</rdfs:label>
        <rdfs:comment>An action to be taken based on the color of the signal</rdfs:comment>
    </owl:Class>

    <!-- Define subclasses for Color and Action -->
    <owl:Class rdf:about="#Red">
        <rdfs:subClassOf rdf:resource="#Color"/>
        <rdfs:label>Red</rdfs:label>
    </owl:Class>

    <owl:Class rdf:about="#Green">
        <rdfs:subClassOf rdf:resource="#Color"/>
        <rdfs:label>Green</rdfs:label>
    </owl:Class>

    <owl:Class rdf:about="#Yellow">
        <rdfs:subClassOf rdf:resource="#Color"/>
        <rdfs:label>Yellow</rdfs:label>
    </owl:Class>

    <owl:Class rdf:about="#Stop">
        <rdfs:subClassOf rdf:resource="#Action"/>
        <rdfs:label>Stop</rdfs:label>
    </owl:Class>

    <owl:Class rdf:about="#Go">
        <rdfs:subClassOf rdf:resource="#Action"/>
        <rdfs:label>Go</rdfs:label>
    </owl:Class>

    <owl:Class rdf:about="#Wait">
        <rdfs:subClassOf rdf:resource="#Action"/>
        <rdfs:label>Wait</rdfs:label>
    </owl:Class>

    <!-- Define object properties -->
    <owl:ObjectProperty rdf:about="#hasColor">
        <rdfs:domain rdf:resource="#Signal"/>
        <rdfs:range rdf:resource="#Color"/>
        <rdfs:label>has color</rdfs:label>
    </owl:ObjectProperty>

    <owl:ObjectProperty rdf:about="#requiresAction">
        <rdfs:domain rdf:resource="#Color"/>
        <rdfs:range rdf:resource="#Action"/>
        <rdfs:label>requires action</rdfs:label>
    </owl:ObjectProperty>

    <!-- Define individuals -->
    <Signal rdf:about="#TrafficSignal1">
        <hasColor rdf:resource="#Red"/>
    </Signal>

    <Red rdf:about="#RedColor">
        <requiresAction rdf:resource="#Stop"/>
    </Red>

    <Green rdf:about="#GreenColor">
        <requiresAction rdf:resource="#Go"/>
    </Green>

    <Yellow rdf:about="#YellowColor">
        <requiresAction rdf:resource="#Wait"/>
    </Yellow>

    <Stop rdf:about="#StopAction"/>
    <Go rdf:about="#GoAction"/>
    <Wait rdf:about="#WaitAction"/>

</rdf:RDF>

Upvotes: 0

Views: 113

Answers (2)

Aparna Bhat
Aparna Bhat

Reputation: 41

The error is due to the fact individuals have to be invoked with respect to class. Also, when you would like to create a new class inside python environment, you have to associate base_iri.

from owlready2 import get_ontology, Thing, default_world
import logging

logging.basicConfig(level=logging.INFO)

try:
    # Load the ontology
    ontology = get_ontology("trafficontology.owl").load()

except Exception as e:
    logging.error(f"Error loading ontology: {e}")
    logging.error("Please make sure the ontology file 'trafficontology.owl' exists and is a valid OWL ontology.")

ontology.base_iri='http://example.com/traffic-ontology#'
base = get_ontology('http://example.com/traffic-ontology#')

with ontology:
  # Display all classes
  print("Classes:")
  for cls in ontology.classes():
    print(f"- {cls.name}")
    #Display associated instances
    for inst in cls.instances():
      print("INSTANCE-",inst.name)

    # Display all object properties
  print("\nObject Properties:")
  for prop in ontology.object_properties():
    print(f"- {prop.name}")
  # Create a new individual for Signal with a green color
  green_color = ontology.Green("GREEN") # Getting the existing GreenColor individual
  green_signal = ontology.Signal()  # Creating a new Signal individual
  green_signal.hasColor.append(green_color)  # Assigning the green color to the new Signal individual
  print(f"\nCreated GreenSignal with color: {green_signal.hasColor[0].name}")

Attaching the image snippet that I have got.

enter image description here

Upvotes: 1

Henriette Harmse
Henriette Harmse

Reputation: 4787

The way individuals are defined in your OWL file is likely to be the problem. It should look like this:

<owl:NamedIndividual rdf:about="http://example.com/traffic-ontology#TrafficSignal1">
    <rdf:type rdf:resource="http://example.com/traffic-ontology#Signal"/>
    <hasColor rdf:resource="http://example.com/traffic-ontology#Red"/>
</owl:NamedIndividual>

Upvotes: 1

Related Questions