92 lines
4.2 KiB
Python
92 lines
4.2 KiB
Python
from rdflib import Graph, Namespace, URIRef, Literal, RDF, RDFS, XSD
|
|
from SPARQLWrapper import SPARQLWrapper, POST, BASIC, URLENCODED
|
|
|
|
class measurement_main():
|
|
|
|
def __init__(self, measurement_data_json):
|
|
self.measurement_data_json = measurement_data_json
|
|
|
|
def read_ttl_and_store_in_graphdb(self, ttl_file_path, graphdb_endpoint, graphdb_repository, username=None,
|
|
password=None):
|
|
"""
|
|
Reads RDF data from a Turtle file and stores it in a GraphDB repository.
|
|
|
|
:param ttl_file_path: Path to the Turtle file.
|
|
:param graphdb_endpoint: URL of the GraphDB endpoint.
|
|
:param graphdb_repository: Name of the GraphDB repository.
|
|
:param username: (Optional) Username for GraphDB authentication.
|
|
:param password: (Optional) Password for GraphDB authentication.
|
|
"""
|
|
# Create a graph
|
|
graph = Graph()
|
|
|
|
# Parse the Turtle file
|
|
graph.parse(ttl_file_path, format="turtle")
|
|
|
|
# Serialize the graph to a string in N-Triples format
|
|
ntriples_data = graph.serialize(format='nt')
|
|
|
|
# If ntriples_data is bytes, decode it to string
|
|
if isinstance(ntriples_data, bytes):
|
|
ntriples_data = ntriples_data.decode('utf-8')
|
|
|
|
# Create a SPARQLWrapper instance for the GraphDB endpoint
|
|
sparql = SPARQLWrapper(f"{graphdb_endpoint}/repositories/{graphdb_repository}/statements")
|
|
sparql.setMethod(POST)
|
|
sparql.setRequestMethod(URLENCODED)
|
|
sparql.addParameter('update', f"""
|
|
INSERT DATA {{
|
|
{ntriples_data}
|
|
}}
|
|
""")
|
|
|
|
# Set credentials if provided
|
|
if username and password:
|
|
sparql.setHTTPAuth(BASIC)
|
|
sparql.setCredentials(username, password)
|
|
|
|
# Send the request to the GraphDB repository
|
|
sparql.query()
|
|
|
|
def parse_measurement_data(self):
|
|
# Create a new RDF graph
|
|
g = Graph()
|
|
# Define a custom namespace
|
|
ontology = Namespace("http://sincere.org/s1#")
|
|
resource = Namespace("http://sincere.org/s1/resource/")
|
|
g.bind('sincere', ontology)
|
|
|
|
actual_page = self.measurement_data_json["actual_page"]
|
|
count = self.measurement_data_json["count"]
|
|
pagination = self.measurement_data_json["pagination"]
|
|
status = self.measurement_data_json["status"]
|
|
total_pages = self.measurement_data_json["total_pages"]
|
|
count = 1
|
|
for channel in self.measurement_data_json["data"]:
|
|
channel_id = channel["channel_id"]
|
|
data_value = channel["data_value"]
|
|
measurement = channel["measurement"]
|
|
time = channel["time"]
|
|
g.add((resource["channel_" + channel_id], RDF.type, ontology.Channel))
|
|
g.add((resource["measurement_" + channel_id + "_" + str(count)], RDF.type, ontology.Measurement))
|
|
g.add((resource["channel_" + channel_id], ontology.hasMeasurement, resource["measurement_" + channel_id + "_" + str(count)]))
|
|
g.add((resource["measurement_" + channel_id + "_" + str(count)], ontology.value, Literal(data_value, datatype=XSD.float)))
|
|
g.add((resource["measurement_" + channel_id + "_" + str(count)], ontology.measurement, Literal(measurement, datatype=XSD.string)))
|
|
g.add((resource["measurement_" + channel_id + "_" + str(count)], ontology.time, Literal(time, datatype=XSD.string)))
|
|
count += 1
|
|
|
|
# Create RDF triples
|
|
# Serialize and save the RDF graph to a TTL file
|
|
file_path = "output_channel.ttl"
|
|
g.serialize(destination=file_path, format="turtle")
|
|
|
|
|
|
graphdb_endpoint = 'http://localhost:7200' # Replace with the URL of your GraphDB endpoint
|
|
graphdb_repository = 'weather_measurement' # Replace with the name of your GraphDB repository
|
|
username = 'admin' # Replace with your GraphDB username (if required)
|
|
password = 'root' # Replace with your GraphDB password (if required)
|
|
|
|
self.read_ttl_and_store_in_graphdb(file_path, graphdb_endpoint, graphdb_repository, username, password)
|
|
print("Data was mapped in GraphDB")
|
|
|
|
return 1 |