SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

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
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
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
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
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
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 

Kürzlich hochgeladen (20)

Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
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
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
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...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 

Elixir + Neo4j