SlideShare uma empresa Scribd logo
1 de 66
Baixar para ler offline
Elixir + Neo4j
Regina Imhoff
Regina Imhoff

StabbyMcDuck

StabbyMcDuck

BlueRosebud
Project: github.com/StabbyMcDuck/elixir_ravelry
What is Neo4j?
• A graph database

• NoSQL / non-relational

• Uses Cypher for queries

• ACID compliant

• Just like many relational databases!
What is Neo4j?
• CRUD 

• Connected data

• Social networks

• Graph-based search

• Real-Time Recommendations

• More!
What is a graph?
Charles
Annie Betty
Follows
Follow
s Follow
s
Follows
Node
(Vertex)
Charles
Annie Betty
Follows
Follow
s Follow
s
Follows
Node
(Vertex)
Relationship
(Edge)
Charles
Annie Betty
Follows
Follow
s Follow
s
Follows
Node
(Vertex)
Relationship
(Edge)
Two directed relationships
Charles
Annie Betty
Follows
Follow
s Follow
s
Follows
Labeled Property Graph Model
• Nodes 

• Contain properties (key-value pairs)

• Have one or more labels

• Relationships

• Have names

• Are directed

• Can also contain properties
Why Use a Graph Database?
• Performance

• SQL performance gets worse with large data sets

• Especially compared to join-intensive queries in SQL

• Graph databases remain mostly constant

• Queries are localized to a section the graph
Why Use a Graph Database?
• Flexibility

• Graph databases are additive

• Can add new kinds of relationships, nodes, labels,
subgraphs, etc. to existing structure

• Won't disturb existing queries!

• Less developer time spent on modeling domains
Why Use a Graph Database?
• Agility 

• Schema-free

• Change the data model as you develop
Elixir Ravelry Project
• Replicating a portion of Ravelry.com

• The manufacturing and sales of yarn

• Applicable to most social and manufacturing
processes
Elixir Ravelry
BFL image: http://www.ansi.okstate.edu/breeds/sheep/bluefacedleicester/
Wool
Cards
Material For
User
Roving
Carding image: http://westernreservepublicmedia.org/halefarm/loghouse_wool.htm
Owns
User
Owns
User
Wool
Cards
Material For
User
Roving
Roving
Material For Dyed
Roving
User
Dyes
Roving image: https://www.etsy.com/shop/Pigeonroof
Dyed
Roving
Spins
Material For
Yarn
User
Plies image: http://www.gangalibas.com/
Dyed
Roving
Spins
Material For
Yarn
User
Dyed
Roving
Spins
Material For
Material For
Yarn
User
Roving
Material For
Material For
Knits
Project
User
Yarn
Patterns
Authors
Pattern
User
Wool
Roving
User
Cards
Material For
Dyed
Roving
Material For
User
Dyes
Yarn
Material For
User
Spins
Material For
Project
Material For
User
Knits
Pattern
Patterns
User
Authors
Material For
😱☠🐑 RUT-ROH! 🐑☠😱
• Scenario: somebody who purchased a skein of yarn
has tested positive for anthrax!

• We need to find all the people who were involved in
the production of this dye lot to test them too
SQL Query
// Spinner
SELECT users.*
FROM users
INNER JOIN spinnings
ON spinnings.spinner_id = users.id
INNER JOIN yarn
ON yarn.material_id = spinnings.id
INNER JOIN users as knitters
ON knitters.id = yarn.knitter_id
WHERE knitters.name = "Bob"
UNION
SQL Query
// Dyed Roving
SELECT users.*
FROM users
INNER JOIN dyed_roving
ON dyed_roving.dyer_id = users.id
INNER JOIN spinnings
ON spinnings.material_id = dyed_roving.id
INNER JOIN yarn
ON yarn.material_id = spinnings.id
INNER JOIN users as knitters
ON knitters.id = yarn.knitter_id
WHERE knitters.name = "Bob"
UNION
SQL Query
// Roving
SELECT users.*
FROM users
INNER JOIN roving
ON roving.carder_id = users.id
INNER JOIN dyed_roving
ON dyed_roving.material_id = roving.id
INNER JOIN spinnings
ON spinnings.material_id = dyed_roving.id
INNER JOIN yarn
ON yarn.material_id = spinnings.id
INNER JOIN users as knitters
ON knitters.id = yarn.knitter_id
WHERE knitters.name = "Bob"
Cypher Query
MATCH (p:User)-[:OWNS]->(y:Yarn)-[*]-(q:User)
WHERE p.name = ‘Bob'
AND y.name = ‘sherlock'
RETURN q
Cypher Query
MATCH (p:User)-[:OWNS]->(y:Yarn)-[*]-(q:User)
WHERE p.name = ‘Bob'
AND y.name = ‘sherlock'
RETURN q
Variable
Cypher Query
MATCH (p:User)-[:OWNS]->(y:Yarn)-[*]-(q:User)
WHERE p.name = ‘Bob'
AND y.name = ‘sherlock'
RETURN q
Variable
Node
Cypher Query
MATCH (p:User)-[:OWNS]->(y:Yarn)-[*]-(q:User)
WHERE p.name = ‘Bob'
AND y.name = ‘sherlock'
RETURN q
Variable
Relationship
Node
Cypher Query
MATCH (p:User)-[:OWNS]->(y:Yarn)-[*]-(q:User)
WHERE p.name = ‘Bob'
AND y.name = ‘sherlock'
RETURN q
Variable
Relationship Variable length pathNode
Cypher Query
MATCH (p:User)-[:OWNS]->(y:Yarn)-[*]-(q:User)
WHERE p.name = ‘Bob'
AND y.name = ‘sherlock'
RETURN q
Variable
Relationship Variable length path TypeNode
Cypher Query
MATCH (p:User)-[:OWNS]->(y:Yarn)-[*]-(q:User)
WHERE p.name = ‘Bob'
AND y.name = ‘sherlock'
RETURN q
Variable
Relationship
Directed Relationship
Variable length path TypeNode
Cypher
• Neo4j local browser

• Make queries

• See data

• Interact with data
Enter Bolt.Sips
• hexdocs.pm/bolt_sips

• Neo4j driver for Elixir

• Uses Bolt protocol

• Supports Cypher queries

• Connection pool
What about Ecto?
• Ecto Query 

• Not for any graph databases ☹

• Ecto Repo 

• No adapter for Neo4j 😢

• Ecto Schema 

• No nodes, no relationships 😭
Manage Transactions
setup %{conn: conn} do
bolt_sips_conn =
Bolt.Sips.conn()
!|> Bolt.Sips.begin()
on_exit fn !->
Bolt.Sips.rollback(bolt_sips_conn)
end
conn = Plug.Conn.put_private(conn, :bolt_sips_conn, bolt_sips_conn)
%{bolt_sips_conn: bolt_sips_conn, conn: conn}
end
Manage Transactions
setup %{conn: conn} do
bolt_sips_conn =
Bolt.Sips.conn()
!|> Bolt.Sips.begin()
on_exit fn !->
Bolt.Sips.rollback(bolt_sips_conn)
end
conn = Plug.Conn.put_private(conn, :bolt_sips_conn, bolt_sips_conn)
%{bolt_sips_conn: bolt_sips_conn, conn: conn}
end
Manage Transactions
setup %{conn: conn} do
bolt_sips_conn =
Bolt.Sips.conn()
!|> Bolt.Sips.begin()
on_exit fn !->
Bolt.Sips.rollback(bolt_sips_conn)
end
conn = Plug.Conn.put_private(conn, :bolt_sips_conn, bolt_sips_conn)
%{bolt_sips_conn: bolt_sips_conn, conn: conn}
end
bolt_sips_conn
def bolt_sips_conn(conn) do
Map.get_lazy(conn.private,
:bolt_sips_conn,
&Bolt.Sips.conn/0)
end
def index(conn, _params) do
dyed_roving = conn
!|> bolt_sips_conn()
!|> Repo.DyedRoving.list()
json conn, dyed_roving
end
defmacro !__using!__([]) do
quote do
alias ElixirRavelry.Repo
def get(conn, id) do
Repo.get_node(conn, type(), id)
end
def graph(conn, id, direction) do
Repo.graph(conn, type(), id, direction)
end
def list(conn) do
Repo.list_node(conn, type())
end
end
end
@callback row_to_struct(%Bolt.Sips.Types.Node{}) !::
struct
@callback create(conn !:: %Bolt.Sips.Connection{}, struct) !::
struct
def create(conn, %Owns{started_at: started_at, user_id: user_id, wool_id: wool_id}) do
Repo.create_relationship(conn,
%{type: type(),
end_node_id: wool_id,
start_node_id: user_id,
started_at: Repo.to_timestamp(started_at)})
end
def row_to_struct(
%Bolt.Sips.Types.Relationship{
"end": wool_id,
id: id,
properties: %{
"started_at" !=> started_at_timestamp
},
start: user_id,
type: type()
}
) do
%Owns{
!__meta!__: %Ecto.Schema.Metadata{
source: {nil, type()},
state: :loaded
},
id: id,
wool_id: wool_id,
user_id: user_id,
started_at: Repo.from_timestamp(started_at_timestamp)
}
end
def row_to_struct(
%Bolt.Sips.Types.Relationship{
"end": wool_id,
id: id,
properties: %{
"started_at" !=> started_at_timestamp
},
start: user_id,
type: type()
}
) do
%Owns{
!__meta!__: %Ecto.Schema.Metadata{
source: {nil, type()},
state: :loaded
},
id: id,
wool_id: wool_id,
user_id: user_id,
started_at: Repo.from_timestamp(started_at_timestamp)
}
end
def row_to_struct(
%Bolt.Sips.Types.Relationship{
"end": wool_id,
id: id,
properties: %{
"started_at" !=> started_at_timestamp
},
start: user_id,
type: type()
}
) do
%Owns{
!__meta!__: %Ecto.Schema.Metadata{
source: {nil, type()},
state: :loaded
},
id: id,
wool_id: wool_id,
user_id: user_id,
started_at: Repo.from_timestamp(started_at_timestamp)
}
end
def graph(conn, type ! nil, id, direction, options) do
n_type = if type do
":!#{type}"
else
""
end
conn
!|> Bolt.Sips.query!(
"""
MATCH (n!#{n_type})
WHERE id(n) = toInteger({id})
!#{graph_optional_match(direction, options)}
WITH !#{graph_with(direction)}
RETURN !#{graph_return(direction)}
""",
cypher_parameters(id, options)
)
!|> graph_return_to_map()
end
defp graph_optional_match("forward", options) do
"OPTIONAL MATCH forward = (n)-[forward_relationship*0!..]!->(sink!#{forward_type(options)})"
end
defp graph_optional_match("both", options) do
"!#{graph_optional_match("forward", options)}n!#{graph_optional_match("backwards", options)}"
end
defp graph_optional_match("backwards", options) do
"OPTIONAL MATCH backwards = (source!#{backwards_type(options)})-[backwards_relationship*0!..]!->(n)"
end
defp graph_optional_match("forward", options) do
"OPTIONAL MATCH forward = (n)-[forward_relationship*0!..]!->(sink!#{forward_type(options)})"
end
conn = get conn,
"/api/v1/projects/!#{project.id}/graph",
%{"direction" !=> "backwards", "type" !=> "User"}
MATCH (n#{n_type})
WHERE id(n) = toInteger({id})
OPTIONAL MATCH backwards = (source#{backwards_type(options)})-
[backwards_relationship*0..]->(n)
WITH COLLECT(DISTINCT source) as source_nodes,
COLLECT(DISTINCT head(backwards_relationship)) as backwards_rels
RETURN source_nodes, backwards_rels
MATCH (n#{n_type})
WHERE id(n) = toInteger({id})
OPTIONAL MATCH backwards = (source#{backwards_type(options)})-
[backwards_relationship*0..]->(n)
WITH COLLECT(DISTINCT source) as source_nodes,
COLLECT(DISTINCT head(backwards_relationship)) as backwards_rels
RETURN source_nodes, backwards_rels
Real Time Updates
• The Goal: 

• See changes to the graph as it is updated

• The Problem: 

• Don’t want to send the whole graph every single time it’s updated

• The Solution: 

• Store the previously sent graph on the socket
Real Time Updates
• Nodes are created before relationships

• Relationships need a start node and an end node

• Monitor when relationships are created
Dyed
Roving
Dyed
Roving Yarn
Dyed
Roving
Material For
Yarn
intercept ["graph_update"]
def handle_out(event = "graph_update",
%{nodes: nodes, relationships: relationships},
socket = %Phoenix.Socket{
assigns: %{node_id_set: node_id_set,
relationship_id_set: relationship_id_set}}) do
# !!...Calculate filtered graph!!...
push socket, event, filtered_graph
new_socket = socket
!|> assign(:node_id_set, new_node_id_set)
!|> assign(:relationship_id_set,
new_relationship_id_set)
{:noreply, new_socket}
end
Real Time Updates
1. Create relationship in Repo

2. Graph query on start or end node id of relationship 

3. Broadcast for each node in graph to that node’s graph id topic
Testing Real Time Updates
conn = post conn, "/api/v1/material-for",
%{start_node_id: yarn.id, end_node_id: project.id}
conn =
conn
!|> recycle()
!|> Plug.Conn.put_private(:bolt_sips_conn, bolt_sips_conn)
!|> post("/api/v1/cards", %{user_id: cards_user.id,
roving_id: roving.id})
topic = “graph:!#{project.id}"
assert_receive %Phoenix.Socket.Message{
event: "graph_update",
topic: ^topic,
payload: %{
nodes: first_nodes,
relationships: _first_relationships
}
}
Future Work
• Ecto Adapter

• Use Ecto Schema to do type conversions

• Remove need to pass Bolt.Sips.Conn everywhere

• Query Library

• Ecto Query won’t support Cypher keywords
Additional Resources
• O’Reilly Graph Databases 

• Free download: neo4j.com/graph-databases-book

• Cypher Refcard

• neo4j.com/docs/cypher-refcard/current

• GraphConnect

• graphconnect.com
💖💖💖
• Florin Patrascu @florin

• Karin Wolok @hellojewfro

• Luke Imhoff @kronicdeth

Mais conteúdo relacionado

Mais procurados

Mais procurados (9)

What's in a language? By Cheng Lou
What's in a language? By Cheng Lou What's in a language? By Cheng Lou
What's in a language? By Cheng Lou
 
Advanced Django ORM techniques
Advanced Django ORM techniquesAdvanced Django ORM techniques
Advanced Django ORM techniques
 
jQuery
jQueryjQuery
jQuery
 
jQuery for beginners
jQuery for beginnersjQuery for beginners
jQuery for beginners
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do More
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
JQuery introduction
JQuery introductionJQuery introduction
JQuery introduction
 
Learn css3
Learn css3Learn css3
Learn css3
 
jQuery Introduction
jQuery IntroductionjQuery Introduction
jQuery Introduction
 

Semelhante a Elixir + Neo4j

Introduction to Graphs with Neo4j
Introduction to Graphs with Neo4jIntroduction to Graphs with Neo4j
Introduction to Graphs with Neo4jNeo4j
 
Alternatives of JPA/Hibernate
Alternatives of JPA/HibernateAlternatives of JPA/Hibernate
Alternatives of JPA/HibernateSunghyouk Bae
 
Webinar: Working with Graph Data in MongoDB
Webinar: Working with Graph Data in MongoDBWebinar: Working with Graph Data in MongoDB
Webinar: Working with Graph Data in MongoDBMongoDB
 
MongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDBMongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDBMongoDB
 
A Related Matter: Optimizing your webapp by using django-debug-toolbar, selec...
A Related Matter: Optimizing your webapp by using django-debug-toolbar, selec...A Related Matter: Optimizing your webapp by using django-debug-toolbar, selec...
A Related Matter: Optimizing your webapp by using django-debug-toolbar, selec...Christopher Adams
 
MIKE Stack Introduction - MongoDB, io.js, KendoUI, and Express
MIKE Stack Introduction - MongoDB, io.js, KendoUI, and ExpressMIKE Stack Introduction - MongoDB, io.js, KendoUI, and Express
MIKE Stack Introduction - MongoDB, io.js, KendoUI, and ExpressCharlie Key
 
Compiler2016 by abcdabcd987
Compiler2016 by abcdabcd987Compiler2016 by abcdabcd987
Compiler2016 by abcdabcd987乐群 陈
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101Samantha Geitz
 
Neo4j Introduction (for Techies)
Neo4j Introduction (for Techies)Neo4j Introduction (for Techies)
Neo4j Introduction (for Techies)Patrick Baumgartner
 
Schema design short
Schema design shortSchema design short
Schema design shortMongoDB
 
How We UITest with GraphQL
How We UITest with GraphQL How We UITest with GraphQL
How We UITest with GraphQL hayato iida
 
PostgreSQL Materialized Views with Active Record
PostgreSQL Materialized Views with Active RecordPostgreSQL Materialized Views with Active Record
PostgreSQL Materialized Views with Active RecordDavid Roberts
 
The openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageThe openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageNeo4j
 
Python & Django TTT
Python & Django TTTPython & Django TTT
Python & Django TTTkevinvw
 
Cassandra drivers and libraries
Cassandra drivers and librariesCassandra drivers and libraries
Cassandra drivers and librariesDuyhai Doan
 
Neo4j Introduction (Basics, Cypher, RDBMS to GRAPH)
Neo4j Introduction (Basics, Cypher, RDBMS to GRAPH) Neo4j Introduction (Basics, Cypher, RDBMS to GRAPH)
Neo4j Introduction (Basics, Cypher, RDBMS to GRAPH) David Fombella Pombal
 
Extreme Swift
Extreme SwiftExtreme Swift
Extreme SwiftMovel
 
GraphQL over REST
GraphQL over RESTGraphQL over REST
GraphQL over RESTBongwon Lee
 

Semelhante a Elixir + Neo4j (20)

Introduction to Graphs with Neo4j
Introduction to Graphs with Neo4jIntroduction to Graphs with Neo4j
Introduction to Graphs with Neo4j
 
Elastic tire demo
Elastic tire demoElastic tire demo
Elastic tire demo
 
Alternatives of JPA/Hibernate
Alternatives of JPA/HibernateAlternatives of JPA/Hibernate
Alternatives of JPA/Hibernate
 
Webinar: Working with Graph Data in MongoDB
Webinar: Working with Graph Data in MongoDBWebinar: Working with Graph Data in MongoDB
Webinar: Working with Graph Data in MongoDB
 
MongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDBMongoDB Europe 2016 - Graph Operations with MongoDB
MongoDB Europe 2016 - Graph Operations with MongoDB
 
Naver_alternative_to_jpa
Naver_alternative_to_jpaNaver_alternative_to_jpa
Naver_alternative_to_jpa
 
A Related Matter: Optimizing your webapp by using django-debug-toolbar, selec...
A Related Matter: Optimizing your webapp by using django-debug-toolbar, selec...A Related Matter: Optimizing your webapp by using django-debug-toolbar, selec...
A Related Matter: Optimizing your webapp by using django-debug-toolbar, selec...
 
MIKE Stack Introduction - MongoDB, io.js, KendoUI, and Express
MIKE Stack Introduction - MongoDB, io.js, KendoUI, and ExpressMIKE Stack Introduction - MongoDB, io.js, KendoUI, and Express
MIKE Stack Introduction - MongoDB, io.js, KendoUI, and Express
 
Compiler2016 by abcdabcd987
Compiler2016 by abcdabcd987Compiler2016 by abcdabcd987
Compiler2016 by abcdabcd987
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101
 
Neo4j Introduction (for Techies)
Neo4j Introduction (for Techies)Neo4j Introduction (for Techies)
Neo4j Introduction (for Techies)
 
Schema design short
Schema design shortSchema design short
Schema design short
 
How We UITest with GraphQL
How We UITest with GraphQL How We UITest with GraphQL
How We UITest with GraphQL
 
PostgreSQL Materialized Views with Active Record
PostgreSQL Materialized Views with Active RecordPostgreSQL Materialized Views with Active Record
PostgreSQL Materialized Views with Active Record
 
The openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageThe openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query Language
 
Python & Django TTT
Python & Django TTTPython & Django TTT
Python & Django TTT
 
Cassandra drivers and libraries
Cassandra drivers and librariesCassandra drivers and libraries
Cassandra drivers and libraries
 
Neo4j Introduction (Basics, Cypher, RDBMS to GRAPH)
Neo4j Introduction (Basics, Cypher, RDBMS to GRAPH) Neo4j Introduction (Basics, Cypher, RDBMS to GRAPH)
Neo4j Introduction (Basics, Cypher, RDBMS to GRAPH)
 
Extreme Swift
Extreme SwiftExtreme Swift
Extreme Swift
 
GraphQL over REST
GraphQL over RESTGraphQL over REST
GraphQL over REST
 

Último

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 

Último (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 

Elixir + Neo4j