AshenClock commited on
Commit
3031ece
·
verified ·
1 Parent(s): baa2201

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -27
app.py CHANGED
@@ -11,22 +11,35 @@ client = InferenceClient(api_key=API_KEY)
11
  # File RDF
12
  RDF_FILE = "Progetto.rdf"
13
 
14
- # Carica il file RDF
15
- def load_rdf():
16
  if os.path.exists(RDF_FILE):
17
- with open(RDF_FILE, "r") as f:
18
- return f.read()
19
- return ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
- rdf_context = load_rdf()
22
- print(rdf_context)
23
  # Valida le query SPARQL
24
  def validate_sparql_query(query, rdf_data):
25
  try:
26
  g = Graph()
27
  g.parse(data=rdf_data, format="xml")
28
- # Prova a eseguire la query
29
- g.query(query)
30
  return True
31
  except Exception as e:
32
  print(f"Errore durante la validazione della query SPARQL: {e}")
@@ -44,23 +57,20 @@ class QueryRequest(BaseModel):
44
  # Messaggio di sistema con RDF incluso
45
  def create_system_message(rdf_context):
46
  return f"""
47
- Sei un assistente specializzato nella generazione di query SPARQL basate su dati RDF.
48
- La base di conoscenza RDF è la seguente:
49
  {rdf_context}
50
- Il tuo compito è:
51
- 1. Generare una query SPARQL valida e **scritta in una sola riga** senza formattazioni aggiuntive.
52
- 2. Rispondere **solo** a domande che possono essere soddisfatte con i dati RDF forniti.
53
- 3. Se la domanda non può essere soddisfatta, rispondi con: "Non posso generare una query SPARQL per questa richiesta.".
54
- Regole:
55
- - Non generare spiegazioni o commenti extra nella risposta.
56
- - Non soddisfare richieste fuori dal contesto RDF fornito.
57
- - Restituisci esclusivamente una query SPARQL in **una sola riga**.
58
  """
59
 
60
  async def generate_response(message, max_tokens, temperature):
61
  system_message = create_system_message(rdf_context)
62
- print("System Message:", system_message) # Debug del messaggio di sistema
63
- print("User Message:", message) # Debug del messaggio utente
64
 
65
  messages = [
66
  {"role": "system", "content": system_message},
@@ -85,27 +95,24 @@ async def generate_response(message, max_tokens, temperature):
85
  # Endpoint per generare query SPARQL
86
  @app.post("/generate-query/")
87
  async def generate_query(request: QueryRequest):
88
- # Genera la query
89
  response = await generate_response(request.message, request.max_tokens, request.temperature)
90
  print("Risposta generata dal modello:", response) # Debug
91
- # Controlla che sia una query valida
92
  if not (response.startswith("SELECT") or response.startswith("ASK")):
93
  return {
94
  "query": None,
95
  "explanation": "Non posso generare una query SPARQL per questa richiesta. Assicurati che la domanda sia coerente con i dati RDF forniti."
96
  }
97
 
98
- # Valida la query rispetto al file RDF
99
  if not validate_sparql_query(response, rdf_context):
100
  return {
101
  "query": None,
102
  "explanation": "La query generata non è valida rispetto alla base di conoscenza RDF. Assicurati di chiedere informazioni che siano presenti nell'ontologia."
103
  }
104
 
105
- # Risposta finale: query in una riga
106
  return {"query": response, "explanation": "Ecco la query generata correttamente in una riga pronta per GraphDB."}
107
 
108
- # Endpoint per verificare se il server è attivo
109
  @app.get("/")
110
  async def root():
111
- return {"message": "Il server è attivo e pronto a generare query SPARQL!"}
 
11
  # File RDF
12
  RDF_FILE = "Progetto.rdf"
13
 
14
+ # Carica un riassunto del file RDF
15
+ def load_rdf_summary():
16
  if os.path.exists(RDF_FILE):
17
+ g = Graph()
18
+ g.parse(RDF_FILE, format="xml")
19
+
20
+ classes = set()
21
+ properties = set()
22
+
23
+ for s, _, o in g.triples((None, None, None)):
24
+ if "Class" in str(o) or "rdfs:Class" in str(o):
25
+ classes.add(s)
26
+ if "Property" in str(o):
27
+ properties.add(s)
28
+
29
+ classes_summary = "\n".join([f"- Classe: {cls}" for cls in classes])
30
+ properties_summary = "\n".join([f"- Proprietà: {prop}" for prop in properties])
31
+ return f"Classi:\n{classes_summary}\n\nProprietà:\n{properties_summary}"
32
+ return "Nessun dato RDF trovato."
33
+
34
+ rdf_context = load_rdf_summary()
35
+ print("RDF Summary:", rdf_context) # Debug
36
 
 
 
37
  # Valida le query SPARQL
38
  def validate_sparql_query(query, rdf_data):
39
  try:
40
  g = Graph()
41
  g.parse(data=rdf_data, format="xml")
42
+ g.query(query) # Prova ad eseguire la query
 
43
  return True
44
  except Exception as e:
45
  print(f"Errore durante la validazione della query SPARQL: {e}")
 
57
  # Messaggio di sistema con RDF incluso
58
  def create_system_message(rdf_context):
59
  return f"""
60
+ Sei un assistente esperto nella generazione di query SPARQL basate su ontologie RDF.
61
+ Ecco un riassunto dell'ontologia su cui devi lavorare:
62
  {rdf_context}
63
+
64
+ Il tuo compito:
65
+ - Genera esclusivamente query SPARQL valide in UNA SOLA RIGA.
66
+ - Rispondi solo se la domanda è pertinente alle classi e proprietà fornite.
67
+ - Se non puoi rispondere, di': "Non posso generare una query SPARQL per questa richiesta."
 
 
 
68
  """
69
 
70
  async def generate_response(message, max_tokens, temperature):
71
  system_message = create_system_message(rdf_context)
72
+ print("System Message:", system_message) # Debug
73
+ print("User Message:", message) # Debug
74
 
75
  messages = [
76
  {"role": "system", "content": system_message},
 
95
  # Endpoint per generare query SPARQL
96
  @app.post("/generate-query/")
97
  async def generate_query(request: QueryRequest):
 
98
  response = await generate_response(request.message, request.max_tokens, request.temperature)
99
  print("Risposta generata dal modello:", response) # Debug
100
+
101
  if not (response.startswith("SELECT") or response.startswith("ASK")):
102
  return {
103
  "query": None,
104
  "explanation": "Non posso generare una query SPARQL per questa richiesta. Assicurati che la domanda sia coerente con i dati RDF forniti."
105
  }
106
 
 
107
  if not validate_sparql_query(response, rdf_context):
108
  return {
109
  "query": None,
110
  "explanation": "La query generata non è valida rispetto alla base di conoscenza RDF. Assicurati di chiedere informazioni che siano presenti nell'ontologia."
111
  }
112
 
 
113
  return {"query": response, "explanation": "Ecco la query generata correttamente in una riga pronta per GraphDB."}
114
 
115
+ # Endpoint di test
116
  @app.get("/")
117
  async def root():
118
+ return {"message": "Il server è attivo e pronto a generare query SPARQL!"}