naas-abi 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. naas_abi/__init__.py +35 -0
  2. naas_abi/agents/AbiAgent.py +442 -0
  3. naas_abi/agents/AbiAgent_test.py +157 -0
  4. naas_abi/agents/EntitytoSPARQLAgent.py +952 -0
  5. naas_abi/agents/EntitytoSPARQLAgent_test.py +66 -0
  6. naas_abi/agents/KnowledgeGraphBuilderAgent.py +321 -0
  7. naas_abi/agents/KnowledgeGraphBuilderAgent_test.py +86 -0
  8. naas_abi/agents/OntologyEngineerAgent.py +115 -0
  9. naas_abi/agents/OntologyEngineerAgent_test.py +42 -0
  10. naas_abi/apps/oxigraph_admin/main.py +392 -0
  11. naas_abi/apps/oxigraph_admin/terminal_style.py +151 -0
  12. naas_abi/apps/sparql_terminal/main.py +68 -0
  13. naas_abi/apps/sparql_terminal/terminal_style.py +236 -0
  14. naas_abi/apps/terminal_agent/main.py +553 -0
  15. naas_abi/apps/terminal_agent/terminal_style.py +175 -0
  16. naas_abi/cli.py +714 -0
  17. naas_abi/mappings.py +83 -0
  18. naas_abi/models/airgap_gemma.py +220 -0
  19. naas_abi/models/airgap_qwen.py +24 -0
  20. naas_abi/models/default.py +23 -0
  21. naas_abi/models/gpt_4_1.py +25 -0
  22. naas_abi/pipelines/AIAgentOntologyGenerationPipeline.py +635 -0
  23. naas_abi/pipelines/AIAgentOntologyGenerationPipeline_test.py +133 -0
  24. naas_abi/pipelines/AddIndividualPipeline.py +215 -0
  25. naas_abi/pipelines/AddIndividualPipeline_test.py +66 -0
  26. naas_abi/pipelines/InsertDataSPARQLPipeline.py +197 -0
  27. naas_abi/pipelines/InsertDataSPARQLPipeline_test.py +96 -0
  28. naas_abi/pipelines/MergeIndividualsPipeline.py +245 -0
  29. naas_abi/pipelines/MergeIndividualsPipeline_test.py +98 -0
  30. naas_abi/pipelines/RemoveIndividualPipeline.py +166 -0
  31. naas_abi/pipelines/RemoveIndividualPipeline_test.py +58 -0
  32. naas_abi/pipelines/UpdateCommercialOrganizationPipeline.py +198 -0
  33. naas_abi/pipelines/UpdateDataPropertyPipeline.py +175 -0
  34. naas_abi/pipelines/UpdateLegalNamePipeline.py +107 -0
  35. naas_abi/pipelines/UpdateLinkedInPagePipeline.py +179 -0
  36. naas_abi/pipelines/UpdatePersonPipeline.py +184 -0
  37. naas_abi/pipelines/UpdateSkillPipeline.py +118 -0
  38. naas_abi/pipelines/UpdateTickerPipeline.py +104 -0
  39. naas_abi/pipelines/UpdateWebsitePipeline.py +106 -0
  40. naas_abi/triggers.py +131 -0
  41. naas_abi/workflows/AgentRecommendationWorkflow.py +321 -0
  42. naas_abi/workflows/AgentRecommendationWorkflow_test.py +160 -0
  43. naas_abi/workflows/ArtificialAnalysisWorkflow.py +337 -0
  44. naas_abi/workflows/ArtificialAnalysisWorkflow_test.py +57 -0
  45. naas_abi/workflows/ConvertOntologyGraphToYamlWorkflow.py +210 -0
  46. naas_abi/workflows/ConvertOntologyGraphToYamlWorkflow_test.py +78 -0
  47. naas_abi/workflows/CreateClassOntologyYamlWorkflow.py +208 -0
  48. naas_abi/workflows/CreateClassOntologyYamlWorkflow_test.py +65 -0
  49. naas_abi/workflows/CreateIndividualOntologyYamlWorkflow.py +183 -0
  50. naas_abi/workflows/CreateIndividualOntologyYamlWorkflow_test.py +86 -0
  51. naas_abi/workflows/ExportGraphInstancesToExcelWorkflow.py +450 -0
  52. naas_abi/workflows/ExportGraphInstancesToExcelWorkflow_test.py +33 -0
  53. naas_abi/workflows/GetObjectPropertiesFromClassWorkflow.py +385 -0
  54. naas_abi/workflows/GetObjectPropertiesFromClassWorkflow_test.py +57 -0
  55. naas_abi/workflows/GetSubjectGraphWorkflow.py +84 -0
  56. naas_abi/workflows/GetSubjectGraphWorkflow_test.py +71 -0
  57. naas_abi/workflows/SearchIndividualWorkflow.py +190 -0
  58. naas_abi/workflows/SearchIndividualWorkflow_test.py +98 -0
  59. naas_abi-1.0.0.dist-info/METADATA +9 -0
  60. naas_abi-1.0.0.dist-info/RECORD +62 -0
  61. naas_abi-1.0.0.dist-info/WHEEL +5 -0
  62. naas_abi-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,190 @@
1
+ from dataclasses import dataclass
2
+ from enum import Enum
3
+ from typing import Annotated, Optional
4
+
5
+ from fastapi import APIRouter
6
+ from langchain_core.tools import BaseTool, StructuredTool
7
+ from naas_abi_core.services.triple_store.TripleStorePorts import ITripleStoreService
8
+ from naas_abi_core.utils.String import normalize
9
+ from naas_abi_core.workflow import Workflow, WorkflowConfiguration
10
+ from naas_abi_core.workflow.workflow import WorkflowParameters
11
+ from pydantic import Field
12
+ from rdflib import query
13
+ from thefuzz import fuzz # type: ignore
14
+
15
+
16
+ @dataclass
17
+ class SearchIndividualWorkflowConfiguration(WorkflowConfiguration):
18
+ """Configuration for SearchIndividual workflow."""
19
+
20
+ triple_store: ITripleStoreService
21
+
22
+
23
+ class SearchIndividualWorkflowParameters(WorkflowParameters):
24
+ """Parameters for SearchIndividual workflow."""
25
+
26
+ search_label: Annotated[
27
+ str,
28
+ Field(
29
+ ...,
30
+ description="Individual label to search for in the ontology schema.",
31
+ example="Naas.ai",
32
+ ),
33
+ ]
34
+ class_uri: Optional[
35
+ Annotated[
36
+ str,
37
+ Field(
38
+ ...,
39
+ description="Class URI to use to search for individuals.",
40
+ example="https://www.commoncoreontologies.org/ont00000443",
41
+ ),
42
+ ]
43
+ ] = None
44
+ limit: Optional[
45
+ Annotated[
46
+ int,
47
+ Field(
48
+ description="Maximum number of results to return.",
49
+ ge=1,
50
+ le=100,
51
+ ),
52
+ ]
53
+ ] = 10
54
+ query: Optional[
55
+ Annotated[
56
+ str,
57
+ Field(
58
+ description="Custom SPARQL query to use to search for individuals.",
59
+ ),
60
+ ]
61
+ ] = None
62
+
63
+
64
+ class SearchIndividualWorkflow(Workflow):
65
+ """Workflow for searching ontology individuals."""
66
+
67
+ __configuration: SearchIndividualWorkflowConfiguration
68
+
69
+ def __init__(self, configuration: SearchIndividualWorkflowConfiguration):
70
+ super().__init__(configuration)
71
+ self.__configuration = configuration
72
+
73
+ def search_individual(
74
+ self, parameters: SearchIndividualWorkflowParameters
75
+ ) -> dict | list[dict]:
76
+ class_uri_filter = (
77
+ f"?individual_uri a <{parameters.class_uri}> ;"
78
+ if parameters.class_uri
79
+ else ""
80
+ )
81
+ search_label_norm = normalize(parameters.search_label)
82
+ sparql_query = f"""
83
+ SELECT DISTINCT ?individual_uri ?label
84
+ WHERE {{
85
+ # Ensure individual is a NamedIndividual
86
+ ?individual_uri a owl:NamedIndividual .
87
+
88
+ {class_uri_filter}
89
+
90
+ {{
91
+ # Search by rdfs:label
92
+ ?individual_uri rdfs:label ?label .
93
+
94
+ # Convert labels to lowercase for comparison
95
+ BIND(LCASE(STR(?label)) AS ?lower_label)
96
+ BIND(LCASE("{parameters.search_label}") AS ?lower_search)
97
+
98
+ # Split search label into words and check if any word matches
99
+ {{
100
+ # Full label match
101
+ FILTER(CONTAINS(?lower_label, ?lower_search) || CONTAINS(?lower_search, ?lower_label))
102
+ }}
103
+ UNION
104
+ {{
105
+ # Word-by-word match
106
+ VALUES ?search_word {{ {" ".join([f'"{word.lower()}"' for word in parameters.search_label.split()])} }}
107
+ FILTER(CONTAINS(?lower_label, ?search_word))
108
+ }}
109
+ }}
110
+ UNION
111
+ {{
112
+ # Search by skos:altLabel
113
+ ?individual_uri skos:altLabel ?label .
114
+
115
+ # Convert labels to lowercase for comparison
116
+ BIND(LCASE(STR(?label)) AS ?lower_label)
117
+ BIND(LCASE("{search_label_norm}") AS ?lower_search)
118
+
119
+ # Split search label into words and check if any word matches
120
+ {{
121
+ # Full label match
122
+ FILTER(CONTAINS(?lower_label, ?lower_search) || CONTAINS(?lower_search, ?lower_label))
123
+ }}
124
+ UNION
125
+ {{
126
+ # Word-by-word match
127
+ VALUES ?search_word {{ {" ".join([f'"{word.lower()}"' for word in search_label_norm.split()])} }}
128
+ FILTER(CONTAINS(?lower_label, ?search_word))
129
+ }}
130
+ }}
131
+ }}
132
+ ORDER BY ?label
133
+ LIMIT {parameters.limit}
134
+ """
135
+ if parameters.query is not None:
136
+ sparql_query = parameters.query
137
+ results = self.__configuration.triple_store.query(sparql_query)
138
+
139
+ # Process results with fuzzy matching
140
+ data = []
141
+ for row in results:
142
+ assert isinstance(row, query.ResultRow)
143
+ data_dict = {}
144
+ for key in row.labels:
145
+ data_dict[key] = str(row[key]) if row[key] else None
146
+ if key == "label" and row[key]:
147
+ score = fuzz.token_set_ratio(
148
+ search_label_norm, normalize(str(row[key]))
149
+ )
150
+ data_dict["score"] = score
151
+ data.append(data_dict)
152
+
153
+ # Sort by best match and remove duplicates
154
+ if len(data) > 0:
155
+ data.sort(
156
+ key=lambda x: x["score"] if x["score"] is not None else 0, reverse=True
157
+ )
158
+ seen = set()
159
+ unique_data = []
160
+ for x in data:
161
+ if x["individual_uri"] not in seen:
162
+ seen.add(x["individual_uri"])
163
+ unique_data.append(x)
164
+ data = unique_data
165
+ return data
166
+
167
+ def as_tools(self) -> list[BaseTool]:
168
+ return [
169
+ StructuredTool(
170
+ name="search_individual",
171
+ description="Search an ontology individual based on its label. It will return the most relevant individual using matching with rdfs:label",
172
+ func=lambda **kwargs: self.search_individual(
173
+ SearchIndividualWorkflowParameters(**kwargs)
174
+ ),
175
+ args_schema=SearchIndividualWorkflowParameters,
176
+ )
177
+ ]
178
+
179
+ def as_api(
180
+ self,
181
+ router: APIRouter,
182
+ route_name: str = "",
183
+ name: str = "",
184
+ description: str = "",
185
+ description_stream: str = "",
186
+ tags: list[str | Enum] | None = None,
187
+ ) -> None:
188
+ if tags is None:
189
+ tags = []
190
+ return None
@@ -0,0 +1,98 @@
1
+ import pytest
2
+ from naas_abi.workflows.SearchIndividualWorkflow import (
3
+ SearchIndividualWorkflow,
4
+ SearchIndividualWorkflowConfiguration,
5
+ SearchIndividualWorkflowParameters,
6
+ )
7
+
8
+
9
+ @pytest.fixture
10
+ def search_individual_workflow() -> SearchIndividualWorkflow:
11
+ from naas_abi import services
12
+
13
+ # Configurations
14
+ search_individual_workflow_configuration = SearchIndividualWorkflowConfiguration(
15
+ triple_store=services.triple_store_service
16
+ )
17
+
18
+ # Workflow
19
+ search_individual_workflow = SearchIndividualWorkflow(
20
+ configuration=search_individual_workflow_configuration
21
+ )
22
+
23
+ return search_individual_workflow
24
+
25
+
26
+ def test_search_individual_workflow(
27
+ search_individual_workflow: SearchIndividualWorkflow,
28
+ ):
29
+ from uuid import uuid4
30
+
31
+ from naas_abi import services
32
+ from naas_abi_core.utils.Graph import TEST
33
+ from rdflib import OWL, RDFS, Graph, Literal, URIRef
34
+
35
+ graph = Graph()
36
+ node_id = str(uuid4())
37
+ graph.add(
38
+ (
39
+ TEST[node_id],
40
+ URIRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
41
+ URIRef("https://www.commoncoreontologies.org/ont00000443"),
42
+ )
43
+ )
44
+ graph.add(
45
+ (
46
+ TEST[node_id],
47
+ URIRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
48
+ OWL.NamedIndividual,
49
+ )
50
+ )
51
+ graph.add((TEST[node_id], RDFS.label, Literal(node_id)))
52
+
53
+ services.triple_store_service.insert(graph)
54
+
55
+ # Test
56
+ result = search_individual_workflow.search_individual(
57
+ SearchIndividualWorkflowParameters(
58
+ search_label=node_id,
59
+ class_uri="https://www.commoncoreontologies.org/ont00000443",
60
+ limit=10,
61
+ query=None,
62
+ )
63
+ )
64
+
65
+ assert isinstance(result, list), result
66
+ assert len(result) == 1, result
67
+ assert result[0]["label"] == node_id, result[0]
68
+
69
+ services.triple_store_service.remove(graph)
70
+
71
+ # Test
72
+ result = search_individual_workflow.search_individual(
73
+ SearchIndividualWorkflowParameters(
74
+ search_label=node_id,
75
+ class_uri="https://www.commoncoreontologies.org/ont00000443",
76
+ limit=10,
77
+ query=None,
78
+ )
79
+ )
80
+
81
+ assert len(result) == 0, result
82
+
83
+
84
+ def test_search_unexisting_individual(
85
+ search_individual_workflow: SearchIndividualWorkflow,
86
+ ):
87
+ # Test
88
+ result = search_individual_workflow.search_individual(
89
+ SearchIndividualWorkflowParameters(
90
+ search_label="kndfggkljkdfjgldfklgdkfgdfg_does_not_exist",
91
+ class_uri="https://www.commoncoreontologies.org/ont00000443",
92
+ limit=10,
93
+ query=None,
94
+ )
95
+ )
96
+
97
+ assert isinstance(result, list), result
98
+ assert len(result) == 0, result
@@ -0,0 +1,9 @@
1
+ Metadata-Version: 2.4
2
+ Name: naas-abi
3
+ Version: 1.0.0
4
+ Summary: Add your description here
5
+ Author-email: Maxime Jublou <maxime@naas.ai>, Florent Ravenel <florent@naas.ai>, Jeremy Ravenel <jeremy@naas.ai>
6
+ Requires-Python: <4,>=3.10
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: naas-abi-core>=1.0.0-dev.1
9
+ Requires-Dist: naas-abi-marketplace>=1.0.0-dev.1
@@ -0,0 +1,62 @@
1
+ naas_abi/__init__.py,sha256=xOa5ED-cLAdFrosaPUJGPT3ThluEfx-0hWSmKzfzcmM,1193
2
+ naas_abi/cli.py,sha256=bfCcxGoQ_iSMhQDDX0-dRCyhc53Nawsy3WAruCNCL7M,27549
3
+ naas_abi/mappings.py,sha256=qu17k8cPwPNKRIqchDMnxViDx0Kn0MTy2XT8XYUIW34,4872
4
+ naas_abi/triggers.py,sha256=ljkgZP2zsTlmkK02ivTPW-yV02pn2TdyRk5CP4kUtvo,4658
5
+ naas_abi/agents/AbiAgent.py,sha256=xbpjtsGIqIOMrg5jL8acpKRCAE2Ik_us5sr8ttbnQRk,18071
6
+ naas_abi/agents/AbiAgent_test.py,sha256=AKggG5RS3zDWnql1DFE7cF7riAHeOdKTZp44WN65Arg,5906
7
+ naas_abi/agents/EntitytoSPARQLAgent.py,sha256=Muf4L2A4B8vV4JKYkj_P0p-5u1XyWIHfWY9S-dmxHmg,57095
8
+ naas_abi/agents/EntitytoSPARQLAgent_test.py,sha256=kx0gkbJoQZqt2_f_RINajwQU5EnHR1PsQx53rh7wJvA,2267
9
+ naas_abi/agents/KnowledgeGraphBuilderAgent.py,sha256=dx0_2VzVsLRi3cRiA0eqmVr-O7qbBrrC5ykW9nbW4_A,13022
10
+ naas_abi/agents/KnowledgeGraphBuilderAgent_test.py,sha256=pKgakywjYCkjEngbaG-D9q9gwNMQEgXeD1C2xb9irTo,2718
11
+ naas_abi/agents/OntologyEngineerAgent.py,sha256=QZRQPRoXfgoT3qqH0U6wM8_o3Zn1KLv0CtYiQkHtC1M,4571
12
+ naas_abi/agents/OntologyEngineerAgent_test.py,sha256=Z5A9u-GKPMlaaUQmI5Yvm9N9mwZTOuyyrqIyrSwrCEI,1319
13
+ naas_abi/apps/oxigraph_admin/main.py,sha256=PHrzl4KOKWMZRLg32SEbEHIhPUj3Uf-Ccqj3072OFYc,13970
14
+ naas_abi/apps/oxigraph_admin/terminal_style.py,sha256=ByiWVYM5Ju8iGMKbs1YwfEwLfLIpaQbB5nPHzb9zdUY,5152
15
+ naas_abi/apps/sparql_terminal/main.py,sha256=v2TD5qFBGlPGajceGdBTTT8QM0f4v-knF-uIKOGLr_c,1824
16
+ naas_abi/apps/sparql_terminal/terminal_style.py,sha256=TYBM2ChnOLSgVw3TA33obBSc_5gAC5kJCuD2dqMOmF4,6560
17
+ naas_abi/apps/terminal_agent/main.py,sha256=7MN88mivIV7gP1lELnqNxP_huwTbavhnTjkNmC9NMw8,19425
18
+ naas_abi/apps/terminal_agent/terminal_style.py,sha256=YOpfvBlKU52wNyGEKbZPiRQVKxug-hI92H8ScV5L8Ew,5254
19
+ naas_abi/models/airgap_gemma.py,sha256=I9pWN_DSgy4h6rT7OiYWDVijyTMoEgONm4xfZYWvp6I,8469
20
+ naas_abi/models/airgap_qwen.py,sha256=EQZ-0tAKZCTCqnovLiGCx4ss0yh2Jjk0xh7wCwDomG8,682
21
+ naas_abi/models/default.py,sha256=Ylj0GzyUDXjmuU0a2V759128bIVmvs-YXGc7o7oJSEQ,648
22
+ naas_abi/models/gpt_4_1.py,sha256=OhwRr49VULUYxatj0cvM5g4mUkaOnl9qb9XK6AuLIiQ,818
23
+ naas_abi/pipelines/AIAgentOntologyGenerationPipeline.py,sha256=ou-0FWBPFc5zkG3q_H3ri9_6AEm9JFDH3r4t5ThpxeU,24621
24
+ naas_abi/pipelines/AIAgentOntologyGenerationPipeline_test.py,sha256=lDsuZKfQlCtLNKQ09nkSHemsvjSNdeZAhaDw-cPYbjo,4130
25
+ naas_abi/pipelines/AddIndividualPipeline.py,sha256=KdrE4eY6Toh9pcJorhZUQ122zt2G5R0ewl9f97A4SVI,8426
26
+ naas_abi/pipelines/AddIndividualPipeline_test.py,sha256=TXCdMdCZCy6Ap1Ar3GCQvQqtIHdEjcECegFCXxbJZeU,2275
27
+ naas_abi/pipelines/InsertDataSPARQLPipeline.py,sha256=EcYRAr9ZIA-bWnKj9vclbgsN9uzXkACXzcJdH5HNl4k,6779
28
+ naas_abi/pipelines/InsertDataSPARQLPipeline_test.py,sha256=XW_CEJfbg-Azi0Y9JjFfEN6ar30a8b2yHSmn0N1oe2A,3245
29
+ naas_abi/pipelines/MergeIndividualsPipeline.py,sha256=6Z644v2OU47jFpfKj6uH6DK0hlbdMTjoR477Iy5dF04,9187
30
+ naas_abi/pipelines/MergeIndividualsPipeline_test.py,sha256=c3QVeXRkEOxZfIPPDQdEpI_9v95R1rXPH8EUWlYtPqk,2990
31
+ naas_abi/pipelines/RemoveIndividualPipeline.py,sha256=aU6ZRWisVQNPVkIwCaJ5BbthyOR5ZW5NGxnUr-Q_QYk,5514
32
+ naas_abi/pipelines/RemoveIndividualPipeline_test.py,sha256=e5kgfT44bFl5wvgr3hSs1mu2tEq1xEyTIiF3KosKiNk,1697
33
+ naas_abi/pipelines/UpdateCommercialOrganizationPipeline.py,sha256=JLuRbVa7Ic6FafEnDL8IoDf6rZqeVTJjRKHPipv_uBU,6749
34
+ naas_abi/pipelines/UpdateDataPropertyPipeline.py,sha256=wtF5akFg6OpOakK4kCjfXhrc3fQkUYNDJuQVei8-qvM,6704
35
+ naas_abi/pipelines/UpdateLegalNamePipeline.py,sha256=5gWMJ8_Uf39g-rhhHb6xBF4g7CTkZH9lrs6HEz5mdEA,3432
36
+ naas_abi/pipelines/UpdateLinkedInPagePipeline.py,sha256=Amb-PH1JIB83axd2Gv_auQHWJmhE1JUBgPv0HOEcOdQ,6161
37
+ naas_abi/pipelines/UpdatePersonPipeline.py,sha256=rycR5IhI7ZP0-YkCflaZLhWX6yzrM2Pd8aYWuhrUxYQ,6244
38
+ naas_abi/pipelines/UpdateSkillPipeline.py,sha256=mv-rnxD_tcZEvJrskRbzIjoIe_Guo1-illcIUeO6YM0,3888
39
+ naas_abi/pipelines/UpdateTickerPipeline.py,sha256=xRnZHKibyJCgsDXGzEsWCHCIWllnecZANSKkjJI87jA,3378
40
+ naas_abi/pipelines/UpdateWebsitePipeline.py,sha256=LboGip58H8dE04jCNAF8jygt21CtmKua-xDwDa1B_Fw,3537
41
+ naas_abi/workflows/AgentRecommendationWorkflow.py,sha256=QSAKib22LiWQQIbuwblQk8AE0b0WAX_huJLJeSC6KdE,12974
42
+ naas_abi/workflows/AgentRecommendationWorkflow_test.py,sha256=9LaYrn3qNbPtKFOBxxL9o6pFKZ3aSxlU3IkKmvh2ok8,5205
43
+ naas_abi/workflows/ArtificialAnalysisWorkflow.py,sha256=tieCFk-JIKbyVLlbdPDFIZLouO58B9ECVGIklgx8KV0,12114
44
+ naas_abi/workflows/ArtificialAnalysisWorkflow_test.py,sha256=glb0WJa19EpyuTqg7SCDkSI5oo_7UCTiDSeHdpaDDUY,1928
45
+ naas_abi/workflows/ConvertOntologyGraphToYamlWorkflow.py,sha256=T5AlTAVDgtoi8joLr9XDVuedEibzKV2E3j7Rss3hreM,7800
46
+ naas_abi/workflows/ConvertOntologyGraphToYamlWorkflow_test.py,sha256=mwKtMzXPe5Iv19n5-XbiIk45IdOuLvHLeTUqSiTyEKY,2467
47
+ naas_abi/workflows/CreateClassOntologyYamlWorkflow.py,sha256=H8znWADOAzlU_0RZCfsmnGH2sFJn8gkIM3p__PIRWqo,7747
48
+ naas_abi/workflows/CreateClassOntologyYamlWorkflow_test.py,sha256=ql_cYfFBFod3sCKEXU0AR_oHtvd5Ykb0OG-tWhYorfk,2091
49
+ naas_abi/workflows/CreateIndividualOntologyYamlWorkflow.py,sha256=kgJ_G4C4VUYfxW1oeDN1rzEYCvujsd_ENil1A3zLjgM,6814
50
+ naas_abi/workflows/CreateIndividualOntologyYamlWorkflow_test.py,sha256=IM5nuTuEG2iYQMCkXBxxNQ0N2I7ua_aWpIVUmIfsELI,2791
51
+ naas_abi/workflows/ExportGraphInstancesToExcelWorkflow.py,sha256=tgSZDqX70QeM7kam4JAK-C2MAQX-qQ8JP-97XafAaPY,19439
52
+ naas_abi/workflows/ExportGraphInstancesToExcelWorkflow_test.py,sha256=N9QKd7lX7N_Q16DAJLQkzKcT07eGJ9zpmiYUXU21OLc,1170
53
+ naas_abi/workflows/GetObjectPropertiesFromClassWorkflow.py,sha256=8Hcqm3bqj-KLjxTFIfGf9Ku9c6U0d2A9VdQpY0RS9FE,14505
54
+ naas_abi/workflows/GetObjectPropertiesFromClassWorkflow_test.py,sha256=GUcIU9m_qwUqRXq8HwQrVW520PGNwq2N5nsNnUbbAkU,1965
55
+ naas_abi/workflows/GetSubjectGraphWorkflow.py,sha256=sKNddfFrk1VNvogcoVxv_Bk-LKlw6XFe5Tgwk3HvH3U,2825
56
+ naas_abi/workflows/GetSubjectGraphWorkflow_test.py,sha256=fzzFYUwojM39x5Ld-59jHMDbGy4Lcq6uO8_BAvZV0ug,1886
57
+ naas_abi/workflows/SearchIndividualWorkflow.py,sha256=d0JasMTP7AEOyvEnZr1KHgagkBo9Tugi2gsk_m6g0E4,6553
58
+ naas_abi/workflows/SearchIndividualWorkflow_test.py,sha256=KBhd58TATMSWWdThYPg7veAySR4hts5LuoygQqQIiaU,2749
59
+ naas_abi-1.0.0.dist-info/METADATA,sha256=yKXsj05nPs1AK97s_fMSmm4pXPURBS2eh8bT4eMtCc8,358
60
+ naas_abi-1.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
61
+ naas_abi-1.0.0.dist-info/top_level.txt,sha256=Dhf3mhATB9-JuvBR8Y55OabvI-PCeQUqb5ae3EMmbeA,9
62
+ naas_abi-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ naas_abi