File size: 11,394 Bytes
98e79f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# graph_knowledge.py — Popula Neo4j com base de conhecimento dos projetos
CYPHER_SCHEMA = """
// ── NÓS ──────────────────────────────────────────────────────

// Projetos
MERGE (p1:Projeto {nome: 'Sistema Imune Digital'})
SET p1.descricao = 'Sistema de detecção de fraude bancária com Deep RL. Agente DQN Dueling com 3 agentes especialistas orquestrados.',
    p1.paradigma = 'Deep Reinforcement Learning',
    p1.dado = 'Sintético',
    p1.url = 'https://huggingface.co/spaces/Danielfonseca1212/sistema-imune',
    p1.emoji = '🛡️',
    p1.ano = 2024;

MERGE (p2:Projeto {nome: 'HetGNN Fraud'})
SET p2.descricao = 'Heterogeneous Graph Neural Network com 5 tipos de nó e 7 tipos de aresta. HGTConv aprende atenção separada por tipo de relação.',
    p2.paradigma = 'Supervised GNN',
    p2.dado = 'Sintético',
    p2.url = 'https://huggingface.co/spaces/Danielfonseca1212/hetgnn-fraud',
    p2.emoji = '🕸️',
    p2.ano = 2024;

MERGE (p3:Projeto {nome: 'TGN Fraud Detection'})
SET p3.descricao = 'Temporal Graph Network com memória evolutiva por nó via GRU. Detecta fraude em stream de e-commerce em tempo real.',
    p3.paradigma = 'Temporal GNN',
    p3.dado = 'Sintético',
    p3.url = 'https://huggingface.co/spaces/Danielfonseca1212/tgn-fraud',
    p3.emoji = '⏱️',
    p3.ano = 2024;

MERGE (p4:Projeto {nome: 'DOMINANT'})
SET p4.descricao = 'Deep Anomaly Detection on Attributed Networks (IJCAI 2019). Detecta anomalias em grafo sem nenhum label no treino.',
    p4.paradigma = 'Unsupervised GNN',
    p4.dado = 'Sintético',
    p4.url = 'https://huggingface.co/spaces/Danielfonseca1212/dominant-anomaly',
    p4.emoji = '🔬',
    p4.ano = 2024;

MERGE (p5:Projeto {nome: 'GraphSAGE Elliptic'})
SET p5.descricao = 'GraphSAGE inductive vs GCN vs MLP no dataset Elliptic Bitcoin real (MIT). 203k transações reais com split temporal.',
    p5.paradigma = 'Inductive GNN',
    p5.dado = 'Real',
    p5.url = 'https://huggingface.co/spaces/Danielfonseca1212/elliptic-graphsage',
    p5.emoji = '₿',
    p5.ano = 2024;

// Tecnologias
MERGE (t1:Tecnologia {nome: 'PyTorch'});
MERGE (t2:Tecnologia {nome: 'PyTorch Geometric'});
MERGE (t3:Tecnologia {nome: 'Neo4j Aura'});
MERGE (t4:Tecnologia {nome: 'Streamlit'});
MERGE (t5:Tecnologia {nome: 'DQN Dueling'});
MERGE (t6:Tecnologia {nome: 'HGTConv'});
MERGE (t7:Tecnologia {nome: 'SAGEConv'});
MERGE (t8:Tecnologia {nome: 'GCNConv'});
MERGE (t9:Tecnologia {nome: 'GRU Memory'});
MERGE (t10:Tecnologia {nome: 'Time2Vec'});
MERGE (t11:Tecnologia {nome: 'GCN Encoder'});
MERGE (t12:Tecnologia {nome: 'Autoencoder'});
MERGE (t13:Tecnologia {nome: 'GraphSAGE'});
MERGE (t14:Tecnologia {nome: 'Hugging Face Spaces'});
MERGE (t15:Tecnologia {nome: 'OpenAI GPT'});
MERGE (t16:Tecnologia {nome: 'Cypher'});

// Conceitos
MERGE (c1:Conceito {nome: 'Detecção de Fraude'})
SET c1.descricao = 'Identificação automática de transações fraudulentas em sistemas financeiros.';
MERGE (c2:Conceito {nome: 'Graph Neural Network'})
SET c2.descricao = 'Redes neurais que operam diretamente em dados estruturados como grafos.';
MERGE (c3:Conceito {nome: 'Aprendizado por Reforço'})
SET c3.descricao = 'Paradigma onde agente aprende por tentativa e erro maximizando recompensa.';
MERGE (c4:Conceito {nome: 'Grafo Heterogêneo'})
SET c4.descricao = 'Grafo com múltiplos tipos de nó e aresta, cada um com semântica diferente.';
MERGE (c5:Conceito {nome: 'Grafo Temporal'})
SET c5.descricao = 'Grafo que evolui no tempo, com eventos ordenados temporalmente.';
MERGE (c6:Conceito {nome: 'Anomaly Detection'})
SET c6.descricao = 'Detecção de padrões incomuns sem necessidade de labels supervisionados.';
MERGE (c7:Conceito {nome: 'Inductive Learning'})
SET c7.descricao = 'Modelo que generaliza para nós/grafos novos sem retreinar.';
MERGE (c8:Conceito {nome: 'Message Passing'})
SET c8.descricao = 'Mecanismo onde nós agregam informação dos vizinhos iterativamente.';
MERGE (c9:Conceito {nome: 'Attention Mechanism'})
SET c9.descricao = 'Pesos aprendidos que determinam a importância de cada vizinho.';
MERGE (c10:Conceito {nome: 'Memory Module'})
SET c10.descricao = 'Vetor de estado por nó que acumula histórico de interações.';
MERGE (c11:Conceito {nome: 'Node Classification'})
SET c11.descricao = 'Tarefa de prever a classe de cada nó no grafo.';
MERGE (c12:Conceito {nome: 'Unsupervised Learning'})
SET c12.descricao = 'Aprendizado sem labels — modelo descobre estrutura nos dados.';

// Papers
MERGE (pp1:Paper {titulo: 'Human-level control through deep reinforcement learning'})
SET pp1.autores = 'Mnih et al.', pp1.venue = 'Nature 2015', pp1.modelo = 'DQN';
MERGE (pp2:Paper {titulo: 'Heterogeneous Graph Transformer'})
SET pp2.autores = 'Hu et al.', pp2.venue = 'WWW 2020', pp2.modelo = 'HGT';
MERGE (pp3:Paper {titulo: 'Temporal Graph Networks'})
SET pp3.autores = 'Rossi et al.', pp3.venue = 'ICML 2020', pp3.modelo = 'TGN';
MERGE (pp4:Paper {titulo: 'Deep Anomaly Detection on Attributed Networks'})
SET pp4.autores = 'Ding et al.', pp4.venue = 'IJCAI 2019', pp4.modelo = 'DOMINANT';
MERGE (pp5:Paper {titulo: 'Inductive Representation Learning on Large Graphs'})
SET pp5.autores = 'Hamilton et al.', pp5.venue = 'NeurIPS 2017', pp5.modelo = 'GraphSAGE';

// Métricas (aproximadas — baseadas em dados sintéticos)
MERGE (m1:Metrica {projeto: 'HetGNN Fraud', tipo: 'AUC'})
SET m1.valor = 0.89, m1.dataset = 'Sintético';
MERGE (m2:Metrica {projeto: 'TGN Fraud Detection', tipo: 'AUC'})
SET m2.valor = 0.91, m2.dataset = 'Sintético';
MERGE (m3:Metrica {projeto: 'DOMINANT', tipo: 'AUC'})
SET m3.valor = 0.84, m3.dataset = 'Sintético';
MERGE (m4:Metrica {projeto: 'GraphSAGE Elliptic', tipo: 'AUC'})
SET m4.valor = 0.97, m4.dataset = 'Elliptic Bitcoin Real';

// ── ARESTAS ───────────────────────────────────────────────────

// Projetos USAM tecnologias
MATCH (p:Projeto {nome:'Sistema Imune Digital'}), (t:Tecnologia {nome:'PyTorch'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'Sistema Imune Digital'}), (t:Tecnologia {nome:'DQN Dueling'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'Sistema Imune Digital'}), (t:Tecnologia {nome:'Neo4j Aura'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'Sistema Imune Digital'}), (t:Tecnologia {nome:'Streamlit'}) MERGE (p)-[:USA]->(t);

MATCH (p:Projeto {nome:'HetGNN Fraud'}), (t:Tecnologia {nome:'PyTorch Geometric'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'HetGNN Fraud'}), (t:Tecnologia {nome:'HGTConv'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'HetGNN Fraud'}), (t:Tecnologia {nome:'Neo4j Aura'}) MERGE (p)-[:USA]->(t);

MATCH (p:Projeto {nome:'TGN Fraud Detection'}), (t:Tecnologia {nome:'GRU Memory'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'TGN Fraud Detection'}), (t:Tecnologia {nome:'Time2Vec'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'TGN Fraud Detection'}), (t:Tecnologia {nome:'PyTorch'}) MERGE (p)-[:USA]->(t);

MATCH (p:Projeto {nome:'DOMINANT'}), (t:Tecnologia {nome:'GCN Encoder'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'DOMINANT'}), (t:Tecnologia {nome:'Autoencoder'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'DOMINANT'}), (t:Tecnologia {nome:'PyTorch Geometric'}) MERGE (p)-[:USA]->(t);

MATCH (p:Projeto {nome:'GraphSAGE Elliptic'}), (t:Tecnologia {nome:'GraphSAGE'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'GraphSAGE Elliptic'}), (t:Tecnologia {nome:'SAGEConv'}) MERGE (p)-[:USA]->(t);
MATCH (p:Projeto {nome:'GraphSAGE Elliptic'}), (t:Tecnologia {nome:'GCNConv'}) MERGE (p)-[:USA]->(t);

// Projetos IMPLEMENTAM conceitos
MATCH (p:Projeto {nome:'Sistema Imune Digital'}), (c:Conceito {nome:'Aprendizado por Reforço'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'Sistema Imune Digital'}), (c:Conceito {nome:'Detecção de Fraude'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'HetGNN Fraud'}), (c:Conceito {nome:'Grafo Heterogêneo'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'HetGNN Fraud'}), (c:Conceito {nome:'Attention Mechanism'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'HetGNN Fraud'}), (c:Conceito {nome:'Node Classification'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'TGN Fraud Detection'}), (c:Conceito {nome:'Grafo Temporal'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'TGN Fraud Detection'}), (c:Conceito {nome:'Memory Module'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'DOMINANT'}), (c:Conceito {nome:'Anomaly Detection'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'DOMINANT'}), (c:Conceito {nome:'Unsupervised Learning'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'GraphSAGE Elliptic'}), (c:Conceito {nome:'Inductive Learning'}) MERGE (p)-[:IMPLEMENTA]->(c);
MATCH (p:Projeto {nome:'GraphSAGE Elliptic'}), (c:Conceito {nome:'Message Passing'}) MERGE (p)-[:IMPLEMENTA]->(c);

// Projetos REFERENCIAM papers
MATCH (p:Projeto {nome:'Sistema Imune Digital'}), (pp:Paper {modelo:'DQN'}) MERGE (p)-[:REFERENCIA]->(pp);
MATCH (p:Projeto {nome:'HetGNN Fraud'}), (pp:Paper {modelo:'HGT'}) MERGE (p)-[:REFERENCIA]->(pp);
MATCH (p:Projeto {nome:'TGN Fraud Detection'}), (pp:Paper {modelo:'TGN'}) MERGE (p)-[:REFERENCIA]->(pp);
MATCH (p:Projeto {nome:'DOMINANT'}), (pp:Paper {modelo:'DOMINANT'}) MERGE (p)-[:REFERENCIA]->(pp);
MATCH (p:Projeto {nome:'GraphSAGE Elliptic'}), (pp:Paper {modelo:'GraphSAGE'}) MERGE (p)-[:REFERENCIA]->(pp);

// Projetos TEM métricas
MATCH (p:Projeto {nome:'HetGNN Fraud'}), (m:Metrica {projeto:'HetGNN Fraud'}) MERGE (p)-[:TEM_METRICA]->(m);
MATCH (p:Projeto {nome:'TGN Fraud Detection'}), (m:Metrica {projeto:'TGN Fraud Detection'}) MERGE (p)-[:TEM_METRICA]->(m);
MATCH (p:Projeto {nome:'DOMINANT'}), (m:Metrica {projeto:'DOMINANT'}) MERGE (p)-[:TEM_METRICA]->(m);
MATCH (p:Projeto {nome:'GraphSAGE Elliptic'}), (m:Metrica {projeto:'GraphSAGE Elliptic'}) MERGE (p)-[:TEM_METRICA]->(m);

// DIFERENTE_DE (para comparação)
MATCH (p1:Projeto {nome:'DOMINANT'}), (p2:Projeto {nome:'HetGNN Fraud'})
MERGE (p1)-[:DIFERENTE_DE {motivo: 'DOMINANT não usa labels, HetGNN usa supervisão'}]->(p2);
MATCH (p1:Projeto {nome:'GraphSAGE Elliptic'}), (p2:Projeto {nome:'HetGNN Fraud'})
MERGE (p1)-[:DIFERENTE_DE {motivo: 'GraphSAGE é inductive, HetGNN é transductive'}]->(p2);
"""

def popular_neo4j(driver, database):
    """Executa o schema Cypher para popular a base de conhecimento."""
    statements = [s.strip() for s in CYPHER_SCHEMA.split(';') if s.strip()]
    erros = []
    with driver.session(database=database) as session:
        for stmt in statements:
            try:
                session.run(stmt)
            except Exception as e:
                erros.append(str(e))
    return len(statements), erros

def verificar_schema(driver, database):
    """Retorna contagem de nós e arestas por tipo."""
    with driver.session(database=database) as session:
        nos = session.run("""
            MATCH (n) 
            RETURN labels(n)[0] AS tipo, count(n) AS total
            ORDER BY total DESC
        """).data()
        arestas = session.run("""
            MATCH ()-[r]->()
            RETURN type(r) AS tipo, count(r) AS total
            ORDER BY total DESC
        """).data()
    return nos, arestas