File size: 2,386 Bytes
5d05c8b
d680d0f
 
 
5d05c8b
d680d0f
5d05c8b
 
 
 
 
 
 
 
d680d0f
5d05c8b
d680d0f
 
cc65e33
d680d0f
cc65e33
d680d0f
cc65e33
 
 
 
d680d0f
 
cc65e33
 
d680d0f
cc65e33
d680d0f
 
 
7a0bb61
cc65e33
d680d0f
7a0bb61
 
d680d0f
5d05c8b
d680d0f
7a0bb61
d680d0f
5d05c8b
7a0bb61
 
5d05c8b
7a0bb61
d680d0f
5d05c8b
12a82f7
5d05c8b
d680d0f
7a0bb61
 
 
 
 
d680d0f
 
 
5d05c8b
d680d0f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""
MODULE INFERENCE ENGINE - GOLDEN RECORD
=======================================
Responsabilité : Créer une vérité unique (montant_net) à partir des données brutes.
"""
from rdflib import Namespace

VORTEX = Namespace("http://vortex.ai/ontology#")

class InferenceEngine:
    def __init__(self, rdf_store):
        self.rdf_store = rdf_store

    def run_inference(self):
        print("🧠 [R-BOX] Inférence (Golden Records)...")
        
        # 1. GOLDEN RECORD : Déduplication des Montants
        # On prend le MAX des montants déclarés pour un même ID de prêt
        rule_dedup = """
        CONSTRUCT { ?pret vortex:montant_net ?max_val . }
        WHERE {
            SELECT ?pret (MAX(xsd:decimal(?val)) AS ?max_val) WHERE {
                ?pret a ?type .
                ?pret ?p ?val_raw .
                FILTER(CONTAINS(LCASE(STR(?p)), "montant") || CONTAINS(LCASE(STR(?p)), "capital"))
                FILTER(isNumeric(xsd:decimal(?val_raw)))
                BIND(xsd:decimal(?val_raw) AS ?val)
            } GROUP BY ?pret
        }
        """
        self._apply_rule(rule_dedup, "Création Golden Record (montant_net)")

        # 2. HIGH VALUE : Marquage automatique (> 100k)
        rule_high_value = """
        CONSTRUCT { ?pret vortex:statut_risque "HighValue" . }
        WHERE {
            ?pret vortex:montant_net ?m .
            FILTER(?m > 100000)
        }
        """
        self._apply_rule(rule_high_value, "Détection HighValue (>100k)")

        # 3. RELATIONS INVERSES (Pour lier Prêt <-> Client)
        rule_inverse = """
        CONSTRUCT { ?pret vortex:a_emprunteur ?client_label . }
        WHERE {
            ?client vortex:possede_pret ?pret .
            ?client rdfs:label ?client_label .
        }
        """
        self._apply_rule(rule_inverse, "Inverse Emprunteur")

    def _apply_rule(self, sparql, name):
        try:
            full_query = f"""
            PREFIX vortex: <http://vortex.ai/ontology#>
            PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
            PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
            {sparql}
            """
            res = self.rdf_store.g.query(full_query)
            for t in res: self.rdf_store.g.add(t)
            print(f"✅ Règle '{name}' appliquée.")
        except Exception as e:
            print(f"❌ Erreur Règle '{name}' : {e}")