Files
AI/참고/ontocast-main/ontocast/cli/merge_ontologies.py
2026-05-12 19:40:31 +09:00

88 lines
2.4 KiB
Python

"""CLI script to merge terminal ontologies from Fuseki.
This script:
1. Fetches all terminal ontologies for a given IRI from Fuseki
2. Merges them pair-wise starting from the oldest pair
3. Continues until only one terminal ontology per IRI remains
4. Plots the ontology graph using pygraphviz
"""
import asyncio
import logging
from pathlib import Path
import click
from dotenv import load_dotenv
from ontocast.config import Config
from ontocast.onto.ontology_operations import (
merge_terminal_ontologies,
plot_ontology_graph,
)
from ontocast.tool.ontology_manager import OntologyManager
from ontocast.tool.triple_manager.fuseki import FusekiTripleStoreManager
logger = logging.getLogger(__name__)
@click.command()
@click.option(
"--env-file",
type=click.Path(path_type=Path),
required=True,
default=".env",
help="Path to .env file containing configuration",
)
@click.option(
"--iri",
type=str,
required=True,
help="IRI of the ontology to merge",
)
@click.option(
"--output",
type=click.Path(path_type=Path),
default="ontology_graph.png",
help="Output path for the graph visualization",
)
def main(env_file: Path, iri: str, output: Path):
"""Merge terminal ontologies from Fuseki and plot the result."""
# Load configuration
load_dotenv(dotenv_path=env_file.expanduser())
config = Config()
# Validate configuration
config.validate_llm_config()
# Create Fuseki manager
tool_config = config.get_tool_config()
if not (tool_config.fuseki.uri and tool_config.fuseki.auth):
raise ValueError("Fuseki configuration required (FUSEKI_URI and FUSEKI_AUTH)")
fuseki_manager = FusekiTripleStoreManager(
uri=tool_config.fuseki.uri,
auth=tool_config.fuseki.auth,
dataset=tool_config.fuseki.dataset,
ontologies_dataset=tool_config.fuseki.ontologies_dataset,
)
# Create ontology manager
ontology_manager = OntologyManager()
# Merge ontologies
async def run_merge():
result = await merge_terminal_ontologies(fuseki_manager, ontology_manager, iri)
if result:
logger.info("Merge completed successfully")
# Plot the graph
plot_ontology_graph(ontology_manager, output, iri)
else:
logger.error("Merge failed - no result")
asyncio.run(run_merge())
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
main()