SRV-PRM-003 - Scripts De Usuários Do iMAX SEG Para O Neo4J
ID: KB-ID-PR-003
Responsável: Thiago Amaral, TI
Status: Publicado
Última Atualização: 19/09/2025
Propósito
Documentar o procedimento para popular e consultar a base de dados de controle de acesso físico da Fictor, utilizando scripts Cypher para o banco de dados de grafos Neo4j.
Aplica-se a
Administradores de sistemas responsáveis pela gestão do banco de dados Neo4j.
Este documento é aplicável a todos os “Colaboradores” da empresa (Estatutários, funcionários, parceiros, estagiários e menor aprendiz).
Pré-requisitos
Acesso a uma instância do banco de dados Neo4j (via Neo4j Browser ou outra ferramenta compatível).
Permissões para executar consultas de escrita (
MERGE,DELETE) e leitura (MATCH) no banco de dados.
Instruções
O procedimento é dividido em duas partes principais: a carga inicial de dados com o script principal e a execução de consultas para análise e filtragem das informações de acesso.
1. Carga de Dados no Neo4j
Este script principal cria todos os nós de Usuários e Portas, e estabelece os relacionamentos de acesso entre eles.
(Opcional) Limpar o Banco de Dados: Se desejar começar com uma base de dados limpa, execute o seguinte comando primeiro:
MATCH (n) DETACH DELETE n;**Executar Script de Carga:** Copie e execute o script completo abaixo no seu Neo4j Browser para criar toda a estrutura de acesso.
// --- SEÇÃO 1: CRIAR NÓS DE USUÁRIOS COM GRUPOS DE ACESSO --- MERGE (u1:User {email: '[email protected]'}) SET u1.accessGroup = 'Administrador'; MERGE (u2:User {email: '[email protected]'}) SET u2.accessGroup = 'Administrador'; MERGE (u3:User {email: '[email protected]'}) SET u3.accessGroup = 'Administrador'; MERGE (u4:User {email: '[email protected]'}) SET u4.accessGroup = 'Administrador'; MERGE (u5:User {email: '[email protected]'}) SET u5.accessGroup = 'Recepção'; MERGE (u6:User {email: '[email protected]'}) SET u6.accessGroup = 'Recepção'; MERGE (u7:User {email: '[email protected]'}) SET u7.accessGroup = 'Recepção'; MERGE (u8:User {email: '[email protected]'}) SET u8.accessGroup = 'Administrador'; MERGE (u9:User {email: '[email protected]'}) SET u9.accessGroup = 'Recepção'; MERGE (u10:User {email: '[email protected]'}) SET u10.accessGroup = 'Recepção'; MERGE (u11:User {email: '[email protected]'}) SET u11.accessGroup = 'Plantão - Fim de Semana'; MERGE (u12:User {email: '[email protected]'}) SET u12.accessGroup = 'Recepção'; MERGE (u13:User {email: '[email protected]'}) SET u13.accessGroup = 'Recepção'; MERGE (u14:User {email: '[email protected]'}) SET u14.accessGroup = 'Recepção'; MERGE (u15:User {email: '[email protected]'}) SET u15.accessGroup = 'Recepção'; MERGE (u16:User {email: '[email protected]'}) SET u16.accessGroup = 'Recepção'; MERGE (u17:User {email: '[email protected]'}) SET u17.accessGroup = 'Recepção'; MERGE (u18:User {email: '[email protected]'}) SET u18.accessGroup = 'Recepção'; MERGE (u19:User {email: '[email protected]'}) SET u19.accessGroup = 'Recepção'; MERGE (u20:User {email: '[email protected]'}) SET u20.accessGroup = 'Administrador'; MERGE (u21:User {email: '[email protected]'}) SET u21.accessGroup = 'Administrador'; MERGE (u22:User {email: '[email protected]'}) SET u22.accessGroup = 'Administrador';// --- SEÇÃO 2: CRIAR NÓS DE PORTAS --- MERGE (:Door {name: '27º ANDAR - Porta Saída Direita Elevadores'}); MERGE (:Door {name: '27º ANDAR - Porta Saída Esquerda Escada'}); MERGE (:Door {name: '27º ANDAR - Recepção'}); MERGE (:Door {name: '27º ANDAR - Sala Técnica'}); MERGE (:Door {name: '28º ANDAR - Diretoria 01'}); MERGE (:Door {name: '28º ANDAR - Diretoria 02'}); MERGE (:Door {name: '28º ANDAR - Diretoria 03'}); MERGE (:Door {name: '28º ANDAR - Diretoria 04'}); MERGE (:Door {name: '28º ANDAR - Diretoria 05'}); MERGE (:Door {name: '28º ANDAR - Diretoria 06'}); MERGE (:Door {name: '28º ANDAR - Porta Saída Direita Elevadores'}); MERGE (:Door {name: '28º ANDAR - Porta Saída Esquerda Escada'}); MERGE (:Door {name: '28º ANDAR - Recepção'}); MERGE (:Door {name: '28º ANDAR - Sala Técnica'}); MERGE (:Door {name: 'Térreo - Acesso'}); // --- SEÇÃO 3: CRIAR RELACIONAMENTOS DE ACESSO --- MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Esquerda Escada', '27º ANDAR - Recepção'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Esquerda Escada', '27º ANDAR - Recepção', '27º ANDAR - Sala Técnica', '28º ANDAR - Porta Saída Direita Elevadores', '28º ANDAR - Porta Saída Esquerda Escada', '28º ANDAR - Recepção', '28º ANDAR - Sala Técnica', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door {name: '27º ANDAR - Recepção'}) MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Recepção', '28º ANDAR - Recepção'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Esquerda Escada', '27º ANDAR - Recepção', '28º ANDAR - Porta Saída Esquerda Escada', '28º ANDAR - Recepção', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Direita Elevadores', '28º ANDAR - Porta Saída Direita Elevadores', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Recepção', '27º ANDAR - Sala Técnica', '28º ANDAR - Recepção', '28º ANDAR - Sala Técnica', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door {name: '27º ANDAR - Porta Saída Direita Elevadores'}) MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Direita Elevadores', '27º ANDAR - Porta Saída Esquerda Escada', '28º ANDAR - Porta Saída Direita Elevadores', '28º ANDAR - Porta Saída Esquerda Escada'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Recepção', '28º ANDAR - Recepção'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Recepção', '28º ANDAR - Diretoria 03', '28º ANDAR - Diretoria 04'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door {name: '27º ANDAR - Recepção'}) MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Recepção', '28º ANDAR - Recepção', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Direita Elevadores', '27º ANDAR - Porta Saída Esquerda Escada', '27º ANDAR - Recepção'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Recepção', '28º ANDAR - Recepção', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Direita Elevadores', '27º ANDAR - Porta Saída Esquerda Escada', '27º ANDAR - Recepção', '28º ANDAR - Porta Saída Direita Elevadores', '28º ANDAR - Porta Saída Esquerda Escada', '28º ANDAR - Recepção'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['28º ANDAR - Porta Saída Direita Elevadores', '28º ANDAR - Recepção', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Sala Técnica', '28º ANDAR - Sala Técnica', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Esquerda Escada', '27º ANDAR - Sala Técnica', '28º ANDAR - Porta Saída Esquerda Escada', '28º ANDAR - Sala Técnica', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d); MATCH (u:User {email: '[email protected]'}), (d:Door) WHERE d.name IN ['27º ANDAR - Porta Saída Direita Elevadores', '27º ANDAR - Recepção', '28º ANDAR - Porta Saída Direita Elevadores', '28º ANDAR - Recepção', 'Térreo - Acesso'] MERGE (u)-[:HAS_ACCESS]->(d);
2. Scripts de Consulta e Análise
Após carregar os dados, use as seguintes consultas para filtrar e analisar as permissões de acesso.
Listar todos os usuários com acesso APENAS ao 27º Andar:
MATCH (u:User)-[:HAS_ACCESS]->(d:Door) WITH u, collect(d) AS doors WHERE size(doors) > 0 AND ALL(door IN doors WHERE door.name STARTS WITH '27º ANDAR') MATCH (u)-[r:HAS_ACCESS]->(d_final:Door) RETURN u, r, d_final;Listar todos os usuários com acesso APENAS ao 28º Andar:
MATCH (u:User)-[:HAS_ACCESS]->(d:Door) WITH u, collect(d) AS doors WHERE size(doors) > 0 AND ALL(door IN doors WHERE door.name STARTS WITH '28º ANDAR') MATCH (u)-[r:HAS_ACCESS]->(d_final:Door) RETURN u, r, d_final;Listar todos os usuários com acesso a AMBOS os andares (27º e 28º):
MATCH (u:User) WHERE EXISTS { (u)-[:HAS_ACCESS]->(:Door {name: name WHERE name STARTS WITH '27º ANDAR'}) } AND EXISTS { (u)-[:HAS_ACCESS]->(:Door {name: name WHERE name STARTS WITH '28º ANDAR'}) } MATCH (u)-[r:HAS_ACCESS]->(d:Door) RETURN u, r, d;Listar todos os usuários do grupo "Administrador" e seus acessos:
MATCH (u:User {accessGroup: 'Administrador'})-[r:HAS_ACCESS]->(d:Door) RETURN u, r, d;Listar todos os usuários do grupo "Recepção" e seus acessos:
MATCH (u:User {accessGroup: 'Recepção'})-[r:HAS_ACCESS]->(d:Door) RETURN u, r, d;
3. (Opcional) Formatação de Nomes de Exibição
Para facilitar a visualização no grafo, execute o comando abaixo para criar uma propriedade displayName em cada nó de usuário.
MATCH (u:User)
SET u.displayName = split(u.email, '@')[0] + ' | ' + u.accessGroup;Resultado Esperado
Uma base de dados Neo4j populada com os nós de usuários (User) e portas (Door), e os relacionamentos (HAS_ACCESS) que definem o controle de acesso físico. As consultas de filtro devem retornar listas de usuários precisas com base nos critérios de acesso.
Solução de Problemas
Problema/Erro: A consulta para "acesso APENAS ao 27º andar" retorna usuários que também têm acesso a outros andares. * Solução: O erro ocorre por usar uma consulta
WHEREsimples. É necessário usar uma consulta mais complexa que verifique se TODAS as permissões de um usuário são para aquele andar, conforme fornecido na seção "Scripts de Consulta e Análise" deste documento.
Artigos Relacionados
Não se aplica.
Anexos
Não se aplica.
Referências
Não se aplica.
Histórico de Revisões
19/09/2025
1.0
Thiago Amaral
Confecção do documento.
Last updated