The entity URI normalizer stripped every non-ASCII character via the
ASCII-only patterns `[^a-z0-9\-.]` and `[^a-z0-9\-]`. For non-Latin
entity names (e.g. Chinese), this deleted the entire name, so distinct
entities collapsed onto the same URI (".../<ontology>/-"), silently
merging unrelated nodes and breaking OntoRAG for non-English content.
Switch both filters to `[^\w\-.]` / `[^\w\-]`. In Python 3, `\w` is
Unicode-aware for str patterns, so non-ASCII letters (CJK, etc.) are
preserved while punctuation and symbols are still removed. ASCII
behaviour is unchanged: names are lowercased and underscores converted
to hyphens before the filter runs, so for ASCII input the patterns are
equivalent to the originals.
Adds tests covering ASCII regression guards and non-ASCII names/types,
including the core case that two distinct Chinese entities must not
collapse onto the same URI.
Co-authored-by: arthurxuwei <5179840+arthurxuwei@users.noreply.github.com>
|
||
|---|---|---|
| .. | ||
| __init__.py | ||
| README.md | ||
| test_embedding_and_similarity.py | ||
| test_entity_contexts.py | ||
| test_entity_normalizer.py | ||
| test_extract_with_simplified_format.py | ||
| test_ontology_loading.py | ||
| test_ontology_selector.py | ||
| test_ontology_triples.py | ||
| test_prompt_and_extraction.py | ||
| test_text_processing.py | ||
| test_triple_converter_validation.py | ||
| test_uri_expansion.py | ||
Ontology Extractor Unit Tests
Comprehensive unit tests for the OntoRAG ontology extraction system.
Test Coverage
1. test_ontology_selector.py - Auto-Include Properties Feature
Tests the critical dependency resolution that automatically includes all properties related to selected classes.
Key Tests:
test_auto_include_properties_for_recipe_class- Verifies Recipe class auto-includesingredients,method,produces,servestest_auto_include_properties_for_ingredient_class- Verifies Ingredient class auto-includesfoodpropertytest_auto_include_properties_for_range_class- Tests properties are included when class appears in rangetest_auto_include_adds_domain_and_range_classes- Ensures related classes are added tootest_multiple_classes_get_all_related_properties- Tests combining multiple class selectionstest_no_duplicate_properties_added- Ensures properties aren't duplicated
2. test_uri_expansion.py - URI Expansion
Tests that URIs are properly expanded using ontology definitions instead of constructed fallback URIs.
Key Tests:
test_expand_class_uri_from_ontology- Class names expand to ontology URIstest_expand_object_property_uri_from_ontology- Object properties use ontology URIstest_expand_datatype_property_uri_from_ontology- Datatype properties use ontology URIstest_expand_rdf_prefix- Standard RDF prefixes expand correctlytest_expand_rdfs_prefix,test_expand_owl_prefix,test_expand_xsd_prefix- Other standard prefixestest_fallback_uri_for_instance- Entity instances get constructed URIstest_already_full_uri_unchanged- Full URIs pass throughtest_dict_access_not_object_attribute- Critical test verifying dict access works (not object attributes)
3. test_ontology_triples.py - Ontology Triple Generation
Tests that ontology elements (classes and properties) are properly converted to RDF triples with labels, comments, domains, and ranges.
Key Tests:
test_generates_class_type_triples- Classes getrdf:type owl:Classtriplestest_generates_class_labels- Classes getrdfs:labeltriplestest_generates_class_comments- Classes getrdfs:commenttriplestest_generates_object_property_type_triples- Object properties get proper type triplestest_generates_object_property_labels- Object properties get labelstest_generates_object_property_domain- Object properties getrdfs:domaintriplestest_generates_object_property_range- Object properties getrdfs:rangetriplestest_generates_datatype_property_type_triples- Datatype properties get proper type triplestest_generates_datatype_property_range- Datatype properties get XSD type rangestest_uses_dict_field_names_not_rdf_names- Critical test verifying dict field names worktest_total_triple_count_is_reasonable- Validates expected number of triples
4. test_text_processing.py - Text Processing and Segmentation
Tests that text is properly split into sentences for ontology matching, including NLTK tokenization and TextSegment creation.
Key Tests:
test_segment_single_sentence- Single sentence produces one segmenttest_segment_multiple_sentences- Multiple sentences split correctlytest_segment_positions- Segment start/end positions are correcttest_segment_complex_punctuation- Handles abbreviations (Dr., U.S.A., Mr.)test_segment_question_and_exclamation- Different sentence terminatorstest_segment_preserves_original_text- Segments can reconstruct originaltest_text_segment_non_overlapping- Segments don't overlaptest_nltk_punkt_availability- NLTK tokenizer is availabletest_unicode_text- Handles unicode characterstest_quoted_text- Handles quoted text correctly
5. test_prompt_and_extraction.py - LLM Prompt Construction and Triple Extraction
Tests that the system correctly constructs prompts with ontology constraints and extracts/validates triples from LLM responses.
Key Tests:
test_build_extraction_variables_includes_text- Prompt includes input texttest_build_extraction_variables_includes_classes- Prompt includes ontology classestest_build_extraction_variables_includes_properties- Prompt includes propertiestest_validates_rdf_type_triple_with_valid_class- Validates rdf:type against ontologytest_rejects_rdf_type_triple_with_invalid_class- Rejects invalid classestest_validates_object_property_triple- Validates object propertiestest_rejects_unknown_property- Rejects properties not in ontologytest_parse_simple_triple_dict- Parses triple from dict formattest_filters_invalid_triples- Filters out invalid triplestest_expands_uris_in_parsed_triples- Expands URIs using ontologytest_creates_proper_triple_objects- Creates Triple objects with Value subjects/predicates/objects
6. test_embedding_and_similarity.py - Ontology Embedding and Similarity Matching
Tests that ontology elements are properly embedded and matched against input text using vector similarity.
Key Tests:
test_create_text_from_class_with_id- Text representation includes class IDtest_create_text_from_class_with_labels- Includes labels in texttest_create_text_from_class_with_comment- Includes comments in texttest_create_text_from_property_with_domain_range- Includes domain/range in property texttest_normalizes_id_with_underscores- Normalizes IDs (underscores to spaces)test_includes_subclass_info_for_classes- Includes subclass relationshipstest_vector_store_api_structure- Vector store has expected APItest_selector_handles_text_segments- Selector processes text segmentstest_merge_subsets_combines_elements- Merging combines ontology elementstest_ontology_element_metadata_structure- Metadata structure is correct
Running the Tests
Run all ontology extractor tests:
cd /home/mark/work/trustgraph.ai/trustgraph
pytest tests/unit/test_extract/test_ontology/ -v
Run specific test file:
pytest tests/unit/test_extract/test_ontology/test_ontology_selector.py -v
pytest tests/unit/test_extract/test_ontology/test_uri_expansion.py -v
pytest tests/unit/test_extract/test_ontology/test_ontology_triples.py -v
pytest tests/unit/test_extract/test_ontology/test_text_processing.py -v
pytest tests/unit/test_extract/test_ontology/test_prompt_and_extraction.py -v
pytest tests/unit/test_extract/test_ontology/test_embedding_and_similarity.py -v
Run specific test:
pytest tests/unit/test_extract/test_ontology/test_ontology_selector.py::TestOntologySelector::test_auto_include_properties_for_recipe_class -v
Run with coverage:
pytest tests/unit/test_extract/test_ontology/ --cov=trustgraph.extract.kg.ontology --cov-report=html
Test Fixtures
sample_ontology- Complete Food Ontology with Recipe, Ingredient, Food, Method classesontology_loader_with_sample- Mock OntologyLoader with the sample ontologyontology_embedder- Mock embedder for testingmock_embedding_service- Mock service for generating deterministic embeddingsvector_store- InMemoryVectorStore for testingextractor- Processor instance for URI expansion testsontology_subset_with_uris- OntologySubset with proper URIs definedsample_ontology_subset- OntologySubset for testing triple generationtext_processor- TextProcessor instance for text segmentation testssample_ontology_class- Sample OntologyClass for testingsample_ontology_property- Sample OntologyProperty for testing
Implementation Notes
These tests verify the fixes made to address:
- Disconnected graph problem - Auto-include properties feature ensures all relevant relationships are available
- Wrong URIs problem - URI expansion using ontology definitions instead of constructed fallbacks
- Dict vs object attribute problem - URI expansion works with dicts (from
cls.__dict__) not object attributes - Ontology visibility in KG - Ontology elements themselves appear in the knowledge graph with proper metadata
- Text segmentation - Proper sentence splitting for ontology matching using NLTK