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.

  1. (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;
  2. **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 WHERE simples. É 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

Data
Versão
Autor
Descrição das Mudanças

19/09/2025

1.0

Thiago Amaral

Confecção do documento.

Last updated