Source code for atomrdf.datamodels.physicalquantities

from typing import List, Optional, Union
import os
import numpy as np
import yaml
import uuid
import json
from pydantic import Field
from atomrdf.datamodels.basemodels import (
    TemplateMixin,
    DataProperty,
    RDFMixin,
    BaseModel,
)
from rdflib import Graph, Namespace, XSD, RDF, RDFS, BNode, URIRef
from atomrdf.namespace import (
    CMSO,
    LDO,
    PLDO,
    PODO,
    CDCO,
    PROV,
    Literal,
    ASMO,
)


[docs] class PhysicalQuantity(DataProperty, TemplateMixin): """ A class to represent a physical quantity with its value, unit, and associated metadata. """ def to_graph( self, graph, ): # this knows just the serialisation of itself. name = str(uuid.uuid4()) if self.basename: name = f"{self.basename.lower()}:{name}" else: name = f"property:{name}" self.id = name property = graph.create_node( name, getattr(ASMO, self.basename), label=self.label ) if self.value is not None: graph.add( (property, ASMO.hasValue, Literal(self.value, datatype=XSD.float)) ) if self.unit is not None: graph.add( ( property, ASMO.hasUnit, URIRef(f"http://qudt.org/vocab/unit/{self.unit}"), ) ) @classmethod def from_graph(cls, graph, id): # recover PID pid = graph.value(id, RDFS.type) pid = str(pid) if pid else None basename = str(pid).split("/")[-1] if pid else None # get label label = graph.value(id, RDFS.label) # get value value = graph.value(id, ASMO.hasValue) # get unit unit = graph.value(id, ASMO.hasUnit) cls.id = str(id) cls.pid = str(pid) if pid else None cls.basename = str(basename) if basename else None cls.label = str(label) if label else None cls.value = float(value) if value else None cls.unit = str(unit).split("/")[-1] if unit else None return cls