0

I have an ontology and based on this ontology I want to create a knowledge graph (separate from the ontology). I want to represent a 'turbine' in my knowledge graph (based on the ontology that I have). Consider the following classes in my ontology [anything that starts with 'has', is an object property]:

'turbine' 'has quality' some 'hub height'

'hub height' 'has quantity' some 'length value'

'length value' 'has part' some 'length unit'

The 'length unit' itself has many subClasses (inch, meter, foot...)

My question is how should I represent a turbine x with hub-height of 100 meters?

Update

I did the following with RDF, but I am not sure if I did it correctly. Basically, I defined some URIs for my instances first and then assigned some types to them.

Turbine_X = URIRef("http://my-domain/thing/Turbine_X")
Turbine_X_Hub_Height = URIRef("http://my-domain/thing/Hub_Height_Turbine_X")
Turbine_X_Length = URIRef("http://my-domain/thing/Turbine_X_Length")
Turbine_X_Length_Unit = URIRef("http://my-domain/thing/Turbine_X_Length_Unit")

Turbine_X, RDF.type, 'turbine'
Turbine_X, 'has quality', Turbine_X_Hub_Height
Turbine_X_Hub_Height, RDF.type, 'hub height'
Turbine_X_Hub_Height, 'has quantity', Turbine_X_Length
Turbine_X_Length, RDF.type, 'length value'
Turbine_X_Length, 'has unit', Turbine_X_Length_Unit
Turbine_X_Length_Unit, RDF.type, 'meter'
Turbine_X_Length_Unit, 'has number', Literal(100, datatype=XSD.integer

I think I need a valid OWL, not just an RDF document. So the question is should I care about OWL here or an RDF graph is enough. I need to run some SPARQL queries on my knowledge graph at the end.

Adel
  • 3,542
  • 8
  • 30
  • 31
  • 2
    not sure if I understand your question, but if you have the ontology aka the schema it is trivial to add instance data aka facts to populate your knowledge graph. Just add RDF triples and use the vocabulary of your ontology. For the height you also need some data property that asserts the value besides the unit. In RDF it would be something simplified like `turbine_x :hubHeight [:value 100 ; :lengthUnit :meters ] .` or you do `turbine_x :hubHeight [:hasQuantity [ :value 100 ; :hasPart :meters]. ] .` - but it looks odd to use something like hasPart to indicate a unit.... – UninformedUser Dec 25 '21 at 10:06
  • @UninformedUser, Thanks for your reply. Please check the update in my post. I wonder if I should define an instance for all the classes above or not. I think I can simply use the vocabulary in my ontology and I will have a valid RDF document, BUT I am not sure if a reasoner can be run on that. I mean from the OWL perspective, I need it to be valid. – Adel Dec 25 '21 at 10:17
  • As described in the question, hubHeight is a class, but it seems like a property in your answer. I wonder if I read your example correctly. – Adel Dec 25 '21 at 10:26

1 Answers1

1

Numerical values for things with units of measure have been modeled many, many, many, many times in RDF OWL! What you don't want to do is invent yet another way of doing this.

For spatial objects, and a Turbine is one, I would follow the pattern in the latest version of the well-known GeosPARQL standard, in particular, see these examples for hasSize and sub-properties: https://opengeospatial.github.io/ogc-geosparql/geosparql11/spec.html#C.1.1.1.2.

You should probably go with a hasHeight but ensure that you both follow the pattern here and reuse Units of Measure from a source such as QUDT. There are many thousands there, so it certainly will have what you need. QUDT also has a much deeper ontology regarding qualities, quantities, types etc. so if you really want to go deeper into defining the property measured - the Turbined heigh - you can do that too using QUDT, but likely you just need hasHeight

Nicholas Car
  • 1,164
  • 4
  • 7