Interogarea Neo4j Aura din R cu neo2R

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(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.

Ilustrație a neo2R folosit pentru a se conecta la Aura, generată cu Gemeni

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:

  1. 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).
  2. backend httr2 — stratul HTTP intern a migrat din cel depreciat httr pachet la httr2.

Î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                           n
                         
1 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          n
       
1 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             movies
                 
 1 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   director            
                                 
 1 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_movie        
                                
 1 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

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.