«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.
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.
Il existe les quatre caractéristiques suivantes du graphique des propriétés.
Exemple) Graphique de propriétés simple
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
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>
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.
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.
Le contenu est le suivant.
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)
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.
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);
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);
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>
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.
--Référence de la procédure d'installation-> Document PGX