Accédez à la requête graphique avec Java + PGX à une vitesse explosive

1. Introduction

«J'ai eu la chance de toucher le graphique des propriétés, je vais donc l'écrire sous forme de mémorandum. ――Lorsque vous entendez le mot graphe, il est facile de l'associer à des mathématiques académiques telles que la théorie des graphes, mais lorsque vous utilisez une "base de données de graphes", vous n'avez pas besoin de parler de choses compliquées comme la théorie des graphes.

2. Qu'est-ce qu'un graphique?

En un mot, un graphe n'est qu'un ensemble de sommets et d'arêtes. Les graphiques représentent les entités sous forme de nœuds et leur relation avec le monde. Il existe les trois modèles de données suivants pour les graphiques.

Graphique de propriété

Il existe les quatre caractéristiques suivantes du graphique des propriétés.

Exemple) Graphique de propriétés simple

image.png

Hypergraph

L'hypergraph est un modèle de graphe à usage général qui permet aux relations d'être connectées à n'importe quel nombre de nœuds. Dans le graphique de propriétés ci-dessus, la relation ne peut avoir qu'un seul nœud de départ au nœud de fin, mais dans l'hypergraphe, vous pouvez vous connecter à n'importe quel nombre de nœuds.

Exemple) Hypergraphe montrant qu'Alice et Bob ont 3 voitures

image.png

tripler

Un triplet a une structure de données "sujet-prédicat-objet". Les triplets correspondent au modèle de métadonnées RDF (Resource Description Framework). Inversement, RDF représente une ressource (qui n'est pas définie) en triplets.

Exemple) RDF qui exprime le langage naturel "Ora Lassila est l'auteur de la ressource (http://www.w3.org/Home/Lassila)" en triplets.

--Structure de phrase

matière Ressource http://www.w3.org/Home/Lassila
prédicat Propriété Creator
Objet Valeur de la propriété "Ora Lassila"
<rdf:RDF>
  <rdf:Description about="http://www.w3.org/Home/Lassila">
    <s:Creator>Ora Lassila</s:Creator>
  </rdf:Description>
</rdf:RDF>

3. Environnement (Parallel Graph Analytix)

PGX Cette fois, nous utiliserons un kit d'outils graphique appelé Parallel Graph Analytix (communément appelé PGX). PGX comprend un langage de requête graphique, une variété de capacités d'analyse et une prise en charge de l'apprentissage automatique. L'image ci-dessous est un aperçu de PGX. image.png

Oracle Cloud Infrastructure Voici une architecture cloud simple expliquant comment utiliser PGX. Par souci de simplicité, nous préparerons l'environnement basé sur le sous-réseau public.

image.png

Le contenu est le suivant.

Serveur client

Serveur graphique

Serveur de base de données


SQL> Execute OPG_APIS.CREATE_PG('Graph',4,8,'USERS');
SQL> select table_name from user_tables;
TABLE_NAME
--------------------
GRAPHGT$
GRAPHIT$
GRAPHSS$
GRAPHVT$
GRAPHGE$

SQL> desc GRAPHVT$
 Name               Null?         Type
 ------------------ ---------- --------------------- 
 VID                NOT NULL   NUMBER
 VL                            NVARCHAR2(3100)
 K                             NVARCHAR2(3100)
 T                             NUMBER(38)
 V                             NVARCHAR2(15000)
 VN                            NUMBER
 VT                            TIMESTAMP(6) WITH TIME ZONE
 SL                            NUMBER
 VTS                           DATE
 VTE                           DATE
 FE                            NVARCHAR2(4000)

4. Au point de lancer une requête graphique (PGQL)

Données RDB

Graphique de propriété à créer

Si vous effectuez une recherche sur Google, vous trouverez de nombreux exemples de données, mais comme il est ennuyeux de les utiliser, je vais essayer de le créer moi-même, bien que ce soit un graphique minable. Insérez-les dans la table GRAPHVT $ et dans la table GRAPHGE $ du côté RDB docilement.

image.png

Création de nœuds

insert into GRAPHVT$ (VID,VL,T,K,V) values (1,'person',1,'name','Sato');
insert into GRAPHVT$ (VID,VL,T,K,VN) values(1,'person',2,'age',40);
insert into GRAPHVT$ (VID,VL,T,K,V) values(2,'person',1,'name','Suzuki');
insert into GRAPHVT$ (VID,VL,T,K,VN) values(2,'person',2,'age',20);
insert into GRAPHVT$ (VID,VL,T,K,V) values(3,'person',1,'name','Yamamoto');
insert into GRAPHVT$ (VID,VL,T,K,VN) values(3,'person',2,'age',35);
insert into GRAPHVT$ (VID,VL,T,K,V) values(4,'person',1,'name','Tanaka');
insert into GRAPHVT$ (VID,VL,T,K,VN) values(4,'person',2,'age',25);

Création de bord

create sequence graph_eid_seq; 
alter sequence graph_eid_seq restart;
insert into GRAPHGE$ (EID,SVID,DVID,EL,K,T,VN) values(graph_eid_seq.nextval,1,2,'knows','weight',3,0.5);
insert into GRAPHGE$ (EID,SVID,DVID,EL,K,T,VN) values(graph_eid_seq.nextval,1,4,'knows','weight',3,0.5);
insert into GRAPHGE$ (EID,SVID,DVID,EL,K,T,VN) values(graph_eid_seq.nextval,4,2,'likes','weight',3,0.8);
insert into GRAPHGE$ (EID,SVID,DVID,EL,K,T,VN) values(graph_eid_seq.nextval,4,3,'knows','weight',3,0.7);
insert into GRAPHGE$ (EID,SVID,DVID,EL,K,T,VN) values(graph_eid_seq.nextval,3,1,'knows','weight',3,0.9);

Connexion par JShell

La méthode de connexion lors de l'utilisation de Jshell est décrite.


[oracle@cli bin] curl -X POST -H 'Content-Type: application/json' -d '{"username": "***", "password": "***"}' http://10.51.0.2:7007/auth/token
->Si vous tapez la commande correctement, vous obtiendrez un jeton d'accès.

[oracle@cli bin] ./oracle-graph-client-20.3.0/bin/opg-jshell --base_url http://10.51.0.2:7007

enter authentication token (press Enter for no token): <-Copiez le jeton obtenu avec la commande Curl
For an introduction type: /help intro
Oracle Graph Client Shell 20.3.0
PGX server version: 20.1.1 type: SM
PGX server API version: 3.8.1
PGQL version: 1.3
Variables instance, session, and analyst ready to use.

opg-jshell> GraphConfig cfg = GraphConfigBuilder.forPropertyGraphRdbms()
.setName("Graph")
.addVertexProperty("name",PropertyType.STRING)
.addVertexProperty("age",PropertyType.INTEGER)
.addEdgeProperty("weight",PropertyType.FLOAT)
.setLoadVertexLabels(true)
.setLoadEdgeLabel(true).build(); <-Définir le graphe à gérer

opg-jshell> PgxGraph graph = session.readGraphWithProperties(cfg); <-Activé depuis RDB-Charger le graphique en mémoire
graph ==> PgxGraph[name=Graph,N=4,E=5,created=1596986537591]

opg-jshell> graph.queryPgql("SELECT count(v) FROM Graph MATCH (v)").print(10).close(); <-PGQL(1)
+----------+
| count(v) |
+----------+
| 4        |
+----------+

opg-jshell> 
opg-jshell> graph.queryPgql("SELECT id(n), label(n),n.name as name1,n.age as age1,label(e), e.weight, id(m),label(m),m.name as name2,m.age as age2 FROM MATCH (n) -[e]-> (m)").print(10).close();
<- PGQL(2)
+---------------------------------------------------------------------------------------------+
| id(n) | label(n) | name1    | age1 | label(e) | weight | id(m) | label(m) | name2    | age2 |
+---------------------------------------------------------------------------------------------+
| 3     | person   | Yamamoto | 35   | knows    | 0.9    | 1     | person   | Sato     | 40   |
| 4     | person   | Tanaka   | 25   | knows    | 0.7    | 3     | person   | Yamamoto | 35   |
| 4     | person   | Tanaka   | 25   | likes    | 0.8    | 2     | person   | Suzuki   | 20   |
| 1     | person   | Sato     | 40   | knows    | 0.5    | 4     | person   | Tanaka   | 25   |
| 1     | person   | Sato     | 40   | knows    | 0.5    | 2     | person   | Suzuki   | 20   |
+---------------------------------------------------------------------------------------------+
opg-jshell>

Connexion Java

Voici la connexion en Java. Cela n'est pas nécessaire si vous ne touchez PGX qu'avec Jshell. Cependant, Java est plus simple car il ne doit pas être exécuté de manière interactive.

TokenConnect.java


import oracle.pgx.api.*;
import oracle.pgx.config.*;
import oracle.pg.rdbms.*;
import oracle.pgx.common.types.*;
import java.util.function.Supplier;

public class TokenConnect{
    public static void main(Srting[] args) throws Exception{
        /*La spécification est de spécifier le jeton obtenu par URL et Curl comme argument.*/
        String baseUrl = args[0];
        String token = args[1];
        ServerInstance instance = Pgx.setInstance(baseUrl,token);
        try (PgxSession session = instance.createSession("my-session")){
            Supplier<GraphConfig> cfg = () ->{return GraphConfigBuilder.forPropertyGraphRdbms()
            .forPropertyGraphRdbms()
            .setName("Graph")
            .addVertexProperty("name",PropertyType.STRING)
            .addVertexProperty("age",PropertyType.INTEGER)
            .addEdgeProperty("weight",PropertyType.FLOAT)
            .setLoadVertexLabels(true)
            .setLoadEdgeLabel(true)
            .build();
        
            PgxGraph graph = session.readGraphWithProperties(cfg.get());
            System.out.println("N = " + graph.getNumVertices()+ " <-> E = " + graph.getNumEdges());
        }
    }
}

[oracle@cli oracle-graph-client-20.3.0] javac -cp 'lib/*' TokenConnect.java
warning: Supported source version 'RELEASE_8' from annotation processor 'org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDslProcessor' less than -source '11'
1 warning

[oracle@cli oracle-graph-client-20.3.0] java -cp '.:conf:lib/*' TokenConnect *baseUrl *Token
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/home/opc/oracle-graph-client-20.3.0/lib/guice-4.2.2.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

N = 4 <-> E = 5
+---------------------------------------------------------------------------------------------+
| id(n) | label(n) | name1    | age1 | label(e) | weight | id(m) | label(m) | name2    | age2 |
+---------------------------------------------------------------------------------------------+
| 3     | person   | Yamamoto | 35   | knows    | 0.9    | 1     | person   | Sato     | 40   |
| 4     | person   | Tanaka   | 25   | knows    | 0.7    | 3     | person   | Yamamoto | 35   |
| 4     | person   | Tanaka   | 25   | likes    | 0.8    | 2     | person   | Suzuki   | 20   |
| 1     | person   | Sato     | 40   | knows    | 0.5    | 4     | person   | Tanaka   | 25   |
| 1     | person   | Sato     | 40   | knows    | 0.5    | 2     | person   | Suzuki   | 20   |
+---------------------------------------------------------------------------------------------+
[oracle@cli oracle-graph-client-20.3.0]

Le résultat de la requête PGQL est renvoyé fermement.

5. Résumé

référence

--Référence de la procédure d'installation-> Document PGX

Recommended Posts

Accédez à la requête graphique avec Java + PGX à une vitesse explosive
Hello World à une vitesse explosive avec Spring Initializr! !! !!
Utiliser Microsoft Graph avec Java standard
Construisez un serveur Zabbix à une vitesse explosive (CentOS 7)