Introdução
Neste tutorial, examinaremos o que é o Neo4j, para que é usado e como é implementado. Também instalaremos e configuraremos a instalação em um servidor Ubuntu 20.04. Neo4j é um banco de dados gráfico usado para criar relacionamentos de dados. Outros exemplos de bancos de dados gráficos incluem:
- ArangoDB
- Grakn Core
- Microsoft SQL Server 2017
- OrientDB
- RedisGraph
O que é Neo4j
O Neo4j conecta os dados à medida que são armazenados, permitindo-nos executar consultas que nunca conhecíamos ou pensávamos antes. Simplificando, o Neo4j registra o relacionamento entre os nós de dados, enquanto os bancos de dados relacionais convencionais usam colunas e linhas para armazenar dados estruturados. Como cada nó armazena referências a todos os outros nós aos quais está conectado, o Neo4j pode codificar e consultar relacionamentos complexos com sobrecarga mínima.
A Neo Technology é a criadora e desenvolvedora do software de código aberto Neo4j. A empresa o desenvolve desde 2003. Ele é escrito em Java e Scala, e o código-fonte está disponível gratuitamente no GitHub. A partir de 2015, é considerado o sistema de gerenciamento de banco de dados gráfico mais utilizado atualmente. O Neo4j emprega sua própria linguagem de consulta chamada Cypher, mas as consultas também podem ser escritas em outros estilos, por exemplo, por meio da API Java.
Pré-requisitos
Para esta instalação, o software requer as seguintes configurações de linha de base.
- 8 GB de RAM e um servidor de quatro núcleos. No mínimo, o uso recomendado é de 1 GB de RAM e um servidor de núcleo único.
- Ubuntu 20.04 OS
- Todos os comandos são executados como root. Se você for um usuário comum, os comandos devem ser precedidos pelo comando sudo.
Instalação do Neo4j
Adicionar repositório
O Ubuntu não contém oficialmente o Neo4j no repositório de pacotes padrão. Adicionaremos a fonte do pacote apontando para o local do repositório do Neo4j, adicionaremos a chave GPG do Neo4j para verificação e instalaremos o próprio Neo4j.
Começamos atualizando a lista de pacotes e os próprios pacotes.
root@host:~# apt update && apt -y upgrade
Adicionar software adicional
Nesta etapa, instalaremos um pacote adicional necessário para conexões HTTPS. Este aplicativo pode já estar instalado por padrão no sistema, mas ainda precisa ser atualizado.
root@host:~# apt install apt-transport-https ca-certificates curl software-properties-common -y
O apt-transport-https pacote habilita o uso de https através do gerenciador de pacotes usando o libapt-pkg biblioteca. Isso mantém a instalação segura.
Verificar chave de segurança
Agora adicionamos a chave de segurança oficial para o repositório de pacotes Neo4j. Esta chave verifica e verifica se o que você está instalando é do repositório oficial.
root@host:~# curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | apt-key add -
OK
root@host:~#
Adicionar repositório
Adicione o repositório oficial do Neo4j à lista de gerenciadores de pacotes.
root@host:~# add-apt-repository "deb https://debian.neo4j.com stable 4.1"
Instale o Neo4j
Ao instalar o Neo4j e todas as suas dependências, é essencial observar que a instalação nos solicitará a instalação de pacotes Java para trabalhar com o Neo4j. Durante a instalação, pressione Y. para aceitar esta instalação de software. Se você tiver o Java instalado, o instalador entenderá e pulará esta etapa.
root@host:~# apt install neo4j -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libfprint-2-tod1
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
cypher-shell
The following NEW packages will be installed:
cypher-shell neo4j
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 116 MB of archives.
After this operation, 131 MB of additional disk space will be used.
Get:1 https://debian.neo4j.com stable/4.1 amd64 cypher-shell all 4.1.3 [27,1 MB]
Get:2 https://debian.neo4j.com stable/4.1 amd64 neo4j all 1:4.1.5 [88,4 MB]
Fetched 116 MB in 10s (11,1 MB/s)
Preconfiguring packages ...
Selecting previously unselected package cypher-shell.
(Reading database ... 163626 files and directories currently installed.)
Preparing to unpack .../cypher-shell_4.1.3_all.deb ...
Unpacking cypher-shell (4.1.3) ...
Selecting previously unselected package neo4j.
Preparing to unpack .../neo4j_1%3a4.1.5_all.deb ...
Unpacking neo4j (1:4.1.5) ...
Setting up cypher-shell (4.1.3) ...
Setting up neo4j (1:4.1.5) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for systemd (245.4-4ubuntu3.3) ...
root@host:~#
Iniciar o serviço Neo4j
Uma vez instalado, precisamos habilitá-lo como um serviço neo4j.service.
root@host:~# systemctl enable neo4j.service
Synchronizing state of neo4j.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable neo4j
Created symlink /etc/systemd/system/multi-user.target.wants/neo4j.service → /lib/systemd/system/neo4j.service.
root@host:~#
Verifique o status do Neo4j
Em seguida, verificamos se tudo está funcionando conforme o esperado.
root@host:~# systemctl status neo4j.service
neo4j.service - Neo4j Graph Database
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset:>
Active: active (running) since Wed 2020-12-23 20:04:44 +03; 2min 4s ago
Main PID: 4827 (java)
Tasks: 52 (limit: 9489)
Memory: 447.9M
CGroup: /system.slice/neo4j.service
└─4827 /usr/bin/java -cp /var/lib/neo4j/plugins:/etc/neo4j:/usr/sh>
сне 23 20:04:46 host neo4j[4827]: 2020-12-23 17:04:46.101+0000 INFO ======== N>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.073+0000 INFO Initializi>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.077+0000 INFO Setting up>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.077+0000 INFO Creating n>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.083+0000 INFO Setting ve>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.085+0000 INFO After init>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.088+0000 INFO Performing>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.197+0000 INFO Bolt enabl>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.843+0000 INFO Remote int>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.844+0000 INFO Started.
lines 1-19/19 (END)
To exit this screen, press Ctrl + C.
It is important to have the following parameters:
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset:>
Active: active (running) since Wed 2020-12-23 20:04:44 +03; 2min 4s ago
Testar conexão de banco de dados
Como instalamos o Neo4j e o iniciamos como um serviço, agora vamos testar a conexão com o banco de dados e configurar o usuário admin.
Observação:Estamos usando a versão gratuita do Community Edition Neo4j. Ele suporta o trabalho simultâneo com o mesmo banco de dados, mas não inclui a atribuição de funções e permissões aos usuários.
Trabalhando com o Neo4j
Para interagir com o banco de dados, lançaremos o utilitário interno chamado cypher-shell para trabalhar com o Neo4j. Quando o executamos pela primeira vez, será solicitado que insira um usuário e uma senha. Por padrão, o nome de usuário é neo4j e a senha é neo4j. Após o primeiro login, você será solicitado a alterar a senha para uma de sua escolha.
oot@host:~# cypher-shell
username: neo4j
password: *****
Password change required
new password: ********
Connected to Neo4j 4.1.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.
neo4j@neo4j>
Para sair, use o comando exit.
neo4j@neo4j> exit
Bye!
root@host:~#
Adicionar nós
Vamos configurar alguns nós de amostra e definir relacionamentos entre eles. Conectar usando Cypher
root@host:~# cypher-shell
username: neo4j
password: ********
Connected to Neo4j 4.1.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.
neo4j@neo4j>
Em seguida, vamos adicionar um nó chamado Liquidweb e os nomes dos colegas que trabalham para esta empresa sob o nome de Margaret. Podemos fazer isso usando o comando CREATE, e a sintaxe será a seguinte.
neo4j@neo4j> CREATE (:Liquidweb {name: 'Margaret'});
0 rows available after 36 ms, consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels
neo4j@neo4j>
Adicionar usuários
Vamos adicionar mais alguns colegas e vinculá-los à empresa para a qual trabalham, a Liquidweb. Vamos nos conectar usando o comando FRIEND.
neo4j@neo4j> CREATE (:Liquidweb {name: 'John'})-[:FRIEND]->
(:Liquidweb {name: 'Peter'})-[:FRIEND]->
(:Liquidweb {name: 'Chris'});
0 rows available after 38 ms, consumed after another 0 ms
Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels
neo4j@neo4j>
Criar relacionamentos
Como Peter e Chris trabalham no mesmo departamento e possuem as mesmas propriedades dos nós, criaremos um relacionamento com a coluna name.
neo4j@neo4j> MATCH (a:Liquidweb),(b:Liquidweb)
WHERE a.name = 'Peter' AND b.name = 'Chris'
CREATE (a)-[r:DEPARTMENT { name: 'Developers' }]->(b)
RETURN type(r), r.name;
+------------------------+
| type(r) | r.name |
+------------------------+
| "DEPARTMENT" | "Developers" |
+------------------------+
1 row available after 105 ms, consumed after another 10 ms
Created 1 relationships, Set 1 properties
neo4j@neo4j>
- MATCH - Indica a correspondência dos nós. Neste caso, dentro de uma empresa Liquidweb
- ONDE - entre valores
- CRIAR - criar e adicionar
- RETURN - Retornar à base.
Agora crie uma conexão entre John e Chris, embora estejam em departamentos diferentes, mas estejam trabalhando no mesmo projeto.neo4j@neo4j> MATCH (a:Liquidweb),(b:Liquidweb)
WHERE a.name = 'John' AND b.name = 'Chris'
CREATE (a)-[r:PROJECT { name: 'Cool Project' }]->(b)
RETURN type(r), r.name;
+----------------------------+
| type(r) | r.name |
+----------------------------+
| "PROJECT" | "Cool Project" |
+----------------------------+
1 row available after 48 ms, consumed after another 5 ms
Created 1 relationships, Set 1 properties
neo4j@neo4j>
Informações de exibição
Agora vamos exibir todos esses dados e seus relacionamentos usando a seguinte consulta.
neo4j@neo4j> Match (n)-[r]->(m)
Return n,r,m;
+--------------------------------------------------------------------------------------------------+
| n | r | m |
+--------------------------------------------------------------------------------------------------+
| (:Liquidweb {name: "John"}) | [:FRIEND] | (:Liquidweb {name: "Peter"}) |
| (:Liquidweb {name: "John"}) | [:PROJECT {name: "Cool Project"}] | (:Liquidweb {name: "Chris"}) |
| (:Liquidweb {name: "Peter"}) | [:DEPARTMENT {name: "Developers"}] | (:Liquidweb {name: "Chris"}) |
| (:Liquidweb {name: "Peter"}) | [:FRIEND] | (:Liquidweb {name: "Chris"}) |
+--------------------------------------------------------------------------------------------------+
4 rows available after 17 ms, consumed after another 2 ms
neo4j@neo4j>
Recebemos os dados de saída com os seguintes relacionamentos FRIEND, que mostram o relacionamento e os seguintes relacionamentos de dados entre DEPARTMENT e PROJECT.
Para sair do shell cypher, execute o comando exit.
neo4j@neo4j> :exit
Bye!
root@host:~#
Configure uma conexão remota segura com o Neo4j
Nem sempre poderemos nos conectar ao banco de dados a partir do próprio servidor. Se quisermos configurar o aplicativo para usar o Neo4j, precisaremos configurá-lo para conectar-se com segurança a outros servidores. Além disso, devemos configurar o firewall para restringir quais servidores podem se conectar ao Neo4j.
Por padrão, o Neo4j se conecta via localhost (127.0.0.1 - localhost - destinado a testar aplicativos sem trabalhar com outros servidores). Além disso, o trabalho do Neo4j do localhost não será aberto para acesso público à Internet. Somente usuários com acesso à rede local poderão se conectar ao Neo4j.
Configurar o Neo4j
Para que o Neo4j se conecte a outros servidores, precisamos alterar as configurações do arquivo de configuração /etc/neo4j/neo4j.conf . Usaremos o editor nano para esta tarefa. Lembre-se, se você não for root, use o comando sudo.
root@host:~# nano /etc/neo4j/neo4j.conf
root@host:~#
Encontre a linha na seção Conector de rede
#dbms.default_listen_address=0.0.0.0
Remova o comentário desta linha removendo o símbolo # e pressione Ctrl + S e Ctrl + X para salvar e sair do editor.
O valor 0.0.0.0 vinculará o Neo4j a todas as interfaces de rede IPv4 disponíveis. Você pode colocar um endereço IP específico ou rede que seus servidores usam como caminho de dados. Você também pode configurá-lo para usar interfaces IPv6, mas há muitas nuances nessa configuração. Recomendamos que você leia a documentação no site oficial.
Configurar firewall para conexões remotas
Para configurar o software Neo4j para conexões remotas, devemos configurar o firewall. Restringimos o acesso para que apenas sistemas confiáveis possam se conectar a ele. Neste caso, usaremos o firewall padrão do Ubuntu, UFW.
Em seguida, devemos verificar se o firewall está ativado. Se não estiver ativo, temos que habilitá-lo.
root@host:~# ufw enable
Firewall is active and enabled on system startup
root@host:~#
O Neo4j cria dois soquetes de rede ao instalar o software. Um na porta 7474 para a interface HTTP e outro para o protocolo primário na porta 7687. O Neo4j recomenda usar a porta 7687. O comando para abrir uma porta será semelhante ao seguinte comando usado para permitir um endereço IPv4.
ufw allow from YOUR_IP to any port 7687 proto tcp
YOUR_IP - Use an IP here to provide access permission. If you want to allow access to the entire local network, use the following rule:
ufw allow from 192.168.50.0/16 to any port 7687 proto tcp
Digite seu intervalo de rede específico para abrir a porta. Para um endereço IPv6, o comando ficará assim.
ufw allow from fe80::1006:f7a3:b9cc:b0cb to any port 7687 proto tcp
Os IPs acima são usados como exemplo. Substitua seus valores e adicione uma regra.
root@host:~# ufw allow from 192.168.50.189 to any port 7687 proto tcp
Rule added
root@host:~#
Reiniciar o firewall
Certifique-se de reiniciar o firewall.
root@host:~# ufw reload
Firewall reloaded
root@host:~#
Verificar conexão
Agora vamos verificar se está funcionando corretamente.
root@host:~# ufw status
Status: active
To Action From
-- ------ ----
7687/tcp ALLOW 192.168.50.189
root@host:~#
E com isso, temos um servidor Neo4j funcionando, pronto para funcionar e configurado para permitir acesso na porta 7687.
Conclusão
Conhecemos o banco de dados gráfico Neo4j, aprendemos como funciona e porque é necessário. Configure um gerenciador de pacotes e instale o Neo4j. Em seguida, verificamos a funcionalidade, entramos nela e alteramos a senha. Tentamos comandos básicos sobre como criar uma tabela, fazer relacionamentos e configurar nós. No final, configuramos a conexão com os IPs que precisávamos e configuramos um firewall para segurança.