import rdflib
import glob
import brickschema
import time
def load_file(g, f):
if f.endswith('.ttl'):
g.parse(f, format='ttl')
elif f.endswith('.n3'):
g.parse(f, format='ntriples')
ontology_files = [
"../../example_models/ontologies/Brick.n3",
"../../example_models/ontologies/owl.n3",
"../../example_models/ontologies/rdfs.ttl",
]
data_files = glob.glob("buildings/*.ttl")
data_sizes = {}
for f in data_files:
g = rdflib.Graph()
g.parse(f, format='ttl')
data_sizes[f] = len(g)
N = 1
all_samples = {
'owlrl': {},
'allegro': {},
'owlready2': {},
'reasonable': {},
}
import owlready2
for data_file in data_files:
print(f"Benching owlready2 on {data_file}")
all_samples['owlready2'][data_file] = []
for i in range(N):
g = rdflib.Graph()
load_file(g, data_file)
for ont_file in ontology_files:
load_file(g, ont_file)
g.serialize("_owlready2_input.ttl", format="ttl")
world = owlready2.World()
onto = world.get_ontology(f"file://./_owlready2_input.ttl").load()
t0 = time.time()
owlready2.sync_reasoner(world, infer_property_values =True)
G = world.as_rdflib_graph()
t1 = time.time()
print(f" owlready2: {data_file} took {t1-t0}")
all_samples['owlready2'][data_file].append({'duration': t1-t0, 'triples': len(G)})
import owlrl
for data_file in data_files:
print(f"Benching owlrl on {data_file}")
all_samples['owlrl'][data_file] = []
for i in range(N):
g = rdflib.Graph()
load_file(g, data_file)
for ont_file in ontology_files:
load_file(g, ont_file)
t0 = time.time()
owlrl.DeductiveClosure(owlrl.OWLRL_Semantics).expand(g)
t1 = time.time()
print(f" owlrl: {data_file} took {t1-t0}")
all_samples['owlrl'][data_file].append({'duration': t1-t0, 'triples': len(g)})
from brickschema.inference import OWLRLAllegroInferenceSession
for data_file in data_files:
print(f"Benching owlrl on {data_file}")
all_samples['allegro'][data_file] = []
for i in range(N):
g = rdflib.Graph()
load_file(g, data_file)
for ont_file in ontology_files:
load_file(g, ont_file)
sess = OWLRLAllegroInferenceSession()
t0 = time.time()
g = sess.expand(g)
t1 = time.time()
print(f" allegro: {data_file} took {t1-t0}")
all_samples['allegro'][data_file].append({'duration': t1-t0, 'triples': len(g)})
import reasonable
for data_file in data_files:
print(f"Benching reasonable on {data_file}")
all_samples['reasonable'][data_file] = []
for i in range(N):
g = rdflib.Graph()
load_file(g, data_file)
for ont_file in ontology_files:
load_file(g, ont_file)
r = reasonable.PyReasoner()
r.from_graph(g)
t0 = time.time()
triples = r.reason()
t1 = time.time()
print(f" reasonable: {data_file} took {t1-t0}")
all_samples['reasonable'][data_file].append({'duration': t1-t0, 'triples': len(triples)})
import pandas as pd
records = []
for reasoner, defn in all_samples.items():
for data_file, samples in defn.items():
for sample in samples:
records.append((reasoner, data_file, sample['duration'], sample['triples']))
df = pd.DataFrame.from_records(records)
df.columns=['reasoner','data_file','duration','triples']
df.loc[:, 'src_size'] = df['data_file'].map(lambda x: data_sizes[x])
df.to_csv('benchmark.csv', header=True, index=False)