Package: qanary-helpers
Qanary Helpers libraryQanary Helpers implements registration and querying functionality forthe Qanary framework.This library is used within a Python Qanary Component.InstallVia PIPpipinstallqanary_helpersLatest version from GitHubgitclonehttps://github.com/Perevalov/qanary_helpers.gitcdqanary_helpers
pipinstall.UsageFor the "Hello world example" create a file namedcomponent.pyin your working directory. Then, fill the file with the
following code (pay attention to theTODOcomments):importosfromdatetimeimportdatetimefromfastapiimportFastAPI,Requestfromfastapi.responsesimportJSONResponse,PlainTextResponseimportuvicornfromqanary_helpers.registrationimportRegistrationfromqanary_helpers.registratorimportRegistratorfromqanary_helpers.qanary_queriesimportinsert_into_triplestore,get_text_question_in_graphfromqanary_helpers.loggingimportMLFlowLoggerifnotos.getenv("PRODUCTION"):fromdotenvimportload_dotenvload_dotenv()# required for debugging outside DockerSPRING_BOOT_ADMIN_URL=os.environ['SPRING_BOOT_ADMIN_URL']SPRING_BOOT_ADMIN_USERNAME=os.environ['SPRING_BOOT_ADMIN_USERNAME']SPRING_BOOT_ADMIN_PASSWORD=os.environ['SPRING_BOOT_ADMIN_PASSWORD']SERVICE_HOST=os.environ['SERVICE_HOST']SERVICE_PORT=os.environ['SERVICE_PORT']SERVICE_NAME_COMPONENT=os.environ['SERVICE_NAME_COMPONENT']SERVICE_DESCRIPTION_COMPONENT=os.environ['SERVICE_DESCRIPTION_COMPONENT']URL_COMPONENT=f"{SERVICE_HOST}"# While using server with permanent external IP address: URL_COMPONENT = f"http://{SERVICE_HOST}:{SERVICE_PORT}"app=FastAPI()@app.post("/annotatequestion")asyncdefqanary_service(request:Request):request_json=awaitrequest.json()triplestore_endpoint_url=request_json["values"]["urn:qanary#endpoint"]triplestore_ingraph_uuid=request_json["values"]["urn:qanary#inGraph"]# get question text from triplestorequestion_text=get_text_question_in_graph(triplestore_endpoint_url,triplestore_ingraph_uuid)[0]['text']# Start TODO: configure your business logic here and adjust the sparql query# here we simulate that our component created this sparql query:sparql_query="""PREFIX dbr: <http://dbpedia.org/resource/>PREFIX dbo: <http://dbpedia.org/ontology/>SELECT * WHERE {dbr:Angela_Merkel dbo:birthPlace ?uri .}"""# and this "generated" query is stored in the triplestore with this INSERT query:SPARQLquery="""PREFIX dbr: <http://dbpedia.org/resource/>PREFIX dbo: <http://dbpedia.org/ontology/>PREFIX qa: <http://www.wdaqua.eu/qa#>PREFIX oa: <http://www.w3.org/ns/openannotation/core/>PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>INSERT {{GRAPH <{uuid}> {{?newAnnotation rdf:type qa:AnnotationOfAnswerSPARQL .?newAnnotation oa:hasTarget <{question_uri}> .?newAnnotation oa:hasBody\"{sparql_query}\"^^xsd:string .?newAnnotation qa:score\"1.0\"^^xsd:float .?newAnnotation oa:annotatedAt ?time .?newAnnotation oa:annotatedBy <urn:qanary:{component}> .}}}}WHERE {{BIND (IRI(str(RAND())) AS ?newAnnotation) .BIND (now() as ?time)}}""".format(uuid=triplestore_ingraph_uuid,question_uri=triplestore_endpoint_url,component=SERVICE_NAME_COMPONENT.replace(" ","-"),sparql_query=sparql_query.replace("\n","\\n").replace("\"","\\\""))insert_into_triplestore(triplestore_endpoint_url,SPARQLquery)# inserting new data to the triplestore# Initializing logging with MLFlow# TODO: Update connection settings, if necessarylogger=MLFlowLogger()# logging the annotation of the component# TODO: replace "sparql_query" with your annotation datalogger.log_annotation(SERVICE_NAME_COMPONENT,question_text,sparql_query,triplestore_ingraph_uuid)# End TODOreturnJSONResponse(content=request_json)@app.get("/health")defhealth():returnPlainTextResponse(content="alive")metadata={"start":datetime.now().strftime("%Y-%m-%d%H:%M:%S"),"description":SERVICE_DESCRIPTION_COMPONENT,"written in":"Python"}print(metadata)registration=Registration(name=SERVICE_NAME_COMPONENT,serviceUrl=f"{URL_COMPONENT}",healthUrl=f"{URL_COMPONENT}/health",metadata=metadata)reg_thread=Registrator(SPRING_BOOT_ADMIN_URL,SPRING_BOOT_ADMIN_USERNAME,SPRING_BOOT_ADMIN_PASSWORD,registration)reg_thread.setDaemon(True)reg_thread.start()if__name__=="__main__":uvicorn.run(app,host="0.0.0.0",port=int(SERVICE_PORT))As you may see, several environment variables has to be set before the script execution:SPRING_BOOT_ADMIN_URL-- URL of the Qanary pipeline (see Step 1 and Step 2 of thetutorial)SPRING_BOOT_ADMIN_USERNAME-- the admin username of the Qanary pipelineSPRING_BOOT_ADMIN_PASSWORD-- the admin password of the Qanary pipelineSERVICE_HOST-- the host of your component without protocol prefix (e.g.http://). It has to be visible to the Qanary pipelineSERVICE_PORT-- the port of your component (has to be visible to the Qanary pipeline)SERVICE_NAME_COMPONENT-- the name of your componentSERVICE_DESCRIPTION_COMPONENT-- the description of your componentYou may also change the configuration via environment variables to any configuration that you want (e.g. via ajsonfile).To run the component, simply executepython component.pyin your terminal.
If the component registration was successful, a corresponding message will appear in the output.