1 - https://youtu.be/qay0GJJ28W8
An introduction to graph
How to create your first graph using TigerGraph Cloud's GraphStudio
Notebook: https://colab.research.google.com/drive/1JhYcnGVWT51KswcXZzyPzKqCoPP5htcC?usp=sharing
Slides: https://docs.google.com/presentation/d/1Ck-PKMqHKLkZfwFoYznMf53gpypoIzwPV360XoyHkYc/edit?usp=sharing
Data:
https://github.com/DanBarkus/TigerGraph-101
É possível criar o esquema global e depois usar localmente criando um grafo.
Os jobs de carga devem ser criados mapeamento as colunas do CSV com os vértices e arestas do grafo. A seguir podem ser executados.
As consultas são criadas, instaladas (compiladas, otimizadas) e depois executadas. A instalação cria o endpoint da consulta para execução.
As operações podem ser feitas através de um notebook em python ou no Graph Studio
2 - https://youtu.be/gNk5tTkIXJw
How graph compares to relational databases
Data Preparation and Converting a Relational Dataset to Graph
Presentation:
https://docs.google.com/presentation/d/1YbDMYV5yjIx-UygCkGp4OdBEYxOaoytaNzlk0tToXgk/edit?usp=sharing
Notebook / repo:
https://github.com/DanBarkus/Patent_Graph
Vértices e Arestas ficam em memória em tempo de execução, o vértice é uma área de memória que contém o primary ID e as arestas são ponteiros para essas áreas. Atributos (chave e valor) de vértices e arestas ficam em disco. Assim se a operações percorrer um caminho no grafo são resolvidas em memória, sendo extremamente rápidas, se a operação envolver atributos então é necessário fazer acesso a disco, sendo mais lenta.
Se um determinado atributo de um vértice for usado como filtro esse deve ser modelado como um vértice e não como um atributo.
Uma aresta de um tipo X só ocorre uma vez em um par de vértices. Ou seja, v -X> u e v -Y> u estão OK mas não pode haver outra aresta do tipo X ou Y mesmo que com atributos diferentes. O primary ID de aresta é formado por primary ID do primeiro vértice + tipo da aresta + primary ID do segundo vértice. Nesse caso não é possível modelar fatos que envolvem as mesmas entidades em contextos diferentes. Por exemplo: MBachelet -president> Chile
Existem funções para gerar UUID (gsql_uuid_v4) em caso de entidades sem primary ID natural para os vértices / nós.
3 - https://youtu.be/sJ5o_b_9G0s
Schema Modeling and Data Loading
Presentation: https://docs.google.com/presentation/d/1xHOoWGYtnhdzxlAKgIJB3CfR1LR0diTShoSKlyhXpB0/edit?usp=sharing
Notebook / repo: https://github.com/DanBarkus/Patent_Graph
A modelagem e carga de dados poder ser feita através da interface gráfica ou por linha de código com GSQL
Global Schema x Graph Schema: é possível aproveitar partes do global no local (grafo) e não é necessário aderir a todo o Global Schema. A modificação do grafo local é por job e a do global é por comando. Existe interdependência para realizar alterações no global que afetam o local.
Sugestão de convenção de nomes para tipo de vértices, tipo de arestas e nome de atributos.
Somente um atributo por vértice pode ser indexado para acelerar o look up. É possível definir valores default para atributos sem valor no momento da carga.
As arestas podem ser direcionadas ou não, com GSQL é possível percorrer o grafo em qualquer direção (se criar o reverse edge)
O schema deve ser publicado.
GSQL Pattern
CREATE VERTEX <VERTEX_TYPE_NAME>(PRIMARY_ID <PRIMARY_ID_NAME> <PRIMARY_ID_TYPE>, <ATTRIBUTE_NAME> <ATTRIBUTE_TYPE>, ...)
CREATE DIRECTED|UNDIRECTED EDGE <EDGE_TYPE_NAME>(FROM <SOURCE_VERTEX_TYPE>, TO <DESTINATION_VERTEX_TYPE>, <ATTRIBUTE_NAME> <ATTRIBUTE_TYPE>, ...)
Data Mapping para carregar os dados de arquivos para o grafo. O primeiro passo é carregar os arquivos.
É possível juntar campos dos arquivos de entrada para gerar um uniqueID, caso não exista. Cada arquivo deve ter um loading job com os mapeamentos para carregar, é possível carregar dois arquivos em paralelo mas não é o default da interface.
É possível deletar vértices e arestas assim como dropar todos o grafo.
VOLTAR PARA REVER O JNOTEBOOK COM O EXEMPLO
4 - https://youtu.be/dP7ammiYqQ0
Querying and Beyond
Presentation:
https://docs.google.com/presentation/d/1d-M_mP5jIAAp3fjtHqOblQk7bbygRBBoQZRtFijPQ7g/edit?usp=sharing
Installed vs Interpreted Queries
Installed .... armazenadas, podem receber parâmetros por variáveis
• Compiled for fastest possible runtime performance
• REST endpoint created for easy access
• Takes 1-2 minutes to compile and install
Interpreted ... executadas sob demanda, ad-hoc
• Immediately runnable
• Faster query writing iteration time
• Some limited functionality
The SELECT Statement: Utilizes graph patterns to traverse edges
Sempre opera sobre um conjunto de vértices (vértices únicos).
A Basic Query
Most basic SELECT that you can write
• Creates a vertex_set of all Inventor vertices to use as the source_vertex_set
• Selects all vertices from source_vertex_set
• Places all vertices in result_vertex_set
• Print result_vertex_set
Pattern Matching
Patterns define edge traversals made by the SELECT statement
Follow the format: vertex_type - (edge_type) - vertex_type
Pattern: source_vertex_set :alias_vertex_set - (edge_type:edge_type_alias ) - destination_vertex_type :destination_alias
definir o tipo de vértice de origem, o tipo de aresta e o tipo de vértice de destino
Example:
start:s - (filed_application:f) - Application:a
Exist within the FROM clause of the SELECT statement
Aliases and edge_type do not need to be included if not needed
FROM é o MATCH do Cypher
Pattern Matching Query: Will output all Application vertices connected to an Inventor vertex by any edge
WHERE Clause: Specifies conditions that must be met for a vertex or edge to be selected
Multiple checks can be strung together with commas between
WHERE can be used on any vertex or edge attribute
** Entender melhor se é possível fazer filtro e join com edge attirbute **
Global ACCUM Query
For each edge between an Inventor named Joseph and an Application, the @@applications SumAccum will increment by 1
CREATE QUERY sample() FOR GRAPH Patents
{ SumAccum<INT> @@applications; start = {Inventor.*};
result = SELECT s FROM start:s - () - Application:a
WHERE s.first == “Joseph” ACCUM @@applications += 1;
Totalizar os nós do tipo application que estão ligados a nós com o first(name) = Joseph
Com um único @ antes da variável de acumulador passa a ser local accumulator e funciona como um atributo para o vértice, funcionam somente dentro do bloco de "DML"
Cláusula HAVING pode ser aplicada no resultado do accumulator
GSQL tem LIMIT, OFFSET, ORDER BY,
Multi-hops (path query), repeated patterns (recursão)
Comentários
Postar um comentário
Sinta-se a vontade para comentar. Críticas construtivas são sempre bem vindas.