diff --git a/tenet/scheme/amr_rule/__init__.py b/tenet/scheme/amr_rule/__init__.py index 5b457376e0b9b7596c305507b83b210ac05b8b34..a1d62cb4b8a31f4f91bf42593bc7f7d308107a25 100644 --- a/tenet/scheme/amr_rule/__init__.py +++ b/tenet/scheme/amr_rule/__init__.py @@ -1,9 +1,11 @@ from scheme.amr_rule.preprocessing.amr_reification import * from scheme.amr_rule.preprocessing.amrld_correcting import * -from scheme.amr_rule.transduction.atomic_class_extractor import * -from scheme.amr_rule.transduction.atomic_individual_extractor import * -from scheme.amr_rule.transduction.atomic_property_extractor import * +from scheme.amr_rule.transduction.atom_class_extractor import * +from scheme.amr_rule.transduction.atom_individual_extractor import * +from scheme.amr_rule.transduction.atom_property_extractor import * +from scheme.amr_rule.transduction.atom_value_extractor import * +from scheme.amr_rule.transduction.atom_phenomena_extractor import * from scheme.amr_rule.transduction.composite_class_extractor_1 import * diff --git a/tenet/scheme/amr_rule/transduction/atomic_class_extractor.py b/tenet/scheme/amr_rule/transduction/atom_class_extractor.py similarity index 87% rename from tenet/scheme/amr_rule/transduction/atomic_class_extractor.py rename to tenet/scheme/amr_rule/transduction/atom_class_extractor.py index b5b52f205df6eb19eafb4a8869f359bafbea65a3..b1b4c07ca991857f5d5a3785086aed9519b205cb 100644 --- a/tenet/scheme/amr_rule/transduction/atomic_class_extractor.py +++ b/tenet/scheme/amr_rule/transduction/atom_class_extractor.py @@ -17,24 +17,18 @@ from transduction.naming_computer import define_composite_naming_1, define_restr #============================================================================== -# Select Pattern: leaf{variable, concept} +# Pattern Search: leaf{variable, concept} #============================================================================== - -def __rule_pattern_query_code(graph): - select_data_list = ['?leaf', '?conceptName'] - clause_list = [] - clause_list.append(f'?leaf a amr:AMR_Leaf.') - clause_list.append(f'?leaf amr:hasConcept ?leafConcept.') - clause_list.append(f'?leafConcept rdfs:subClassOf amr:AMR_Term_Concept.') - clause_list.append(f'?leafConcept amr:label ?conceptName.') - query_code = generate_select_query(graph, select_data_list, clause_list) - return query_code - def __search_pattern(graph): - query_code = __rule_pattern_query_code(graph) - rule_pattern_set = graph.query(query_code) - return rule_pattern_set + select_data_list = ['?leaf', '?conceptName'] + clause_list = [f'?leaf a amr:AMR_Leaf.', + f'?leaf amr:hasConcept ?leafConcept.', + f'?leafConcept rdfs:subClassOf amr:AMR_Term_Concept.', + f'?leafConcept amr:label ?conceptName.'] + query_code = generate_select_query(graph, select_data_list, clause_list) + result_set = graph.query(query_code) + return query_code, result_set #============================================================================== @@ -134,17 +128,17 @@ def __construct_atom_class_net(graph, leaf, concept_name): # Main Method #============================================================================== -def extract_atomic_class(graph): +def extract_atom_class(graph): # -- Rule Initialization - rule_label = 'extract atomic classes [ leaf{variable, concept} ]' + rule_label = 'extract atom classes' # -- Search for patterns - rule_pattern_set = __search_pattern(graph) + _, pattern_set = __search_pattern(graph) # -- Selection Analyzing (1) rule_triple_list = [] - for pattern in rule_pattern_set: + for pattern in pattern_set: # -- New Net Construction (from 3 nets) new_class, triple_list = __construct_atom_class_net( diff --git a/tenet/scheme/amr_rule/transduction/atom_individual_extractor.py b/tenet/scheme/amr_rule/transduction/atom_individual_extractor.py new file mode 100644 index 0000000000000000000000000000000000000000..9fcf81ac3cd4d7477fd857ae2e7c309de863bdf1 --- /dev/null +++ b/tenet/scheme/amr_rule/transduction/atom_individual_extractor.py @@ -0,0 +1,172 @@ +#!/usr/bin/python3.10 +# -*-coding:Utf-8 -* + +#============================================================================== +# TENET: Rule to extract atomic individuals +#------------------------------------------------------------------------------ +# Net Expansion AMR rule to extract atomic individuals +# Rule: leaf{variable, concept} => atomicClass +#============================================================================== + +from rdflib import Graph + +import transduction +from transduction import net +from transduction.query_builder import generate_select_query +from transduction.naming_computer import define_composite_naming_1, define_restriction_naming + + +#============================================================================== +# Pattern Search: Leaf{variable, concept} corresponding to individual +#============================================================================== + +def __search_pattern(graph): + select_data_list = ['?baseLeaf', '?valueLabel', '?classNet'] + clause_list = [f'?baseLeaf a amr:AMR_Leaf.', + f'?baseLeaf amr:hasConcept ?leafConcept.', + f'?baseLeaf ?edge ?value.', + f'?edge amr:hasRoleID ?roleID.', + f'VALUES ?roleID {{"name"}}', + f'?value a amr:AMR_Value.', + f'?value rdfs:label ?valueLabel.', + f'?classNet a [rdfs:subClassOf* net:Class_Net].', + f'?classNet net:coverBaseNode ?baseLeaf.'] + query_code = generate_select_query(graph, select_data_list, clause_list) + result_set = graph.query(query_code) + return query_code, result_set + + +#============================================================================== +# Useful Additional Search +#============================================================================== + +def __structure_query_code(graph): + select_data_list = ['?sentenceId'] + clause_list = [] + clause_list.append(f'?root a amr:AMR_Root.') + clause_list.append(f'?root amr:hasSentenceID ?sentenceId.') + query_code = generate_select_query(graph, select_data_list, clause_list) + return query_code + + +def __search_structure(graph): + query_code = __structure_query_code(graph) + result_set = graph.query(query_code) + return result_set + + +def __search_leaf_in_relation(graph, base_leaf_uri): + select_data_list = ['?inRelationRole', '?inNet'] + clause_list = [f'?inNet a [rdfs:subClassOf* net:Net].', + f'?inNet net:coverBaseNode ?inLeaf.', + ('?inLeaf', '?relation', base_leaf_uri), + f'?relation amr:hasAmrRole ?inRelationRole.'] + query_code = generate_select_query(graph, select_data_list, clause_list) + result_set = graph.query(query_code) + return query_code, result_set + + +def __search_leaf_out_relation(graph, base_leaf_uri): + select_data_list = ['?outRelationRole', '?outNet'] + clause_list = [f'?outNet a [rdfs:subClassOf* net:Net].', + f'?outNet net:coverBaseNode ?outLeaf.', + (base_leaf_uri, '?relation', '?outLeaf'), + f'?relation amr:hasAmrRole ?outRelationRole.'] + query_code = generate_select_query(graph, select_data_list, clause_list) + result_set = graph.query(query_code) + return query_code, result_set + + + +#============================================================================== +# Useful Computation Method(s) +#============================================================================== + +def __get_structure(graph): + structure = 'unknown' + structure_set = __search_structure(graph) + for row in structure_set: + structure = row.sentenceId + return structure + + +def __define_naming(value_label): + value_label = value_label.replace(' ', '#') + value_label = value_label.replace('-', '#') + word_set = value_label.split('#') + first = True + for word in word_set: + if first: + naming = word + first = False + else: + naming += word.capitalize() + return naming + + +def __propagate_relation(graph, target_net, base_leaf): + _, in_relation_set = __search_leaf_in_relation(graph, base_leaf) + for row in in_relation_set: + target_net.input_relation_list += [(row.inNet, row.inRelationRole, _)] + _, out_relation_set = __search_leaf_out_relation(graph, base_leaf) + for row in out_relation_set: + target_net.output_relation_list += [(_, row.outRelationRole, row.outNet)] + + + +#============================================================================== +# Construct Method(s) +#============================================================================== + +def __construct_individual_net( + graph, base_leaf, value_label, mother_class_net): + + # -- Net Composition + individual_net = net.IndividualNet(graph) + + # -- Data Computation + individual_net.base_node = base_leaf + individual_net.node = base_leaf + individual_net.individual_label = value_label + individual_net.mother_class_net = mother_class_net + individual_net.structure = __get_structure(graph) + + # -- Net Naming + individual_net.naming = __define_naming(value_label) + + # -- Relation Propagation + __propagate_relation(graph, individual_net, base_leaf) + + # -- Finalization + individual_net.finalize() + triple_definition = individual_net.generate_triple_definition() + + return individual_net, triple_definition + + + +#============================================================================== +# Main Method +#============================================================================== + +def extract_atom_individual(graph): + + # -- Rule Initialization + rule_label = 'extract atom individuals' + + # -- Search for patterns + _, pattern_set = __search_pattern(graph) + + # -- Selection Analyzing (1) + rule_triple_list = [] + for pattern in pattern_set: + + # -- New Net Construction (from 3 nets) + new_class, triple_list = __construct_individual_net( + graph, pattern.baseLeaf, pattern.valueLabel, pattern.classNet) + + # -- Resulting List Update + # class_net_list.append(new_class) + rule_triple_list += triple_list + + return rule_label, rule_triple_list \ No newline at end of file diff --git a/tenet/scheme/amr_rule/transduction/atomic_individual_extractor.py b/tenet/scheme/amr_rule/transduction/atom_phenomena_extractor.py similarity index 83% rename from tenet/scheme/amr_rule/transduction/atomic_individual_extractor.py rename to tenet/scheme/amr_rule/transduction/atom_phenomena_extractor.py index e6bf8bbd4379c5aa8abffb9bc78dba52beb5729a..7a744ebcc7c14c0093adc62dcd2306831c6f4235 100644 --- a/tenet/scheme/amr_rule/transduction/atomic_individual_extractor.py +++ b/tenet/scheme/amr_rule/transduction/atom_phenomena_extractor.py @@ -20,27 +20,22 @@ from transduction.naming_computer import define_composite_naming_1, define_restr # Pattern Search: Leaf{variable, concept} corresponding to individual #============================================================================== -def __rule_pattern_query_code(graph): - select_data_list = ['?baseLeaf', '?conceptName', '?valueLabel', '?classNet'] - clause_list = [] - clause_list.append(f'?baseLeaf a amr:AMR_Leaf.') - clause_list.append(f'?baseLeaf amr:hasConcept ?leafConcept.') - clause_list.append(f'?baseLeaf ?edge ?value.') - clause_list.append(f'?edge amr:hasRoleID ?roleID.') - clause_list.append(f'VALUES ?roleID {{"name"}}') - clause_list.append(f'?value a amr:AMR_Value.') - clause_list.append(f'?value rdfs:label ?valueLabel.') - clause_list.append(f'?classNet a [rdfs:subClassOf* net:Class_Net].') - clause_list.append(f'?classNet net:coverBaseNode ?baseLeaf.') - clause_list.append(f'?classNet net:hasClassName ?conceptName.') - query_code = generate_select_query(graph, select_data_list, clause_list) - return query_code - - def __search_pattern(graph): - query_code = __rule_pattern_query_code(graph) - rule_pattern_set = graph.query(query_code) - return rule_pattern_set + select_data_list = ['?baseLeaf', '?phenomenaLabel', '?relationConceptPhenomena', '?relationConceptLabel'] + clause_list = [f'?baseLeaf a amr:AMR_Leaf.', + f'?baseLeaf amr:hasConcept ?concept.', + f'?baseLeaf amr:hasVariable ?variable.', + f'?variable amr:label ?varLabel.', + f'?concept rdfs:subClassOf amr:AMR_Relation_Concept.', + f'?concept amr:hasPhenomenaLink ?relationConceptPhenomena.', + f'?concept amr:label ?relationConceptLabel.', + f'?relationConceptPhenomena amr:label ?phenomenaLabel.', + f'?baseLeaf ?relation ?argLeaf.', + f'?relation amr:hasAmrRole ?someArgRole.'] + query_code = generate_select_query(graph, select_data_list, clause_list) + result_set = graph.query(query_code) + return query_code, result_set + #============================================================================== @@ -156,17 +151,17 @@ def __construct_individual_net( # Main Method #============================================================================== -def extract_atomic_individual(graph): +def extract_atom_phenomena(graph): # -- Rule Initialization - rule_label = 'extract atomic individuals [ leaf{variable, concept} ]' + rule_label = 'extract atom phenomena' # -- Search for patterns - rule_pattern_set = __search_pattern(graph) + _, pattern_set = __search_pattern(graph) # -- Selection Analyzing (1) rule_triple_list = [] - for pattern in rule_pattern_set: + for pattern in pattern_set: # -- New Net Construction (from 3 nets) new_class, triple_list = __construct_individual_net( diff --git a/tenet/scheme/amr_rule/transduction/atomic_property_extractor.py b/tenet/scheme/amr_rule/transduction/atom_property_extractor.py similarity index 90% rename from tenet/scheme/amr_rule/transduction/atomic_property_extractor.py rename to tenet/scheme/amr_rule/transduction/atom_property_extractor.py index 3304ed06cb86c0d7557f60b3376207ee47a6e2ff..f01e638b4114df8e414db23f60559ad487de44fc 100644 --- a/tenet/scheme/amr_rule/transduction/atomic_property_extractor.py +++ b/tenet/scheme/amr_rule/transduction/atom_property_extractor.py @@ -21,21 +21,15 @@ from transduction.naming_computer import define_composite_naming_1, define_restr # Pattern Search: Leaf{variable, amrPrecicateConcept} #============================================================================== -def __rule_pattern_query_code(graph): +def __search_pattern(graph): select_data_list = ['?baseLeaf', '?predicateLabel'] - clause_list = [] - clause_list.append(f'?baseLeaf a amr:AMR_Leaf.') - clause_list.append(f'?baseLeaf amr:hasConcept ?leafConcept.') - clause_list.append(f'?leafConcept rdfs:subClassOf amr:AMR_Predicat_Concept.') - clause_list.append(f'?leafConcept amr:label ?predicateLabel.') + clause_list = [f'?baseLeaf a amr:AMR_Leaf.', + f'?baseLeaf amr:hasConcept ?leafConcept.', + f'?leafConcept rdfs:subClassOf amr:AMR_Predicat_Concept.', + f'?leafConcept amr:label ?predicateLabel.'] query_code = generate_select_query(graph, select_data_list, clause_list) - return query_code - - -def __search_pattern(graph): - query_code = __rule_pattern_query_code(graph) result_set = graph.query(query_code) - return result_set + return query_code, result_set #============================================================================== @@ -168,17 +162,17 @@ def __construct_atom_property_net(graph, base_leaf, predicate_label): # Main Method #============================================================================== -def extract_atomic_property(graph): +def extract_atom_property(graph): # -- Rule Initialization - rule_label = 'extract atomic properties [ leaf{variable, amrTermConcept} ]' + rule_label = 'extract atomic properties' # -- Search for patterns - rule_pattern_set = __search_pattern(graph) + _, pattern_set = __search_pattern(graph) # -- Selection Analyzing (1) rule_triple_list = [] - for pattern in rule_pattern_set: + for pattern in pattern_set: # -- New Net Construction (from 3 nets) new_net, triple_list = __construct_atom_property_net( diff --git a/tenet/scheme/amr_rule/transduction/atom_value_extractor.py b/tenet/scheme/amr_rule/transduction/atom_value_extractor.py new file mode 100644 index 0000000000000000000000000000000000000000..4bed1cb88082aaf540796a29a84572c653698803 --- /dev/null +++ b/tenet/scheme/amr_rule/transduction/atom_value_extractor.py @@ -0,0 +1,149 @@ +#!/usr/bin/python3.10 +# -*-coding:Utf-8 -* + +#============================================================================== +# TENET: Rule to extract atomic individuals +#------------------------------------------------------------------------------ +# Net Expansion AMR rule to extract atomic individuals +# Rule: leaf{variable, concept} => atomicClass +#============================================================================== + +from rdflib import Graph + +import transduction +from transduction import net +from transduction.query_builder import generate_select_query +from transduction.naming_computer import define_composite_naming_1, define_restriction_naming + + +#============================================================================== +# Pattern Search: Leaf{variable, concept} corresponding to individual +#============================================================================== + +def __search_pattern(graph): + select_data_list = ['?valueLabel'] + clause_list = [f'?value a amr:AMR_Value.', + f'?value rdfs:label ?valueLabel.'] + query_code = generate_select_query(graph, select_data_list, clause_list) + result_set = graph.query(query_code) + return query_code, result_set + + +#============================================================================== +# Useful Additional Search +#============================================================================== + +def __structure_query_code(graph): + select_data_list = ['?sentenceId'] + clause_list = [] + clause_list.append(f'?root a amr:AMR_Root.') + clause_list.append(f'?root amr:hasSentenceID ?sentenceId.') + query_code = generate_select_query(graph, select_data_list, clause_list) + return query_code + + +def __search_structure(graph): + query_code = __structure_query_code(graph) + result_set = graph.query(query_code) + return result_set + + +def __search_leaf_in_relation(graph, base_leaf_uri): + select_data_list = ['?inRelationRole', '?inNet'] + clause_list = [f'?inNet a [rdfs:subClassOf* net:Net].', + f'?inNet net:coverBaseNode ?inLeaf.', + ('?inLeaf', '?relation', base_leaf_uri), + f'?relation amr:hasAmrRole ?inRelationRole.'] + query_code = generate_select_query(graph, select_data_list, clause_list) + result_set = graph.query(query_code) + return query_code, result_set + + +def __search_leaf_out_relation(graph, base_leaf_uri): + select_data_list = ['?outRelationRole', '?outNet'] + clause_list = [f'?outNet a [rdfs:subClassOf* net:Net].', + f'?outNet net:coverBaseNode ?outLeaf.', + (base_leaf_uri, '?relation', '?outLeaf'), + f'?relation amr:hasAmrRole ?outRelationRole.'] + query_code = generate_select_query(graph, select_data_list, clause_list) + result_set = graph.query(query_code) + return query_code, result_set + + + +#============================================================================== +# Useful Computation Method(s) +#============================================================================== + +def __get_structure(graph): + structure = 'unknown' + structure_set = __search_structure(graph) + for row in structure_set: + structure = row.sentenceId + return structure + + +def __define_naming(value_label): + value_label = value_label.replace(' ', '#') + value_label = value_label.replace('-', '#') + word_set = value_label.split('#') + first = True + for word in word_set: + if first: + naming = word + first = False + else: + naming += word.capitalize() + return naming + + + +#============================================================================== +# Construct Method(s) +#============================================================================== + +def __construct_value_net( + graph, value_label): + + # -- Net Composition + value_net = net.ValueNet(graph) + + # -- Data Computation + value_net.value_label = value_label + value_net.structure = __get_structure(graph) + + # -- Net Naming + value_net.naming = __define_naming(value_label) + + # -- Finalization + value_net.finalize() + triple_definition = value_net.generate_triple_definition() + + return value_net, triple_definition + + + +#============================================================================== +# Main Method +#============================================================================== + +def extract_atom_value(graph): + + # -- Rule Initialization + rule_label = 'extract atom values' + + # -- Search for patterns + _, pattern_set = __search_pattern(graph) + + # -- Selection Analyzing (1) + rule_triple_list = [] + for pattern in pattern_set: + + # -- New Net Construction (from 3 nets) + new_class, triple_list = __construct_value_net(graph, pattern.valueLabel) + + # -- Resulting List Update + # class_net_list.append(new_class) + rule_triple_list += triple_list + + return rule_label, rule_triple_list \ No newline at end of file diff --git a/tenet/scheme/amr_scheme_1.py b/tenet/scheme/amr_scheme_1.py index 535bb44e0f5503c8c9b5559a0cf3e04c930dfe1d..4ce4dd22864ea85aa1cf738b4f6b8c5a1a34da88 100644 --- a/tenet/scheme/amr_scheme_1.py +++ b/tenet/scheme/amr_scheme_1.py @@ -227,9 +227,11 @@ classification_sequence = { } atomic_extraction_sequence = ['atomic-extraction-sequence', - rule.extract_atomic_class, - rule.extract_atomic_individual, - rule.extract_atomic_property] + rule.extract_atom_class, + rule.extract_atom_individual, + rule.extract_atom_property, + rule.extract_atom_value, + rule.extract_atom_phenomena] phenomena_polarity_analyze_sequence = ['phenomena_polarity_analyze_sequence', rule.analyze_phenomena_polarity_1] diff --git a/tenet/transduction/net/net.py b/tenet/transduction/net/net.py index b1ab0264d6f796d6e16b28ad346cf1230b87d542..495735a4d7ecf8c3efe4678610da43a4a754d4ce 100644 --- a/tenet/transduction/net/net.py +++ b/tenet/transduction/net/net.py @@ -353,9 +353,9 @@ class Net: # -- Net Node Reference if self.base_node is None: - net_node_ref = f'blankNode1' + net_node_ref = f'blankNode' elif len(self.base_node) <= 0: - net_node_ref = f'blankNode2' + net_node_ref = f'blankNode' else: assert len(self.base_node) > 0, f'Houston, we have a problem!' net_node_ref = self.__get_node_value(self.base_node[0]) diff --git a/tests/dev_tests/test_data/atom-extraction-devGraph-1.result.ttl b/tests/dev_tests/test_data/atom-extraction-devGraph-1.result.ttl index f87267394544c131266b93c6325276f4427f6abf..67bb1f9a51f43f11e0beec1ad5699ef506d3f03d 100644 --- a/tests/dev_tests/test_data/atom-extraction-devGraph-1.result.ttl +++ b/tests/dev_tests/test_data/atom-extraction-devGraph-1.result.ttl @@ -440,9 +440,6 @@ net:Property_Direction a owl:Class ; net:Restriction_Net a owl:Class ; rdfs:subClassOf net:Net . -net:Value_Net a owl:Class ; - rdfs:subClassOf net:Net . - net:abstractionClass a owl:AnnotationProperty ; rdfs:label "abstraction class" ; rdfs:subPropertyOf net:objectValue . @@ -708,6 +705,16 @@ net:unary_list a owl:Class ; rdfs:label "unary-list" ; rdfs:subClassOf net:list . +net:value_SolarSystem_blankNode a net:Value_Net ; + net:hasNaming "SolarSystem" ; + net:hasStructure "SSC-01-01" ; + net:hasValueLabel "Solar System" . + +net:value_negative_blankNode a net:Value_Net ; + net:hasNaming "negative" ; + net:hasStructure "SSC-01-01" ; + net:hasValueLabel "negative" . + net:verbClass a owl:AnnotationProperty ; rdfs:label "verb class" ; rdfs:subPropertyOf net:objectValue . @@ -1079,6 +1086,9 @@ net:Class_Net a owl:Class ; net:Property_Net a owl:Class ; rdfs:subClassOf net:Net . +net:Value_Net a owl:Class ; + rdfs:subClassOf net:Net . + net:atomClass_system_s a net:Atom_Class_Net ; :role_domain net:individual_SolarSystem_p ; net:coverBaseNode :leaf_system_s ; diff --git a/tests/dev_tests/test_rule_atomic_extractor.py b/tests/dev_tests/test_rule_atomic_extractor.py index 46c56859f664ae1f0cda4badb6fbb807e2a43850..8fbd3fb5d2ea9c58a0f864900a308d5fdad9ee14 100644 --- a/tests/dev_tests/test_rule_atomic_extractor.py +++ b/tests/dev_tests/test_rule_atomic_extractor.py @@ -25,9 +25,11 @@ from context import tenet from tenet.transduction.rdfterm_computer import __update_uri_with_prefix from tenet.transduction import rdfterm_computer, prefix_handle from tenet.transduction import net -from tenet.scheme.amr_rule.transduction import atomic_class_extractor as rule_1 -from tenet.scheme.amr_rule.transduction import atomic_individual_extractor as rule_2 -from tenet.scheme.amr_rule.transduction import atomic_property_extractor as rule_3 +from tenet.scheme.amr_rule.transduction import atom_class_extractor as rule_1 +from tenet.scheme.amr_rule.transduction import atom_individual_extractor as rule_2 +from tenet.scheme.amr_rule.transduction import atom_property_extractor as rule_3 +from tenet.scheme.amr_rule.transduction import atom_value_extractor as rule_4 +from tenet.scheme.amr_rule.transduction import atom_phenomena_extractor as rule_5 from tenet.scheme import amr_rule @@ -80,46 +82,55 @@ def add_triples_in_graph(graph, triple_list): #============================================================================== def test_search_pattern_1(graph): - pattern_result_set = rule_1.__search_pattern(graph) - print(f'\n ----- number of selection found: {len(pattern_result_set)}') - for selection in pattern_result_set: + _, pattern_set = rule_1.__search_pattern(graph) + print(f'\n ----- number of selection found: {len(pattern_set)}') + for row in pattern_set: result_str = f'>>> ' - result_str += f'{selection.leaf.n3(graph.namespace_manager)}' - result_str += f' {selection.conceptName.n3(graph.namespace_manager)}' + result_str += f'{row.leaf.n3(graph.namespace_manager)}' + result_str += f' {row.conceptName.n3(graph.namespace_manager)}' print(result_str) - return pattern_result_set + return pattern_set def test_search_pattern_2(graph): - pattern_result_set = rule_2.__search_pattern(graph) - print(f'\n ----- number of selection found: {len(pattern_result_set)}') - for selection in pattern_result_set: + _, pattern_set = rule_2.__search_pattern(graph) + print(f'\n ----- number of selection found: {len(pattern_set)}') + for row in pattern_set: result_str = f'>>> ' - result_str += f'{selection.baseLeaf.n3(graph.namespace_manager)}' - result_str += f' {selection.conceptName.n3(graph.namespace_manager)}' - result_str += f' {selection.valueLabel.n3(graph.namespace_manager)}' - result_str += f' {selection.classNet.n3(graph.namespace_manager)}' + result_str += f'{row.baseLeaf.n3(graph.namespace_manager)}' + result_str += f' {row.valueLabel.n3(graph.namespace_manager)}' + result_str += f' {row.classNet.n3(graph.namespace_manager)}' print(result_str) - return pattern_result_set + return pattern_set def test_search_pattern_3(graph): - pattern_result_set = rule_3.__search_pattern(graph) - print(f'\n ----- number of selection found: {len(pattern_result_set)}') - for selection in pattern_result_set: + _, pattern_set = rule_3.__search_pattern(graph) + print(f'\n ----- number of selection found: {len(pattern_set)}') + for row in pattern_set: result_str = f'>>> ' - result_str += f'{selection.baseLeaf.n3(graph.namespace_manager)}' - result_str += f' {selection.predicateLabel.n3(graph.namespace_manager)}' + result_str += f'{row.baseLeaf.n3(graph.namespace_manager)}' + result_str += f' {row.predicateLabel.n3(graph.namespace_manager)}' print(result_str) - return pattern_result_set + return pattern_set + + +def test_search_pattern_4(graph): + _, pattern_set = rule_4.__search_pattern(graph) + print(f'\n ----- number of selection found: {len(pattern_set)}') + for row in pattern_set: + result_str = f'>>> ' + result_str += f'{row.valueLabel.n3(graph.namespace_manager)}' + print(result_str) + return pattern_set def test_search_structure(graph): result_set = rule_3.__search_structure(graph) print(f'\n ----- number of selection found: {len(result_set)}') - for selection in result_set: + for row in result_set: result_str = f'>>> ' - result_str += f'{selection.sentenceId.n3(graph.namespace_manager)}' + result_str += f'{row.sentenceId.n3(graph.namespace_manager)}' print(result_str) return result_set @@ -158,7 +169,7 @@ if __name__ == '__main__': print('\n \n') print('\n *** Unit Test ***') - test_rule_application(graph, rule_1.extract_atomic_class) + test_rule_application(graph, rule_1.extract_atom_class) print('\n \n') print('\n ///////////////////// Extraction Rule 2') @@ -170,7 +181,7 @@ if __name__ == '__main__': print('\n \n') print('\n *** Unit Test ***') - test_rule_application(graph, rule_2.extract_atomic_individual) + test_rule_application(graph, rule_2.extract_atom_individual) print('\n \n') print('\n \n') @@ -184,7 +195,20 @@ if __name__ == '__main__': print('\n \n') print('\n *** Unit Test ***') - test_rule_application(graph, rule_3.extract_atomic_property) + test_rule_application(graph, rule_3.extract_atom_property) + print('\n \n') + + print('\n ///////////////////// Extraction Rule 4') + print('\n *** Step Test ***') + + print('\n -- Step 1: Search Pattern') + pattern_set = test_search_pattern_4(graph) + test_search_structure(graph) + + print('\n \n') + + print('\n *** Unit Test ***') + test_rule_application(graph, rule_4.extract_atom_value) print('\n \n') print('\n *** - ***') \ No newline at end of file