SlideShare a Scribd company logo
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

More Related Content

What's hot (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
 

Similar to 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
 

Similar to 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
 

Recently uploaded

Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀DianaGray10
 
Optimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityOptimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityScyllaDB
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Thierry Lestable
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaRTTS
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Jeffrey Haguewood
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backElena Simperl
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxAbida Shariff
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1DianaGray10
 
IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoTAnalytics
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesThousandEyes
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Alison B. Lowndes
 
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka DoktorováCzechDreamin
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Product School
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Product School
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
 
IESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIES VE
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Product School
 
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)Julian Hyde
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersSafe Software
 

Recently uploaded (20)

Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
 
Optimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityOptimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through Observability
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
 
UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1UiPath Test Automation using UiPath Test Suite series, part 1
UiPath Test Automation using UiPath Test Suite series, part 1
 
IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024IoT Analytics Company Presentation May 2024
IoT Analytics Company Presentation May 2024
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
 
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
IESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIESVE for Early Stage Design and Planning
IESVE for Early Stage Design and Planning
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 

Elixir + Neo4j