Treffen Sie die Grafikabfrage mit Java + PGX mit explosiver Geschwindigkeit

1. Einleitung

――Ich hatte die Möglichkeit, das Eigenschaftsdiagramm zu berühren, daher werde ich es als Memorandum schreiben. ――Wenn Sie das Wort Graph hören, ist es leicht, es mit akademischer Mathematik wie der Graphentheorie zu verknüpfen. Wenn Sie jedoch eine "Graphendatenbank" verwenden, müssen Sie nicht über komplizierte Dinge wie die Graphentheorie sprechen.

2. Was ist ein Graph?

Kurz gesagt, ein Diagramm besteht nur aus einer Reihe von Eckpunkten und Kanten. Diagramme stellen Entitäten als Knoten dar und wie sie sich auf die Welt beziehen. Es gibt die folgenden drei Datenmodelle für Diagramme.

Eigenschaftsgraph

Es gibt die folgenden vier Funktionen des Eigenschaftsdiagramms.

Beispiel) Einfaches Eigenschaftsdiagramm

image.png

Hypergraph

Hypergraph ist ein universelles Diagrammmodell, mit dem Beziehungen mit einer beliebigen Anzahl von Knoten verbunden werden können. Im obigen Eigenschaftsdiagramm kann die Beziehung nur einen Startknoten zum Endknoten haben, aber im Hypergraphen können Sie eine Verbindung zu einer beliebigen Anzahl von Knoten herstellen.

Beispiel) Hypergraph, der zeigt, dass Alice und Bob 3 Autos haben

image.png

verdreifachen

Ein Tripel hat eine Datenstruktur von "Subjekt-Prädikat-Objekt". Tripel entsprechen dem RDF-Metadatenmodell (Resource Description Framework). Umgekehrt repräsentiert RDF eine Ressource (die nicht definiert ist) in dreifacher Ausfertigung.

Beispiel) RDF, das die natürliche Sprache "Ora Lassila ist der Autor der Ressource (http://www.w3.org/Home/Lassila)" dreifach ausdrückt.

--Satzbau

Gegenstand Ressource http://www.w3.org/Home/Lassila
Prädikat Eigentum Creator
Objekt Eigentumswert "Ora Lassila"

--RDF / XML-Darstellung

<rdf:RDF>
  <rdf:Description about="http://www.w3.org/Home/Lassila">
    <s:Creator>Ora Lassila</s:Creator>
  </rdf:Description>
</rdf:RDF>

3. Umgebung (Parallel Graph Analytix)

PGX Dieses Mal verwenden wir ein Grafik-Toolkit namens Parallel Graph Analytix (allgemein bekannt als PGX). PGX enthält eine Grafikabfragesprache, eine Vielzahl von Analysefunktionen und Unterstützung für maschinelles Lernen. Das Bild unten gibt einen Überblick über PGX. image.png

Oracle Cloud Infrastructure Hier ist eine einfache Cloud-Architektur zur Verwendung von PGX. Der Einfachheit halber werden wir die Umgebung basierend auf dem öffentlichen Subnetz vorbereiten.

image.png

Der Inhalt ist wie folgt.

Kundenserver

Grafikserver

DB-Server

--Autonome Datenbank (19c) <-DBCS ist ebenfalls akzeptabel --Erstellen Sie ein Diagramm mit der Prozedur OPG_APIS.CREATE_PG ()


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. Bis zum Auslösen einer Grafikabfrage (PGQL)

RDB-Daten

Eigenschaftsdiagramm zum Erstellen

Wenn Sie bei Google suchen, werden Sie viele Beispieldaten finden, aber da es langweilig ist, sie zu verwenden, werde ich versuchen, sie selbst zu erstellen, obwohl es sich um ein schäbiges Diagramm handelt. Fügen Sie gehorsam in die GRAPHVT $ -Tabelle und die GRAPHGE $ -Tabelle auf der RDB-Seite ein.

image.png

Knotenerstellung

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);

Kantenerstellung

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);

Verbindung durch JShell

Die Verbindungsmethode bei Verwendung von Jshell wird beschrieben.


[oracle@cli bin] curl -X POST -H 'Content-Type: application/json' -d '{"username": "***", "password": "***"}' http://10.51.0.2:7007/auth/token
->Wenn Sie den Befehl richtig eingeben, erhalten Sie ein Zugriffstoken.

[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): <-Kopieren Sie das mit dem Befehl Curl erhaltene Token
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(); <-Definieren Sie das zu behandelnde Diagramm

opg-jshell> PgxGraph graph = session.readGraphWithProperties(cfg); <-Ein von RDB-Laden Sie das Diagramm in den Speicher
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>

Java-Verbindung

Hier ist die Verbindung in Java. Dies ist nicht erforderlich, wenn Sie PGX nur mit Jshell berühren. Java ist jedoch einfacher, da es nicht interaktiv ausgeführt werden muss.

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{
        /*Die Spezifikation besteht darin, das durch URL und Curl erhaltene Token als Argument anzugeben.*/
        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]

Das Ergebnis der PGQL-Abfrage wird fest zurückgegeben.

5. Zusammenfassung

Referenz

--Referenz des Installationsvorgangs-> PGX-Dokument

Recommended Posts

Treffen Sie die Grafikabfrage mit Java + PGX mit explosiver Geschwindigkeit
Hallo Welt mit explosiver Geschwindigkeit mit Spring Initializr! !! !!
Verwenden Sie Microsoft Graph mit Standard-Java
Erstellen Sie einen Zabbix-Server mit explosiver Geschwindigkeit (CentOS 7)