179 lines
4.8 KiB
Python
179 lines
4.8 KiB
Python
import pytest
|
|
from rdflib import Graph, Namespace, RDF, OWL, RDFS
|
|
from cognee.modules.ontology.rdf_xml.RDFLibOntologyResolver import RDFLibOntologyResolver
|
|
from cognee.modules.ontology.models import AttachedOntologyNode
|
|
from cognee.modules.ontology.get_ontology_resolver import get_ontology_resolver
|
|
|
|
|
|
def test_ontology_adapter_initialization_success():
|
|
"""Test successful initialization of OntologyAdapter."""
|
|
|
|
config = get_ontology_resolver()
|
|
adapter = config["resolver"]
|
|
adapter.build_lookup()
|
|
|
|
assert isinstance(adapter.lookup, dict)
|
|
|
|
|
|
def test_ontology_adapter_initialization_file_not_found():
|
|
"""Test OntologyAdapter initialization with nonexistent file."""
|
|
adapter = RDFLibOntologyResolver(ontology_file="nonexistent.owl")
|
|
assert adapter.graph is None
|
|
|
|
|
|
def test_build_lookup():
|
|
"""Test the lookup dictionary is correctly built."""
|
|
ns = Namespace("http://example.org/test#")
|
|
g = Graph()
|
|
|
|
g.add((ns.Car, RDF.type, OWL.Class))
|
|
|
|
g.add((ns.Audi, RDF.type, ns.Car))
|
|
|
|
resolver = RDFLibOntologyResolver()
|
|
resolver.graph = g
|
|
resolver.build_lookup()
|
|
|
|
lookup = resolver.lookup
|
|
assert isinstance(lookup, dict)
|
|
|
|
assert "car" in lookup["classes"]
|
|
assert lookup["classes"]["car"] == ns.Car
|
|
|
|
assert "audi" in lookup["individuals"]
|
|
assert lookup["individuals"]["audi"] == ns.Audi
|
|
|
|
|
|
def test_find_closest_match_exact():
|
|
"""Test finding exact match in lookup."""
|
|
|
|
ns = Namespace("http://example.org/test#")
|
|
g = Graph()
|
|
|
|
g.add((ns.Car, RDF.type, OWL.Class))
|
|
g.add((ns.Audi, RDF.type, ns.Car))
|
|
|
|
resolver = RDFLibOntologyResolver()
|
|
resolver.graph = g
|
|
resolver.build_lookup()
|
|
|
|
result = resolver.find_closest_match("Audi", "individuals")
|
|
assert result is not None
|
|
assert result == "audi"
|
|
|
|
|
|
def test_find_closest_match_fuzzy():
|
|
"""Test fuzzy matching for lookup using the RDFlib adapter."""
|
|
|
|
ns = Namespace("http://example.org/test#")
|
|
|
|
g = Graph()
|
|
|
|
g.add((ns.Car, RDF.type, OWL.Class))
|
|
|
|
g.add((ns.Audi, RDF.type, ns.Car))
|
|
g.add((ns.BMW, RDF.type, ns.Car))
|
|
|
|
resolver = RDFLibOntologyResolver()
|
|
resolver.graph = g
|
|
resolver.build_lookup()
|
|
|
|
result = resolver.find_closest_match("Audii", "individuals")
|
|
|
|
assert result == "audi"
|
|
|
|
|
|
def test_find_closest_match_no_match():
|
|
"""Test no match found in lookup."""
|
|
"""Test that find_closest_match returns None when there is no match."""
|
|
ns = Namespace("http://example.org/test#")
|
|
|
|
g = Graph()
|
|
|
|
g.add((ns.Car, RDF.type, OWL.Class))
|
|
|
|
g.add((ns.Audi, RDF.type, ns.Car))
|
|
g.add((ns.BMW, RDF.type, ns.Car))
|
|
|
|
resolver = RDFLibOntologyResolver()
|
|
resolver.graph = g
|
|
resolver.build_lookup()
|
|
|
|
result = resolver.find_closest_match("Nonexistent", "individuals")
|
|
|
|
assert result is None
|
|
|
|
|
|
def test_get_subgraph_no_match_rdflib():
|
|
"""Test get_subgraph returns empty results for a non-existent node."""
|
|
g = Graph()
|
|
|
|
config = get_ontology_resolver()
|
|
resolver = config["resolver"]
|
|
resolver.graph = g
|
|
resolver.build_lookup()
|
|
|
|
nodes, relationships, start_node = resolver.get_subgraph("Nonexistent", "individuals")
|
|
|
|
assert nodes == []
|
|
assert relationships == []
|
|
assert start_node is None
|
|
|
|
|
|
def test_get_subgraph_success_rdflib():
|
|
"""Test successful retrieval of subgraph using the RDFlib adapter."""
|
|
|
|
ns = Namespace("http://example.org/test#")
|
|
g = Graph()
|
|
|
|
g.add((ns.Company, RDF.type, OWL.Class))
|
|
g.add((ns.Vehicle, RDF.type, OWL.Class))
|
|
g.add((ns.Car, RDF.type, OWL.Class))
|
|
|
|
g.add((ns.Vehicle, RDFS.subClassOf, OWL.Thing))
|
|
g.add((ns.Car, RDFS.subClassOf, ns.Vehicle))
|
|
|
|
g.add((ns.Audi, RDF.type, ns.Car))
|
|
g.add((ns.Porsche, RDF.type, ns.Car))
|
|
g.add((ns.VW, RDF.type, ns.Company))
|
|
|
|
owns = ns.owns
|
|
g.add((owns, RDF.type, OWL.ObjectProperty))
|
|
g.add((ns.VW, owns, ns.Audi))
|
|
g.add((ns.VW, owns, ns.Porsche))
|
|
|
|
resolver = RDFLibOntologyResolver()
|
|
resolver.graph = g
|
|
resolver.build_lookup()
|
|
|
|
nodes, relationships, start_node = resolver.get_subgraph("Audi", "individuals")
|
|
|
|
uris = {n.uri for n in nodes}
|
|
assert ns.Audi in uris
|
|
assert ns.Car in uris
|
|
assert ns.Vehicle in uris
|
|
assert OWL.Thing in uris
|
|
|
|
rels = set(relationships)
|
|
assert ("audi", "is_a", "car") in rels
|
|
assert ("car", "is_a", "vehicle") in rels
|
|
assert ("vehicle", "is_a", "thing") in rels
|
|
|
|
assert isinstance(start_node, AttachedOntologyNode)
|
|
assert start_node.uri == ns.Audi
|
|
|
|
|
|
def test_refresh_lookup_rdflib():
|
|
"""Test that refresh_lookup rebuilds the lookup dict into a new object."""
|
|
g = Graph()
|
|
|
|
config = get_ontology_resolver()
|
|
resolver = config["resolver"]
|
|
resolver.graph = g
|
|
resolver.build_lookup()
|
|
|
|
original_lookup = resolver.lookup
|
|
|
|
resolver.refresh_lookup()
|
|
|
|
assert resolver.lookup is not original_lookup
|