Pesquisa de site

Como instalar e configurar o banco de dados gráfico Neo4j no Ubuntu 22.04


Nesta página

  1. Pré-requisitos
  2. Etapa 1 - Instalar o Neo4j
  3. Etapa 2 - Conexão de teste
  4. Etapa 3 - Configurar o Neo4j para Acesso Remoto
  5. Etapa 4 - Configurar o acesso do firewall (UFW)
  6. Etapa 5 - Use o Neo4j
  7. Conclusão

Neo4j é um banco de dados gráfico usado para criar relacionamentos de dados. Os dados dentro dos bancos de dados tradicionais são salvos em uma estrutura semelhante a uma tabela. Um banco de dados gráfico registra relacionamentos entre nós de dados. Cada nó armazena referências a todos os outros nós aos quais está conectado. Bancos de dados tradicionais não salvam dados de relacionamento diretamente, mas podem descobrir conexões pesquisando em estruturas de dados com a ajuda de indexação que é cara e demorada. Um banco de dados gráfico como o Neo4j evita toda essa sobrecarga e pode codificar e consultar relacionamentos complexos.

Neo4j é desenvolvido pela Neo Technology. Ele é escrito em Java e Scala e está disponível em uma versão comunitária gratuita e uma versão corporativa. O Neo4j usa sua própria linguagem de consulta chamada Cypher, mas as consultas podem ser escritas em outros estilos.

Este tutorial ensinará como instalar e configurar o Neo4j em um servidor Ubuntu 22.04.

Pré-requisitos

  • A server running Ubuntu 22.04 with a minimum of 1 CPU core and 2 GB of memory. You will need to upgrade the server as per requirements.

  • A non-root user with sudo privileges.

  • Make sure everything is updated.

  • $ sudo apt update
    
  • Install basic utility packages. Some of them may already be installed.

    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

Passo 1 - Instale o Neo4j

O primeiro passo para instalar o Neo4j é adicionar a chave GPG.

$ curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg

Adicione o repositório Neo4j ao diretório de fontes APTs do seu sistema.

$ echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable latest" | sudo tee -a /etc/apt/sources.list.d/neo4j.list

Para evitar o risco de atualizar para a próxima versão principal, você pode especificar as versões principal e secundária necessárias no lugar de latest no comando acima.

O comando a seguir adicionará o repositório Neo4j 5.x, o que significa que você não atualizará para a versão 6.x sempre que for lançada.

$ echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable 5" | sudo tee -a /etc/apt/sources.list.d/neo4j.list

Atualize a lista de repositórios do sistema.

$ sudo apt update

Liste as versões do Neo4j disponíveis para instalação.

$ apt list -a neo4j
Listing... Done
neo4j/stable 1:5.3.0 all
neo4j/stable 1:5.2.0 all
neo4j/stable 1:5.1.0 all

Instale a edição Neo4j Community.

$ sudo apt install neo4j

Você pode instalar uma versão específica usando o seguinte comando.

$ sudo apt install neo4j=1:5.3.0

Observe que a versão inclui um componente de versão de época (1:), de acordo com a política Debian sobre versionamento.

O Neo4j instalará automaticamente a versão necessária do JDK com ele.

Habilite o serviço Neo4j.

$ sudo systemctl enable neo4j

Inicie o serviço Neo4j.

$ sudo systemctl start neo4j

Verifique o status do serviço Neo4j.

$ sudo systemctl status neo4j
? neo4j.service - Neo4j Graph Database
     Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-01-21 20:50:52 UTC; 33s ago
   Main PID: 5241 (java)
      Tasks: 72 (limit: 1030)
     Memory: 399.3M
        CPU: 20.350s
     CGroup: /system.slice/neo4j.service

Passo 2 - Testar Conexão

Neo4j usa o Cypher Shell para trabalhar com dados.

Conecte-se ao Cypher Shell.

$ cypher-shell

Você será solicitado a fornecer um nome de usuário e uma senha. O nome de usuário e a senha padrão são neo4j. Você será solicitado a escolher uma nova senha.

username: neo4j
password:
Password change required
new password:
confirm password:
Connected to Neo4j using Bolt protocol version 5.0 at neo4j://localhost:7687 as user neo4j.
Type :help for a list of available commands or :exit to exit the shell.
Note that Cypher queries must end with a semicolon.
>

Isso confirma a conexão bem-sucedida com o Neo4j DBMS.

Digite :exit para sair do shell.

> :exit

Bye!

Passo 3 - Configurar o Neo4j para Acesso Remoto

Para ambientes de produção, pode ser necessário confirmar que o Neo4j aceita conexões de hosts remotos. Por padrão, o Neo4j aceita conexões apenas de localhost.

Podemos configurar o Neo4j para aceitar conexões de hosts remotos editando seu arquivo de configuração. O Neo4j armazena suas configurações no arquivo /etc/neo4j/neo4j.conf. Abra-o para edição.

$ sudo nano /etc/neo4j/neo4j.conf

Encontre a linha comentada #dbms.default_listen_address=0.0.0.0 e remova o comentário removendo o hash inicial.

. . .
#*****************************************************************
# Network connector configuration
#*****************************************************************

# With default configuration Neo4j only accepts local connections.
# To accept non-local connections, uncomment this line:
server.default_listen_address=0.0.0.0
. . .

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Por padrão, o valor 0.0.0.0 vinculará o Neo4j a todas as interfaces IPv4 disponíveis em seu sistema, incluindo localhost. Se você quiser limitar o Neo4j a um endereço IP específico, por exemplo, um IP de rede privada, especifique aqui o endereço IP atribuído à interface de rede privada do seu servidor.

Você também pode configurar o Neo4j para usar interfaces IPv6. Assim como no IPv4, você pode definir o valor default_listen_address para um endereço IPv6 específico que você usará para se comunicar com o Neo4j. Se você deseja limitar o Neo4j para usar apenas o endereço IPv6 local para o seu servidor, especifique ::1, que corresponde ao localhost usando a notação IPv6.

Se você configurar o Neo4j com um endereço IPv6, não poderá se conectar com o cypher-shell usando o endereço IPv6 diretamente. Em vez disso, você precisa configurar um nome DNS que resolva o endereço IPv6 ou adicionar uma entrada no arquivo /etc/hosts do sistema remoto que mapeia o endereço para um nome. Então você poderá usar o nome do arquivo DNS ou hosts para se conectar ao Neo4j usando IPv6 do seu sistema remoto.

Por exemplo, um servidor Neo4j com um endereço IPv6 como 2001:db8::1 exigiria que o sistema de conexão remota tivesse um /etc/hosts entrada como mostrado abaixo.

2001:db8::1 your_hostname

Você pode então se conectar ao servidor a partir do sistema remoto usando o nome que especificou conforme mostrado abaixo.

$ cypher-shell -a 'neo4j://your_hostname:7687'

Se você restringir o Neo4j para usar o endereço de host local IPv6 de ::1, poderá se conectar a ele localmente no próprio servidor Neo4j usando o nome ip6-localhost pré-configurado de seu /etc/hosts arquivo mostrado abaixo.

$ cypher-shell -a 'neo4j://ip6-localhost:7687'

Depois de invocar cypher-shell com o URI de conexão, você será solicitado a fornecer seu nome de usuário e senha como de costume.

Etapa 4 - Configurar o acesso do firewall (UFW)

Depois de ativar as conexões remotas, você pode usar o firewall para restringir o Neo4j para limitar as conexões apenas de sistemas confiáveis aos quais ele pode se conectar.

O Neo4j cria dois soquetes de rede, um na porta 7474 para a interface HTTP integrada e o protocolo bolt principal na porta 7687.

O Ubuntu 22.04 usa o Uncomplicated Firewall (UFW) por padrão.

Configure o firewall para permitir que um host remoto confiável acesse a interface bolt usando IPv4 usando o seguinte comando.

$ sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp

Substitua o endereço IP do sistema remoto confiável no lugar do valor 203.0.113.1. Da mesma forma, você pode permitir um intervalo de rede inteiro usando o seguinte comando.

$ sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp

Substitua a rede real no lugar do valor 192.0.2.0/24.

Para permitir acesso a um host remoto usando IPv6, você pode usar o seguinte comando.

$ sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp

Substitua o endereço IPv6 de seu sistema confiável no lugar do valor 2001:DB8::1/128.

Assim como no IPv4, você pode permitir um intervalo de endereços IPv6 usando o seguinte comando.

$ ufw allow from 192.0.2.0/24 to any port 7687 proto tcp

Novamente, substitua seu intervalo de rede confiável no lugar do intervalo de rede 2001:DB8::/32 realçado.

Recarregue o firewall para aplicar as alterações.

$ sudo ufw reload

Verifique o status do firewall.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
7687/tcp                   ALLOW       203.0.113.1

Passo 5 - Use o Neo4j

Conecte-se ao Neo4j usando a ferramenta cypher-shell. Você será solicitado a fornecer seu nome de usuário e senha.

$ cypher-shell

Se você configurou o Neo4j para acesso remoto, use o seguinte comando para conectar-se ao Neo4j a partir do sistema remoto.

$ cypher-shell -a 'neo4j://203.0.113.1:7687'

Aqui 203.0.113.1 é o endereço IP do servidor Neo4j.

Se você estiver usando IPv6, certifique-se de ter uma entrada /etc/hosts com um nome descrito na etapa 3. Em seguida, conecte-se ao servidor Neo4j da seguinte maneira.

$ cypher-shell -a 'neo4j://your_hostname:7687'

Certifique-se de que your_hostname seja mapeado para o endereço IPv6 de seus servidores Neo4j no arquivo /etc/hosts de sistemas remotos.

Vamos adicionar um nó chamado Slite e os nomes dos autores ao Neo4j. O comando a seguir criará um nó do tipo Slite, com um nome Navjot Singh.

> CREATE (:Slite {name: 'Navjot Singh'});

Você obterá a seguinte saída.

0 rows
ready to start consuming query after 124 ms, results consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels

Em seguida, adicionaremos mais funcionários e os relacionaremos usando um relacionamento chamado COLLEAGUE. Você pode vincular nós com relacionamentos nomeados arbitrariamente.

Adicione mais três funcionários e vincule-os usando o relacionamento COLLEAGUE.

> CREATE
             (:Slite {name: 'Sammy'})-[:COLLEAGUE]->
             (:Slite {name: 'Peter Jack'})-[:COLLEAGUE]->
             (:Slite {name: 'Chris Rock'});

Você obterá uma saída semelhante.

0 rows
ready to start consuming query after 72 ms, results consumed after another 0 ms
Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels

Agora, vamos criar alguns relacionamentos.

Como Peter e Chris trabalham no mesmo departamento e têm as mesmas propriedades como nós, criaremos um relacionamento com a coluna de nome.

> MATCH (a:Slite),(b:Slite)
             WHERE a.name = 'Peter Jack' AND b.name = 'Chris Rock'
             CREATE (a)-[r:DEPARTMENT { name: 'Designers' }]->(b)
             RETURN type(r), r.name;
+----------------------------+
| type(r)      | r.name      |
+----------------------------+
| "DEPARTMENT" | "Designers" |
+----------------------------+

1 row
ready to start consuming query after 60 ms, results consumed after another 17 ms
Created 1 relationships, Set 1 properties

Agora, vamos criar outra conexão entre Sammy e Peter, já que eles estão trabalhando no mesmo projeto.

> MATCH (a:Slite), (b:Slite)
             WHERE a.name = 'Peter Jack' AND b.name = 'Sammy'                                                                        CREATE (a)-[r:PROJECT { name: 'Test Project 1' }]->(b)                                                                  RETURN type(r), r.name;
+------------------------------+
| type(r)   | r.name           |
+------------------------------+
| "PROJECT" | "Test Project 1" |
+------------------------------+

1 row
ready to start consuming query after 132 ms, results consumed after another 12 ms
Created 1 relationships, Set 1 properties

Vamos exibir todos esses dados usando a seguinte consulta.

> MATCH (a)-[r]->(b)
             RETURN a.name,r,b.name
             ORDER BY r;
+-------------------------------------------------------------------+
| a.name       | r                                   | b.name       |
+-------------------------------------------------------------------+
| "Sammy"      | [:COLLEAGUE]                        | "Peter Jack" |
| "Peter Jack" | [:COLLEAGUE]                        | "Chris Rock" |
| "Peter Jack" | [:DEPARTMENT {name: "Designers"}]   | "Chris Rock" |
| "Peter Jack" | [:PROJECT {name: "Test Project 1"}] | "Sammy"      |
+-------------------------------------------------------------------+

4 rows
ready to start consuming query after 99 ms, results consumed after another 5 ms

Conclusão

Isso conclui nosso tutorial sobre instalação e configuração do Neo4j em um servidor Ubuntu 22.04. Se você tiver alguma dúvida, poste-a nos comentários abaixo.