(Acest articol a fost publicat pentru prima dată pe Patrice Godardși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.

Introducere
Bazele de date cu grafice excelează la stocarea și traversarea datelor extrem de conectate utilizate pentru motoarele de recomandare, detectarea fraudelor, grafice de cunoștințe și rețele sociale. Neo4j este una dintre cele mai utilizate baze de date grafice, și cu Neo4j Auraserviciul său de cloud gestionat face acum ușor să porniți o instanță de nivel de producție fără nicio suprasolicitare a infrastructurii.
Pe partea R, pachetul neo2R a fost de mult disponibil pentru interogarea instanțelor Neo4j auto-găzduite din versiunea R. 3.0.0 aduce două schimbări importante:
- Model de conexiune unificat — un singur
startGraph()apelul gestionează atât o instanță Neo4j auto-găzduită (http://localhost:7474) și a nor Instanță Neo4j Aura (https://)..databases.neo4j.io - backend httr2 — stratul HTTP intern a migrat din cel depreciat
httrpachet lahttr2.
În această postare, ne vom conecta la baza de date demonstrativă gratuită Neo4j Aura preîncărcat cu setul de date clasic Recomandări de filme, explorați graficul cu interogări Cypher și finalizați cu o vizualizare interactivă a rețelei construită cu visNetwork.
Cerințe preliminare
install.packages(c("neo2R", "dplyr", "visNetwork"))
library(neo2R) library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library(visNetwork)
neo2R 3.0.0 necesită R ≥ 4,1 și httr2 ≥ 1,0,0. Verificați-vă versiunile cu packageVersion("neo2R") şi packageVersion("httr2").
Conectarea la Neo4j Aura
Creați și conectați-vă la o instanță Aura
Neo4j oferă o gratuit Aura Free nivel (până la 200 k noduri / 400 k relații).
Creați o instanță gratuită la https://console.neo4j.io și obțineți detaliile conexiunii.
Conectați-vă la instanța dvs. cu startGraph().
my_aura <- startGraph( url = "https://.databases.neo4j.io", database = "INSTANCEID", username = "INSTANCEID", password = "INSTANCEPASSWORD" ## api = "v2" is set automatically for *.databases.neo4j.io URLs )
Setul de date pentru recomandări de film
Neo4j oferă exemple de seturi de date, iar cele mai multe dintre ele sunt disponibile ca șabloane cu un singur clic în consola Neo4j Aura.
Setul de date Recomandări de filme este un exemplu de grafic care utilizează un set de date de recenzii de filme pentru a genera recomandări personalizate, în timp real. Acest set de date este disponibil și pe un server demo care poate fi accesat după cum urmează.
graph <- startGraph( url = "https://demo.neo4jlabs.com:7473", database = "recommendations", username = "recommendations", password = "recommendations" )
Explorarea schemei
Baza de date Film conține următoarele etichete de noduri și tipuri de relații:
| Film | titlu, lansat, imdbId |
| Gen | nume |
| Actor | nume, născut, imdbId |
| Director | nume, născut, imdbId |
| Utilizator | nume |
| ÎN_GEN | |
| ACTED_IN | rol |
| DIRIJAT | |
| EVALUAT | rating || marca temporală |
Să numărăm numărul acestor concepte diferite:
## Node types and counts
cypher(
graph,
"
MATCH (n)
RETURN labels(n) AS label, count(n) AS n
ORDER BY n DESC
"
) |>
as_tibble() |>
## filtering out technical nodes
filter(label %notin% c("_Bloom_Perspective_", "_Bloom_Scene_", ""))
# A tibble: 6 × 2 label n1 Actor || Person 14956 2 Movie 9125 3 Director || Person 3604 4 User 671 5 Actor || Director || Person 487 6 Genre 20
## Relationship types and counts
cypher(
graph,
"
MATCH ()-(r)->()
RETURN type(r) AS type, count(r) AS n
ORDER BY n DESC
"
) |>
as_tibble() |>
## filtering out technical relationships
filter(type %notin% c("_Bloom_HAS_SCENE_"))
# A tibble: 4 × 2 type n1 RATED 100004 2 ACTED_IN 35910 3 IN_GENRE 20340 4 DIRECTED 10007
Interogarea cu Cypher
Actori prolifici de top
cypher( graph, " MATCH (p:Person)-(:ACTED_IN)->(m:Movie) RETURN p.name AS actor, count(m) AS movies ORDER BY movies DESC LIMIT 10 " ) |> as_tibble()
# A tibble: 10 × 2 actor movies1 Robert De Niro 56 2 Bruce Willis 49 3 Samuel L. Jackson 45 4 Nicolas Cage 45 5 Michael Caine 40 6 Clint Eastwood 40 7 Tom Hanks 38 8 John Cusack 38 9 Morgan Freeman 38 10 Gene Hackman 38
Filmele și regizorii lor
cypher( graph, " MATCH (d:Person)-(:DIRECTED)->(m:Movie) RETURN m.title AS movie, m.released as released, d.name AS director ORDER BY m.released IS NOT NULL DESC, m.released DESC LIMIT 10 " ) |> as_tibble()
# A tibble: 10 × 3 movie released director1 Solace 2016-09-02 "Afonso Poyart" 2 Ben-hur 2016-08-12 "Timur Bekmambetov" 3 Rustom 2016-08-12 "Tinu Suresh Desai" 4 Mohenjo Daro 2016-08-12 "Ashutosh Gowariker" 5 Suicide Squad 2016-08-05 "David Ayer" 6 Shin Godzilla 2016-07-29 "Hideaki Anno" 7 Shin Godzilla 2016-07-29 " Shinji Higuchi" 8 Jason Bourne 2016-07-29 "Paul Greengrass" 9 Star Trek 3 2016-07-22 "Justin Lin" 10 Ghostbusters 2016-07-15 "Paul Feig"
Interogări parametrizate
neo2R suportă parametrii numițipăstrând interogările în siguranță împotriva injectării și ușor de reutilizat:
## Find all co-stars of a given actor
cypher(
graph,
"
MATCH (a:Person {name: $actor})-(:ACTED_IN)->(m:Movie)<-(:ACTED_IN)-(co:Person)
RETURN DISTINCT co.name AS co_star, m.title AS shared_movie
ORDER BY co_star
",
parameters = list(actor = "Tom Hanks")
) |>
as_tibble()
# A tibble: 114 × 2 co_star shared_movie1 Adrian Zmed Bachelor Party 2 Alexander Godunov Money Pit, The 3 Amy Adams Charlie Wilson's War 4 Annie Rose Buckley Saving Mr. Banks 5 Audrey Tautou Da Vinci Code, The 6 Ayelet Zurer Angels & Demons 7 Barkhad Abdi Captain Phillips 8 Barkhad Abdirahman Captain Phillips 9 Barry Pepper Saving Private Ryan 10 Bill Paxton Apollo 13 # ℹ 104 more rows
Vizualizare rețea cu visNetwork
Puterea reală a unei baze de date grafice este vizibilă atunci când dvs remiză graficul. Să tragem rețeaua ego-ului lui Tom Hanks, toți cei cu care a acționat alături și să o redăm visNetwork.
Pasul 1 — Preluați nodurile și marginile
## Tom Hanks, his movies, and his co-stars
hub <- "Tom Hanks"
nodes_raw <- cypher(
graph,
"
MATCH (hub:Person {name: $hub})-(hr:ACTED_IN)->(m:Movie)
<-(cr:ACTED_IN)-(co:Person)
RETURN hub.name AS hub, hr.role AS hub_role,
m.title AS movie, m.year AS year,
co.name AS co, cr.role AS co_role
",
parameters = list(hub = hub)
) |>
as_tibble()
Pasul 2 — Modelați datele pentru visNetwork
visNetwork se așteaptă la două cadre de date: nodes (cu coloane id, label, group…) și edges (cu coloane from, to…).
nodes <- bind_rows(
nodes_raw |>
distinct(
id = hub,
group = "Hub"
),
nodes_raw |>
distinct(
id = co,
group = "Co-star"
),
nodes_raw |>
distinct(
id = movie,
group = "Movie",
year
)
) |>
distinct() |>
mutate(
title = sprintf(
'%s: %s%s',
group,
id,
ifelse(!is.na(year), sprintf("(%s)", year), "")
),
shape = ifelse(group == "Movie", "dot", "star"),
size = ifelse(group == "Hub", 30, 18)
) |>
arrange(id)
edges <- bind_rows(
nodes_raw |>
distinct(
from = hub,
to = movie,
role = hub_role
),
nodes_raw |>
distinct(
from = co,
to = movie,
role = co_role
)
) |>
mutate(
title = sprintf('Role: %s', role),
arrows = "to"
)
Pasul 3 — Desenați rețeaua
visNetwork(nodes, edges) |>
visGroups(
groupname = "hub",
color = list(
background = "#3B82F6",
border = "#1D4ED8",
highlight = "#93C5FD"
)
) |>
visGroups(
groupname = "movie",
color = list(
background = "#F97316",
border = "#C2410C",
highlight = "#FED7AA"
),
shape = "square"
) |>
visGroups(
groupname = "costar",
color = list(
background = "#6B7280",
border = "#374151",
highlight = "#D1D5DB"
)
) |>
visEdges(
color = list(color = "#CBD5E1", highlight = "#3B82F6"),
width = 1.5
) |>
visOptions(
highlightNearest = list(enabled = TRUE, degree = 1, hover = TRUE),
nodesIdSelection = TRUE
) |>
visLayout(randomSeed = 42) |>
visPhysics(
solver = "forceAtlas2Based",
forceAtlas2Based = list(
gravitationalConstant = -60,
springLength = 120,
springConstant = 0.04
)
) |>
visLegend(position = "right", main = "Node type")
Plasați cursorul peste orice nod pentru a-i vedea eticheta. Utilizați Selectați după id meniu derulant sau un nod pentru a evidenția filmele partajate cu Tom Hanks.
Concluzie
neo2R 3.0.0 elimină ultimul punct de frecare pentru utilizatorii R care doresc să lucreze Neo4j Aura: un singur startGraph() call acum gestionează în mod uniform instanțele cloud și locale, backend-ul httr2 oferă reîncercări fiabile și o gestionare curată a erorilor, iar interfața de interogare Cypher rămâne exact așa cum era.
Lectură în continuare
