Neo4j Jesus Barrasa The Art of the Possible with Graph
Neo4j & Prisme.ai : Interrogez vos données connectées en langage naturel avec un chatbot
1. Neo4j, Inc. All rights reserved 2021
Neo4j, Inc. All rights reserved 2021
1
Interrogez vos données
connectées en langage naturel
(chatbot/callbot)
avec Neo4j & Prisme.ai
Nicolas Rouyer
Sales Engineer, Neo4j, France
Antoine Aamarcha
CEO, Prisme.ai, France
2. Neo4j, Inc. All rights reserved 2021
2
Neo4j
Dotée de performances
uniques, Neo4j est la seule
base de données de
graphes d’entreprise qui
offre le stockage graphe
natif, une architecture
évolutive et optimisée pour
la rapidité d’exécution, et la
compatibilité ACID.
L’architecture distribuée
(cluster causal) de Neo4j
supporte des tâches
transactionnelles &
analytiques complexes en
simultané. (algorithmes
graph data science)
3. Neo4j, Inc. All rights reserved 2021
3
Prisme.ai - une technologie ouverte
4. Neo4j, Inc. All rights reserved 2021
Actualités Neo4j - Pandora papers
5. Neo4j, Inc. All rights reserved 2021
Actualités Neo4j - Aura DB Free !
6. Neo4j, Inc. All rights reserved 2021
Actualités Neo4j - nouveau site GraphAcademy
7. Neo4j, Inc. All rights reserved 2021
Actualités Neo4j - événements
8. Neo4j, Inc. All rights reserved 2021
Actualités Prisme.ai - New Prisme.ai Messenger
- Un menu latéral avec une liste de service
- Theming
- Formulaires
9. Neo4j, Inc. All rights reserved 2021
Actualités Prisme.ai - Open Source DSUL-Server
- Un DSUL est un standard mis en place pour décrire une application avec des
triggers et workflows
- Nous avons décidé de mettre en Open Source le DSUL-Server (runtime)
Intents:
I_LIKE_FRUIT:
when:
match phrases:
- j'aime la [poire](fruit)
- j'aime bien les [pommes](fruit)
- j'aime les fruits
parameters:
- name: fruit
entity: Fruit
required: true
questions:
- Quel fruit tu aimes ?
do:
- say text: je suis vraiment ravi d'apprendre que tu aimes les $fruit !
10. Neo4j, Inc. All rights reserved 2021
10
Pourquoi Neo4j & Prisme.ai
1 2
La base de données
graphe native Neo4j
simplifie la complexité
backend
Prisme.ai propose un
studio low-code
d’automatisation end-
to-end boostée par le
NLP
3
Exposition d’API
native avec
GraphQL + Neo4j
11. Neo4j, Inc. All rights reserved 2021
Architecture - Assistant Prisme.ai : Chatbot + Workflow
Messaging channels
Intent: Intent p,
Entities :
EntityName1: value 1
EntityName2: value 2
EntityName3: value 3
Chatbot
Intent 1 Intent 2 ... Intent n
NLU 1 NLU 2 NLU 3
No NLU
Events
trigger
Knowledge 1 Knowledge 2 Knowledge 3
Workflow
Step 1 Step 2 ... Step n
Intent represents end
user intention that
matches with “user says”
Entities represents
named slots extracted
from the “user says” such
as cities, dates, contracts,
…
Step represents a
specific action in the
workflow such as Call
GraphQL query, send
SMS, insert in CRM..,
Scheduler
Natural Language / event trigger
12. Neo4j, Inc. All rights reserved 2021
Architecture - Neo4j et GraphQL
13. Neo4j, Inc. All rights reserved 2021
Architecture - Neo4j et GraphQL
14. Neo4j, Inc. All rights reserved 2021
Modèle graphe - mon compte twitter
ingérée dans
une base
Neo4j.
Le modèle
graphe
comprend :
● moi,
● Les
comptes
Twitter que
je suis
● mes posts
● leurs posts
● les liens,
tags &
16. Neo4j, Inc. All rights reserved 2021
16
Démo Neo4j & Cypher
1. Qui me mentionne sur Twitter?
2. Qui sont les “followers” les + influents ?
3. Quels sont les “hashtags” que j’utilise fréquemment ?
4. Quelle proportion de personnes que je suis me suivent aussi ?
5. Qui sont ceux qui tweetent sur moi, mais que je ne suis pas ?
6. Quels liens figurent dans les “retweets” ?
7. Quelles autres personnes tweetent en utilisant mes “hashtags” préférés ?
17. Neo4j, Inc. All rights reserved 2021
17
Qui me mentionne sur Twitter?
// Graph of some of your mentions
MATCH (u:User)-[p:POSTS]->(t:Tweet)-[:MENTIONS]->(m:Me:User)
WITH u,p,t,m, COUNT(m.screen_name) AS count
ORDER BY count DESC
RETURN u,p,t,m
LIMIT 10
18. Neo4j, Inc. All rights reserved 2021
18
Qui je mentionne sur Twitter?
// Graph of some of your mentions
MATCH (u:Me:User)-[p:POSTS]->(t:Tweet)-[:MENTIONS]->(m:User)
WITH u,p,t,m, COUNT(m.screen_name) AS count
ORDER BY count DESC
RETURN u,p,t,m
LIMIT 10
19. Neo4j, Inc. All rights reserved 2021
19
Parmi mes “followers”, quels sont les plus influents ?
// Most influential followers
MATCH (follower:User)-[:FOLLOWS]->(u:User:Me)
RETURN follower.screen_name AS user,
follower.followers AS followers
ORDER BY followers DESC
LIMIT 10
╒═════════════════╤═══════════╕
│"user" │"followers"│
╞═════════════════╪═══════════╡
│"matchActus" │56240 │
├─────────────────┼───────────┤
│"rasangarocks" │51146 │
├─────────────────┼───────────┤
│"Talend" │45292 │
├─────────────────┼───────────┤
│"neo4j" │36649 │
├─────────────────┼───────────┤
│"carbone" │30928 │
├─────────────────┼───────────┤
│"DontkillFreeTNT"│26183 │
├─────────────────┼───────────┤
│"La_Melee" │14481 │
├─────────────────┼───────────┤
│"LaCantine_Tlse" │13126 │
├─────────────────┼───────────┤
│"ed_dodds" │10791 │
├─────────────────┼───────────┤
│"jimwebber" │6820 │
└─────────────────┴───────────┘
20. Neo4j, Inc. All rights reserved 2021
20
Mes “hashtags” préférés
// The hashtags you have used most often
MATCH
(h:Hashtag)<-[:TAGS]-(t:Tweet)<-[:POSTS]-(u:User:Me)
WITH h, COUNT(h) AS Hashtags
ORDER BY Hashtags DESC
LIMIT 10
RETURN h.name, Hashtags
╒═══════════════╤══════════╕
│"h.name" │"Hashtags"│
╞═══════════════╪══════════╡
│"neo4j" │163 │
├───────────────┼──────────┤
│"runkeeper" │25 │
├───────────────┼──────────┤
│"graphconnect" │21 │
├───────────────┼──────────┤
│"graphdb" │18 │
├───────────────┼──────────┤
│"bigdata" │18 │
├───────────────┼──────────┤
│"toulouse" │18 │
├───────────────┼──────────┤
│"graphday" │13 │
├───────────────┼──────────┤
│"talendconnect"│10 │
├───────────────┼──────────┤
│"ndlv2015" │10 │
├───────────────┼──────────┤
│"panamapapers" │10 │
└───────────────┴──────────┘
21. Neo4j, Inc. All rights reserved 2021
21
“Followback rate” : ratio des “followers” qui me suivent
// Followback rate
MATCH (me:User:Me)-[:FOLLOWS]->(f)
WITH me, f, size((f)-[:FOLLOWS]->(me)) as doesFollowBack
RETURN SUM(doesFollowBack) / toFloat(COUNT(f)) AS followBackRate
╒════════════════╕
│"followBackRate"│
╞════════════════╡
│0.3375 │
└────────────────┘
22. Neo4j, Inc. All rights reserved 2021
22
Qui poste sur moi, que je ne suis pas ?
// Follower Recommendations - tweeting about you, but you don't follow
MATCH (ou:User)-[:POSTS]->(t:Tweet)-[mt:MENTIONS]->(me:User:Me)
WITH DISTINCT ou, me
WHERE (ou)-[:FOLLOWS]->(me)
AND NOT (me)-[:FOLLOWS]->(ou)
RETURN ou.screen_name
╒════════════════╕
│"ou.screen_name"│
╞════════════════╡
│"benoitbonte" │
├────────────────┤
│"ExcelSysFrance"│
├────────────────┤
│"geraudster" │
├────────────────┤
│"lagraula" │
└────────────────┘
23. Neo4j, Inc. All rights reserved 2021
23
Quels liens je re-poste ?
A quelle fréquence sont-ils mis en favoris?
// Links from interesting retweets
MATCH (:User:Me)-[:POSTS]->(t:Tweet)-[:RETWEETS]->(rt)-[:CONTAINS]->(link:Link)
RETURN t.id_str AS tweet, link.url AS url, rt.favorites AS favorites
ORDER BY favorites DESC
LIMIT 10
╒═════════════════════╤═════════════════════════════════════════════════════════════════╤═══════════╕
│"tweet" │"url" │"favorites"│
╞═════════════════════╪═════════════════════════════════════════════════════════════════╪═══════════╡
│"969123346855157760" │"https://twitter.com/i/web/status/967051706696683521" │13 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"993462306943184896" │"https://twitter.com/i/web/status/993462187409793026" │10 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"808381506536280064" │"https://twitter.com/i/web/status/808381317817794561" │5 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"780556194339495940" │"http://buff.ly/2d4q3m3" │5 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"1319201148264419333"│"https://twitter.com/i/web/status/1319164082289844225" │4 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"1091043031749480448"│"https://twitter.com/i/web/status/1091042931321044993" │4 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"1262316390373040128"│"https://twitter.com/i/web/status/1262316263579234304" │4 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"697409927766274049" │"http://d-booker.jo.my/neo4j-livre" │2 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"915291853758615552" │"https://www.meetup.com/fr-FR/graphdb-toulouse/events/243229177/"│2 │
├─────────────────────┼─────────────────────────────────────────────────────────────────┼───────────┤
│"1181516413414100992"│"https://twitter.com/i/web/status/1181503756132855809" │2 │
└─────────────────────┴─────────────────────────────────────────────────────────────────┴───────────┘
24. Neo4j, Inc. All rights reserved 2021
24
Quels utilisateurs postent avec mes hashtags favoris ?
// Users tweeting with your top hashtags
MATCH
(me:User:Me)-[:POSTS]->(tweet:Tweet)-[:TAGS]->(ht)
MATCH
(ht)<-[:TAGS]-(tweet2:Tweet)<-[:POSTS]-(sugg:User)
WHERE
sugg <> me
AND NOT
(tweet2)-[:RETWEETS]->(tweet)
WITH
sugg, collect(distinct(ht)) as tags
RETURN
sugg.screen_name as friend, size(tags) as common
ORDER BY
common DESC
LIMIT 20
╒════════════════╤════════╕
│"friend" │"common"│
╞════════════════╪════════╡
│"Neo4jFr" │11 │
├────────────────┼────────┤
│"CedricFauvet" │9 │
├────────────────┼────────┤
│"neo4j" │6 │
├────────────────┼────────┤
│"rvanbruggen" │5 │
├────────────────┼────────┤
│"chrissVallez" │4 │
├────────────────┼────────┤
│"hlakkache" │4 │
├────────────────┼────────┤
│"nmervaillie" │3 │
├────────────────┼────────┤
│"GraphConnect" │3 │
├────────────────┼────────┤
│"EvaDelier" │3 │
├────────────────┼────────┤
│"meisshaily" │3 │
├────────────────┼────────┤
26. Neo4j, Inc. All rights reserved 2021
26
Qui suis-je sur Twitter ?
Combien de personnes me suivent ?
27. Neo4j, Inc. All rights reserved 2021
27
Donne-moi 5 de mes posts !
query {
us {
posts(options:
{limit: 5}) {
text
created_at
}
}
}
28. Neo4j, Inc. All rights reserved 2021
28
Qui me mentionne sur Twitter ?
query {
us {
tweets {
posted_by{
name
screen_name
}
}
}
}
29. Neo4j, Inc. All rights reserved 2021
29
Qui je mentionne sur Twitter ?
query {
us {
posts {
mentions {
name
screen_name
}
}
}
}
30. Neo4j, Inc. All rights reserved 2021
30
Qui sont mes “followers” les plus influents ?
query {
us {
followed_by
(where:
{followers_GT: 5000},
options:
{sort: {followers:
DESC}}
) {
name
screen_name
followers
}
}
}
31. Neo4j, Inc. All rights reserved 2021
31
Quels sont mes “hashtags” préférés ?
query {
us {
tweets (where: {tags_NOT:
null}){
text
tags {
name
num_tweets
}
}
}
}
32. Neo4j, Inc. All rights reserved 2021
32
Jusqu’à quel point mes “followers” me suivent-ils ?
query {
us {
followBackRate
}
}
33. Neo4j, Inc. All rights reserved 2021
33
Qui poste sur moi, que je ne suis pas ?
query {
us {
tweets {
posted_by {
name
screen_name
}
}
}
}
Regarder qui tweete sur
moi...
34. Neo4j, Inc. All rights reserved 2021
34
Who tweets about me, but I don’t follow?
query {
users(where:
{screen_name_IN:
["neo4j", "lagraula"]}){
screen_name
followed_by
{screen_name}
}
}
...En sélectionner un, et vérifier si je le
suis
35. Neo4j, Inc. All rights reserved 2021
35
Quels sont les liens que je re-poste ?
A quelle fréquence sont-ils mis en favoris ?
query{
us {
posts(where: {retweets_NOT: null}) {
retweets (options: {sort: {favorites: DESC}, limit: 10}, where:
{favorites_GT: 5}) {
favorites
contains {
url
}
}
}
}
}
36. Neo4j, Inc. All rights reserved 2021
36
Quels utilisateurs postent avec mes “hashtags” préférés ?
query {
us {
posts {
tags {
name
num_tweets
}
}
}
}
Commencer par trouver
les hashtags...
37. Neo4j, Inc. All rights reserved 2021
37
Quels utilisateurs postent avec mes “hashtags” préférés ?
query {
hashtags(where: {name_IN:
["neo4j", "Neo4j"]}) {
name
tweets {
posted_by(where:
{screen_name_NOT: "rrrouyer"})
{
name
screen_name
}
}
}
}
...ensuite, les filtrer et
chercher les utilisateurs
qui postent avec ces
hashtags
39. Neo4j, Inc. All rights reserved 2021
Création d’un utilisateur
mutation {
createUsers(input: [
{
name: "smoothtalker"
screen_name: "Smooth Talker"
}
]) {
users {
name
screen_name
}
}
}
{
"data": {
"createUsers": {
"users": [
{
"name": "smoothtalker",
"screen_name": "Smooth
Talker"
}
]
}
}
}
40. Neo4j, Inc. All rights reserved 2021
Recherche du nouvel utilisateur
query {users( where:
{name: "smoothtalker"} ){
name
screen_name
}}
{
"data": {
"users": [
{
"name": "smoothtalker",
"screen_name": "Smooth
Talker"
}
]
}
}
41. Neo4j, Inc. All rights reserved 2021
Création d’un nouvel utilisateur + tweet
mutation {
createUsers(input: [
{
name: "Nicooo"
screen_name: "nicooo"
posts: {
create: [
{
node: {
id: 123456
text: "Hi, my name is John!"
}
}
]
}
}
]) {
users {
name
posts {
id
text
}
}
}
}
{
"data": {
"createUsers": {
"users": [
{
"name": "Nicooo",
"posts": [
{
"id": "123456",
"text": "Hi, my name is
John!"
}
]
}
]
}
}
}
42. Neo4j, Inc. All rights reserved 2021
Récupération du nouvel utilisateur avec son tweet
query {users (where: {name: "AAA"}){
name
screen_name
posts {text}
}}
{
"data": {
"users": [
{
"name": "Nicooo",
"screen_name": "nicooo",
"posts": [
{
"text": "Hi, my name is
John!"
}
]
}
]
}
}
43. Neo4j, Inc. All rights reserved 2021
Mise à jour utilisateur en créant un tweet
mutation {
updateUsers(
where: { name: "AAA" }
create: {
posts: [
{ node:
{
id: 100000001
text: "An interesting way of adding a second Post!" } }
]
}
) {
users {
name
screen_name
posts {
text
}
}
}
}
{
"data": {
"updateUsers": {
"users": [
{
"name": "AAA",
"screen_name": "AAA",
"posts": [
{
"text": "An interesting way of adding a second Post!"
},
{
"text": "An interesting way of adding a new Post!"
},
{
"text": "Salut Nicolas"
}
]
}
]
}
}
}
44. Neo4j, Inc. All rights reserved 2021
Récupération de l’utilisateur actuel avec ses tweets
{
"data": {
"updateUsers": {
"users": [
{
"name": "AAA",
"screen_name": "AAA",
"posts": [
{
"text": "An interesting way of adding a second Post!"
},
{
"text": "An interesting way of adding a new Post!"
},
{
"text": "Salut Nicolas"
}
]
}
]
}
}
}