Skip to content
Snippets Groups Projects
Commit 94376833 authored by Aurélien Lamercerie's avatar Aurélien Lamercerie
Browse files

New transduction package: add uriref_computer module

parent 22f76612
Branches
No related tags found
No related merge requests found
...@@ -10,8 +10,10 @@ ...@@ -10,8 +10,10 @@
import rdflib import rdflib
from rdflib import URIRef from rdflib import URIRef
from rdflib.namespace import NamespaceManager from rdflib.namespace import NamespaceManager
from rdflib.term import _is_valid_uri
from febTransduction.net import SemanticNetReferenceHandle from febTransduction.net import SemanticNetReferenceHandle
from febTransduction.uriref_computer import produce_uriref
from febTransduction.query_builder import generate_select_query from febTransduction.query_builder import generate_select_query
...@@ -39,12 +41,7 @@ class Net: ...@@ -39,12 +41,7 @@ class Net:
self.type_uri = f'net:{self.type_id}' self.type_uri = f'net:{self.type_id}'
# -- Net URI # -- Net URI
self._uri = uri self._uri = produce_uriref(self.support_graph, uri)
if isinstance(uri, rdflib.term.URIRef):
self._uri = uri.n3(self.support_graph.namespace_manager)
elif isinstance(uri, str):
self._uri = URIRef(uri).n3(self.support_graph.namespace_manager)
# -- Net Attributes # -- Net Attributes
self.attr_list = ['node', 'base_node', 'structure', 'naming'] self.attr_list = ['node', 'base_node', 'structure', 'naming']
...@@ -118,17 +115,9 @@ class Net: ...@@ -118,17 +115,9 @@ class Net:
def uri(self): def uri(self):
return self._uri return self._uri
@uri.setter @uri.setter
def uri(self, new_value): def uri(self, new_value):
control = (isinstance(new_value, rdflib.term.URIRef) or isinstance(new_value, str)) self._uri = produce_uriref(self.support_graph, new_value)
assert control, f'new_value does not a string or URIRef ({type(new_value)})'
if isinstance(new_value, rdflib.term.URIRef):
self._uri = new_value.n3(self.support_graph.namespace_manager)
else:
self._uri = URIRef(new_value).n3(self.support_graph.namespace_manager)
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
......
...@@ -8,27 +8,42 @@ ...@@ -8,27 +8,42 @@
# attributes) # attributes)
#============================================================================== #==============================================================================
from urllib.parse import quote_plus import rdflib
from rdflib import URIRef, Graph
from rdflib import URIRef, Graph, RDF, SDO
from rdflib.term import _is_valid_uri from rdflib.term import _is_valid_uri
#============================================================================== #==============================================================================
# Checking Method(s) # Main Method(s)
#============================================================================== #==============================================================================
class InvalidURIRef(Exception): def __create_uriref(uri):
"""Raise when URIs are invalid.""" assert isinstance(uri, str), f'Houston, we have a problem: uri is not a string'
pass
if (uri.startswith("<") & uri.endswith(">")):
uri = uri[1:-1]
if not isinstance(uri, rdflib.term.URIRef):
uri = rdflib.URIRef(uri)
assert isinstance(uri, rdflib.term.URIRef), f'Houston, we have a problem: result uri is not an URIRef'
return uri
#==============================================================================
# Main Method(s)
#==============================================================================
def create_uriref(uri): def __update_uri_with_prefix(graph, uri):
assert isinstance(uri, str), f'Houston, we have a problem: uri is not a string'
if uri.startswith("http"):
uri = rdflib.URIRef(uri.n3(graph.namespace_manager))
assert _is_valid_uri(uri), f'Houston, we have a problem: unknown url in uri'
return uri
def produce_uriref(graph, uri):
"""Create a URIRef with the same validation func used by URIRef """Create a URIRef with the same validation func used by URIRef
Except here an InvalidURIRef exception is raised. Except here an InvalidURIRef exception is raised.
...@@ -36,7 +51,12 @@ def create_uriref(uri): ...@@ -36,7 +51,12 @@ def create_uriref(uri):
The RDFLib _is_valid_uri only checks for invalid characters. You can also add your The RDFLib _is_valid_uri only checks for invalid characters. You can also add your
own validation checks. own validation checks.
""" """
if _is_valid_uri(uri):
return URIRef(uri) if uri is not None:
raise InvalidURIRef(f'"{uri}" is not a valid URI.') uri = __create_uriref(uri)
uri = __update_uri_with_prefix(graph, uri)
uri = __create_uriref(uri)
assert _is_valid_uri(uri), f'Houston, we have a problem: URI is not a valid uri'
return uri
\ No newline at end of file
...@@ -178,24 +178,24 @@ if __name__ == '__main__': ...@@ -178,24 +178,24 @@ if __name__ == '__main__':
print('\n \n') print('\n \n')
print('\n *** Unit Test ***') print('\n *** Unit Test ***')
# unittest_get_attribute_net(graph, 'https://tenet.tetras-libre.fr/semantic-net#atomClass_sun_s2') unittest_get_attribute_net(graph, 'https://tenet.tetras-libre.fr/semantic-net#atomClass_sun_s2')
# unittest_get_attribute_class_net(graph, 'net:atomClass_sun_s2') unittest_get_attribute_class_net(graph, 'net:atomClass_sun_s2')
# unittest_get_attribute_atom_class_net(graph, 'net:atomClass_sun_s2') unittest_get_attribute_atom_class_net(graph, 'net:atomClass_sun_s2')
# unittest_get_attribute_composite_class_net(graph, 'net:compositeClass_orbit-hasManner-conjunction-OR_o2') unittest_get_attribute_composite_class_net(graph, 'net:compositeClass_orbit-hasManner-conjunction-OR_o2')
# unittest_get_attribute_composite_class_net(graph, 'net:compositeClass_system-hasPart-sun-and-object_s') unittest_get_attribute_composite_class_net(graph, 'net:compositeClass_system-hasPart-sun-and-object_s')
# unittest_get_attribute_property_net(graph, 'net:atomProperty_orbit_o2') unittest_get_attribute_property_net(graph, 'net:atomProperty_orbit_o2')
# unittest_get_attribute_atom_property_net(graph, 'net:atomProperty_orbit_o2') unittest_get_attribute_atom_property_net(graph, 'net:atomProperty_orbit_o2')
# unittest_get_attribute_composite_property_net(graph, 'net:compositeProperty_not-direct_d2') unittest_get_attribute_composite_property_net(graph, 'net:compositeProperty_not-direct_d2')
# unittest_get_attribute_individual_net(graph, 'net:individual_system_SolarSystem') unittest_get_attribute_individual_net(graph, 'net:individual_system_SolarSystem')
# unittest_get_attribute_value_net(graph, 'net:value_SolarSystem_blankNode') unittest_get_attribute_value_net(graph, 'net:value_SolarSystem_blankNode')
# unittest_get_attribute_phenomena_net(graph, 'net:phenomena_conjunction-AND_a') unittest_get_attribute_phenomena_net(graph, 'net:phenomena_conjunction-AND_a')
# unittest_get_attribute_phenomena_net(graph, 'net:phenomena_conjunction-OR_o3') unittest_get_attribute_phenomena_net(graph, 'net:phenomena_conjunction-OR_o3')
# unittest_get_attribute_restriction_net(graph, 'net:restriction_hasPart_sun') unittest_get_attribute_restriction_net(graph, 'net:restriction_hasPart_sun')
print('\n \n') print('\n \n')
\ No newline at end of file
...@@ -8,7 +8,8 @@ ...@@ -8,7 +8,8 @@
#============================================================================== #==============================================================================
import subprocess, os import subprocess, os
from rdflib import Graph, Namespace import rdflib
from rdflib import Graph, Namespace, URIRef
from rdflib.namespace import NamespaceManager from rdflib.namespace import NamespaceManager
from rdflib.term import _is_valid_uri from rdflib.term import _is_valid_uri
...@@ -18,6 +19,8 @@ OUTPUT_DIR_PATH = f'{FILE_PATH}/output/' ...@@ -18,6 +19,8 @@ OUTPUT_DIR_PATH = f'{FILE_PATH}/output/'
TEST_GRAPH = f'{INPUT_DIR_PATH}testGraph1.ttl' TEST_GRAPH = f'{INPUT_DIR_PATH}testGraph1.ttl'
from context import tenet from context import tenet
import utility
from tenet.febTransduction import uriref_computer from tenet.febTransduction import uriref_computer
...@@ -26,7 +29,15 @@ from tenet.febTransduction import uriref_computer ...@@ -26,7 +29,15 @@ from tenet.febTransduction import uriref_computer
# Useful Methods # Useful Methods
#============================================================================== #==============================================================================
# None def load_test_graph():
print(f'\n -- Test Graph Loading')
graph = Graph()
graph.bind('amr', Namespace('https://amr.tetras-libre.fr/rdf/schema#'))
graph.bind('net', Namespace('https://tenet.tetras-libre.fr/semantic-net#'))
graph.bind('base-out', Namespace('https://tenet.tetras-libre.fr/base-ontology#'))
graph.parse(TEST_GRAPH)
print(f" ----- Graph Loaded ({len(graph)})")
return graph
#============================================================================== #==============================================================================
...@@ -36,16 +47,77 @@ from tenet.febTransduction import uriref_computer ...@@ -36,16 +47,77 @@ from tenet.febTransduction import uriref_computer
def devtest_check_uri(uri): def devtest_check_uri(uri):
print(f'\n -- Test URI checking') print(f'\n -- Test URI checking')
print(f' ----- uri: {uri}') print(f' ----- uri: {uri}')
print(f' ----- check 1: {_is_valid_uri(uri)}') print(f' ----- check 1 (valid uri): {_is_valid_uri(uri)}')
print(f' ----- check 2 (URIRef instance): {isinstance(uri, rdflib.term.URIRef)}')
print(f' ----- check 3 (str instance): {isinstance(uri, str)}')
print(f' ----- check 4 (not http uri): {uri.startswith("http")}')
print(f' ----- check 5 (not single quote uri): {uri.startswith("<") & uri.endswith(">")}')
def devtest_create_uriref(graph, uri):
print(f'\n -- Creation of URI Reference')
assert isinstance(uri, str), f'URI is not a string'
origin_uri = uri
new_uri = None
if (uri.startswith("<") & uri.endswith(">")):
uri = uri[1:-1]
if not isinstance(uri, rdflib.term.URIRef):
uri = rdflib.URIRef(uri)
assert isinstance(uri, rdflib.term.URIRef), f'Houston, we have a problem (1)'
if uri.startswith("http"):
new_uri = rdflib.URIRef(uri.n3(graph.namespace_manager))
assert isinstance(new_uri, rdflib.term.URIRef), f'Houston, we have a problem (2)'
else:
new_uri = uri
assert isinstance(new_uri, rdflib.term.URIRef), f'Houston, we have a problem (3)'
assert _is_valid_uri(uri), f'Houston, we have a problem: URI is not a valid uri'
print(f' ----- origin uri: {origin_uri}')
print(f' ----- new uri: {new_uri}')
print(f' ----- new uri checking as URIRef instance: {isinstance(new_uri, rdflib.term.URIRef)}')
#============================================================================== #==============================================================================
# Unit Test # Unit Test
#============================================================================== #==============================================================================
# TODO def unittest_produce_uriref(graph, uri):
print(f'\n -- Produce valid URI Reference')
try:
uriref = uriref_computer.produce_uriref(graph, uri)
if uriref is None:
print(f' ----- None')
else: # uriref is not None
print(f' ----- origin uri: {uri}')
print(f' ----- result uri: {uriref}')
c_1 = _is_valid_uri(uriref)
c_2 = isinstance(uriref, rdflib.term.URIRef)
c_3 = isinstance(uriref, str)
c_4 = not(uriref.startswith("http"))
c_5 = not(uriref.startswith("<") & uriref.endswith(">"))
assert c_1 & c_2 & c_3 & c_4 & c_5
print(f' ----- result uri check: ok')
except:
print(f' ----- check 1 (valid uri): {c_1}')
print(f' ----- check 2 (URIRef instance): {c_2}')
print(f' ----- check 3 (str instance): {c_3}')
print(f' ----- check 4 (not http uri): {c_4}')
print(f' ----- check 5 (not single quote uri): {c_5}')
def unittest_failure_produce_uriref(graph, uri):
print(f'\n -- * Failure to produce URI Reference *')
try:
uriref = uriref_computer.produce_uriref(graph, uri)
print(f'Houston, we have a problem: production is successful')
except:
print(f' ----- OK FAILURE!')
print(f' ----- origin uri: {uri}')
#============================================================================== #==============================================================================
...@@ -55,16 +127,35 @@ def devtest_check_uri(uri): ...@@ -55,16 +127,35 @@ def devtest_check_uri(uri):
if __name__ == '__main__': if __name__ == '__main__':
print('\n *** Test Preparation ***') print('\n *** Test Preparation ***')
pass graph = load_test_graph()
uri_1 = 'net:compositeClass_orbit_hasManner_conjunction-OR'
uri_2 = '<net:compositeClass_orbit_hasManner_conjunction-OR>'
uri_3 = 'https://tenet.tetras-libre.fr/semantic-net#atomClass_sun_s2'
uri_4 = 'https://unknow-url#atomClass_sun_s2'
uri_5 = URIRef('net:compositeClass_orbit_hasManner_conjunction-OR')
print('\n \n') print('\n \n')
print('\n *** Development Test ***') print('\n *** Development Test ***')
devtest_check_uri('<net:compositeClass_orbit_hasManner_conjunction-OR>') devtest_check_uri(uri_1)
devtest_check_uri('net:compositeClass_orbit_hasManner_conjunction-OR') devtest_check_uri(uri_2)
devtest_check_uri(uri_3)
devtest_check_uri(uri_4)
devtest_check_uri(uri_5)
devtest_create_uriref(graph, uri_1)
devtest_create_uriref(graph, uri_1)
devtest_create_uriref(graph, uri_2)
devtest_create_uriref(graph, uri_3)
devtest_create_uriref(graph, uri_4)
devtest_create_uriref(graph, uri_5)
print('\n \n') print('\n \n')
print('\n *** Unit Test ***') print('\n *** Unit Test ***')
pass unittest_produce_uriref(graph, uri_1)
unittest_produce_uriref(graph, uri_2)
unittest_produce_uriref(graph, uri_3)
unittest_failure_produce_uriref(graph, uri_4)
unittest_produce_uriref(graph, uri_5)
unittest_produce_uriref(graph, None)
print('\n \n') print('\n \n')
print('\n *** - ***') print('\n *** - ***')
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment