SlideShare uma empresa Scribd logo
1 de 131
Baixar para ler offline
Időzített automatatanulás Cypherrel
Szárnyas Gábor, Farkas Rebeka, Elekes Márton, Gujgiczer Anna
Budapest Neo4j meetup 2018. február 13.
Sicco Verwer, Mathijs de Weerdt, Cees Witteveen:
An algorithm for learning real-time automata.
Benelearn 2007
AKADÁLYOK
 Cikk tartalma:
o Absztrakt leírások
o Formalizálás hiánya
Elakadtunk
AKADÁLYOK
 Cikk tartalma:
o Absztrakt leírások
o Formalizálás hiánya
Elakadtunk
 Megoldás:
SZERKEZET
 Rebus: Elméleti háttér
 Anna: Érdekes lekérdezések
 Marci: Neo4j munkafolyamat
 Gábor: Tapasztalatok, tanulságok
Automatatanulás
ÁLLAPOTGÉP
Off
Stop
Continue
Prepare
Go
switchPhase
switchPhase
switch
Phase
onOff
onOff
onOff onOff
onOff
switch
Phase
switch
Phase
ÁLLAPOTGÉP
Off
Stop
Continue
Prepare
Go
switchPhase
switchPhase
switch
Phase
onOff
onOff
onOff onOff
onOff
switch
Phase
switch
Phase
AUTOMATA
 Állapotok: elfogadó/nem elfogadó
 Lefutás: (véges) eseménysorozat
 Elfogadott lefutás:
elfogadó állapotban végződik
 Modellezett viselkedés:
elfogadott lefutásokOff
Stop
Continue
Prepare
Go
switchPhase
switchPhase
switch
Phase
onOff
onOff
onOff onOff
onOff
switch
Phase
switch
Phase
AUTOMATA
 Állapotok: elfogadó/nem elfogadó
 Lefutás: (véges) eseménysorozat
 Elfogadott lefutás:
elfogadó állapotban végződik
 Modellezett viselkedés:
elfogadott lefutásokOff
Stop
Continue
Prepare
Go
switchPhase
switchPhase
switch
Phase
onOff
onOff
onOff onOff
onOff
switch
Phase
+
- -
- -
switch
Phase
IDŐZÍTÉS
 Állapotban eltöltött idő
 Őrfeltétel - intervallum
Off
Stop
Continue
Prepare
Go
switchPhase
switchPhase
switch
Phase
onOff
onOff
onOff onOff
onOff
switch
Phase
+
- -
- -
switch
Phase
IDŐZÍTÉS
 Állapotban eltöltött idő
 Őrfeltétel - intervallum
Off
Stop
Continue
Prepare
Go
switchPhase
switchPhase
switch
Phase
onOff
onOff
onOff onOff
onOff
switch
Phase
+
- -
- -
[3,5]
[30,35]
[1,2]
switch
Phase
[30,35]
[0,∞]
[0,∞]
[0,∞]
[0,∞]
[0,∞]
[0,∞]
AUTOMATATANULÁS
 Rendszer - ismeretlen belső megvalósítás
 Cél: működés feltérképezése
 Eszköz: megfigyelés  lefutások  automata
 Alkalmazás: monitorszintézis, tesztelés
AUTOMATATANULÁS ALAPJAI
+
-
-
+
a,1
a,5
+
a,3
a,5 a,7
a,2
+ -
a,[1,2]
+
a,[1,5]
+
a,[3,5]
-
a,[1,5]
+ -
a, [1,2]
a,[1,2]
a, [3,5] a, [3,5]
AUTOMATATANULÁS ALGORITMUSA
 Három művelet ismétlése
o Split: Inkonzisztens állapotok szétválasztása
+ -
a,[1,2]
+
a,[1,5]
+
a,[3,5]
-
a,[1,5]
+ +/-
a,[1,5]
+/-
a,[1,5]
+
-
-
+
a,1
a,5
+
a,3
a,5 a,7
a,2
AUTOMATATANULÁS ALGORITMUSA
 Három művelet ismétlése
o Split: Inkonzisztens állapotok szétválasztása
o Merge: Hasonló állapotok összevonása
-
-
b
+
+
a
a
-b
+
+
a
a
-b +
a
AUTOMATATANULÁS ALGORITMUSA
 Három művelet ismétlése
o Split: Inkonzisztens állapotok szétválasztása
o Merge: Hasonló állapotok összevonása
o Color: Állapot véglegesítése
AUTOMATATANULÁS ALGORITMUSA
 Három művelet ismétlése
o Split: Inkonzisztens állapotok szétválasztása
o Merge: Hasonló állapotok összevonása
o Color: Állapot véglegesítése
 Művelet kiválasztása: metrika
o A művelet eredménye alapján
Művelet kiválasztása
Split
végrehajtása
Merge
végrehajtása
Color
végrehajtása
Megvalósítás
ÉRDEKES LEKÉRDEZÉSEK
 Sokszor használt WHERE NOT
 Merge
o Összevonandó állapotok tranzitív lezártja
 Split: kategóriasorolás/részfamásolás
o Merge miatt több origNext él is lehet
o Melyik alapján soroljunk kategóriába?
WHERE NOT «MINTA»
 Útvonal végének megtalálása
WHERE NOT (v)-[:NEXT]->()
:NEXT :NEXT
… …v :NEXT
WHERE NOT «MINTA»
 Útvonal végének megtalálása
WHERE NOT (v)-[:NEXT]->()
:NEXT :NEXT
… …v :NEXT
WHERE NOT «MINTA»
 Útvonal végének megtalálása
 Útvonal elejének megtalálása
WHERE NOT (v)-[:NEXT]->()
WHERE NOT ()-[:NEXT]->(root)
:NEXT :NEXT
… …:NEXT
root
WHERE NOT «MINTA»
 Útvonal végének megtalálása
 Útvonal elejének megtalálása
WHERE NOT (v)-[:NEXT]->()
WHERE NOT ()-[:NEXT]->(root)
:NEXT :NEXT
… …:NEXT
root
MERGE
:indexPair :indexPair
-
-:NEXT
:NEXT
+
+
:NEXT
:NEXT
…
…
:indexPair
-:NEXT
+:NEXT
…
 Összevonandó állapotok megjelölése
 Metrika számítása
 Inkonzisztencia kiszűrése
 Eredmény
MERGE +
-
:indexPair
:indexPair
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
:indexPair
:indexPair
+
-:NEXT
:NEXT
MERGE +
-
:indexPair
:indexPair
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
:indexPair
:indexPair
+
-:NEXT
:NEXT
while (driver.run(createIndexPairs, mergeMap))
MERGE +
-
:indexPair
:indexPair
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
:indexPair
:indexPair
+
-:NEXT
:NEXT
MATCH (s1:IndexedMerge)-[:IndexPair*..]-(s2:IndexedMerge),
s1p = (s1)-[:NEXT*0..]->(s12:State), s2p = (s2)-[:NEXT*0..]->(s22:State)
WHERE id(s1) > id(s2) AND length(s1p) = length(s2p)
AND NOT (s12)-[:IndexPair*0..]-(s22)
WITH s12, s22, s1p, s2p,[s1r IN rels(s1p) | s1r.symbol] AS s1ss, [s2r IN rels(s2p) | s2r.symbol] AS s2ss,
[s1r IN rels(s1p) | s1r.Tmin] AS s1mins, [s2r IN rels(s2p) | s2r.Tmin ] AS s2mins,
[s1r IN rels(s1p) | s1r.Tmax] AS s1maxs, [s2r IN rels(s2p) | s2r.Tmax ] AS s2maxs
WHERE s1ss = s2ss AND s1mins = s2mins AND s1maxs = s2maxs
WITH collect([s12, s22]) as pairs
MATCH ()-[ip:IndexPair]->()
WITH max(ip.index) + 1 as nextIndex, pairs
UNWIND range(0, length(pairs)-1) as idx
WITH pairs[idx][0] as s12, pairs[idx][1] as s22, idx + nextIndex as edgeIndex
CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22)
SET s12:IndexedMerge, s22:IndexedMerge
while (driver.run(createIndexPairs, mergeMap))
MERGE +
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXT
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
MERGE
MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge),
s1p = (s1)-[:NEXT*0..]->(s12:State),
s2p = (s2)-[:NEXT*0..]->(s22:State)
WHERE id(s1) > id(s2) AND length(s1p) = length(s2p)
AND NOT (s12)-[:IndexPair*0..]-(s22)
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXT
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
MERGE
MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge),
s1p = (s1)-[:NEXT*0..]->(s12:State),
s2p = (s2)-[:NEXT*0..]->(s22:State)
WHERE id(s1) > id(s2) AND length(s1p) = length(s2p)
AND NOT (s12)-[:IndexPair*0..]-(s22)
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXT
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
Ellenőrzés szempontjából
kritikus állapotpárok
MERGE
MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge),
s1p = (s1)-[:NEXT*0..]->(s12:State),
s2p = (s2)-[:NEXT*0..]->(s22:State)
WHERE id(s1) > id(s2) AND length(s1p) = length(s2p)
AND NOT (s12)-[:IndexPair*0..]-(s22)
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXT
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
s1 s1
s2 s2
Ellenőrzés szempontjából
kritikus állapotpárok
MERGE
MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge),
s1p = (s1)-[:NEXT*0..]->(s12:State),
s2p = (s2)-[:NEXT*0..]->(s22:State)
WHERE id(s1) > id(s2) AND length(s1p) = length(s2p)
AND NOT (s12)-[:IndexPair*0..]-(s22)
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXT
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
s1 s1
s2 s2
WITH s12, s22, s1p, s2p,
[s1r IN rels(s1p) | s1r.symbol] AS s1ss, [s2r IN rels(s2p) | s2r.symbol] AS s2ss,
[s1r IN rels(s1p) | s1r.Tmin] AS s1mins, [s2r IN rels(s2p) | s2r.Tmin ] AS s2mins,
[s1r IN rels(s1p) | s1r.Tmax] AS s1maxs, [s2r IN rels(s2p) | s2r.Tmax ] AS s2maxs
WHERE s1ss = s2ss AND s1mins = s2mins AND s1maxs = s2maxs
...
Ellenőrzés szempontjából
kritikus állapotpárok
MERGE
MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge),
s1p = (s1)-[:NEXT*0..]->(s12:State),
s2p = (s2)-[:NEXT*0..]->(s22:State)
WHERE id(s1) > id(s2) AND length(s1p) = length(s2p)
AND NOT (s12)-[:IndexPair*0..]-(s22)
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXT
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
s1 s1
s2 s2
WITH s12, s22, s1p, s2p,
[s1r IN rels(s1p) | s1r.symbol] AS s1ss, [s2r IN rels(s2p) | s2r.symbol] AS s2ss,
[s1r IN rels(s1p) | s1r.Tmin] AS s1mins, [s2r IN rels(s2p) | s2r.Tmin ] AS s2mins,
[s1r IN rels(s1p) | s1r.Tmax] AS s1maxs, [s2r IN rels(s2p) | s2r.Tmax ] AS s2maxs
WHERE s1ss = s2ss AND s1mins = s2mins AND s1maxs = s2maxs
...
• Ugyan olyan hosszú útvonal
• Ugyan olyan események
• Stb.
Ellenőrzés szempontjából
kritikus állapotpárok
MERGE
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXTs1 s1
s2 s2
MERGE
CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22)
SET s12:IndexedMerge, s22:IndexedMerge
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXTs1 s1
s2 s2
MERGE
CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22)
SET s12:IndexedMerge, s22:IndexedMerge
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXTs1 s1
s2 s2
Új megtalált indexpárok
megjelölése
MERGE
CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22)
SET s12:IndexedMerge, s22:IndexedMerge
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXTs1 s1
s2 s2
:indexPair :indexPair
Új megtalált indexpárok
megjelölése
MERGE
CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22)
SET s12:IndexedMerge, s22:IndexedMerge
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXTs1 s1
s2 s2
:indexPair :indexPair
Új megtalált indexpárok
megjelölése
while (driver.run(createIndexPairs, mergeMap))
MERGE
CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22)
SET s12:IndexedMerge, s22:IndexedMerge
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXTs1 s1
s2 s2
:indexPair :indexPair
Új megtalált indexpárok
megjelölése
while (driver.run(createIndexPairs, mergeMap))
Java kódból hívva
ciklikusan
MERGE
CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22)
SET s12:IndexedMerge, s22:IndexedMerge
 Probléma
o Nem érzékel inkonzisztenciát
 Megoldás
o Tranzitív lezárt
+
-
:indexPair
:indexPair
:indexPair
:indexPair
+
-:NEXT
:NEXTs1 s1
s2 s2
:indexPair :indexPair
Új megtalált indexpárok
megjelölése
while (driver.run(createIndexPairs, mergeMap))
Java kódból hívva
ciklikusan
SPLIT
:Origin
:Origin
:Origin
:Origin
[1,6]
1
6
 Szétválasztás
o Egy élet szétvág
o Időpont alapján: t
• Eredeti átmeneten
o Két végpont
• Kisebb: < t
• Nagyobb: ≥ t
2
:Origin :Origin
+/-
+
+
-
SPLIT
:Origin
:Origin
:Origin
:Origin
[1,6]
1
6
2
:Origin :Origin
 Szétválasztás
o Egy élet szétvág
o Időpont alapján: 5
• Eredeti átmeneten
o Két végpont
• Kisebb: < t
• Nagyobb: ≥ t
+/-
+
+
-
SPLIT
 Szétválasztás
o Egy élet szétvág
o Időpont alapján: 5
• Eredeti átmeneten
o Két végpont
• Kisebb: < t
• Nagyobb: ≥ t
o Eredmény
[1,4]
[5,6]
+
-
SPLIT
 Probléma
o a csúcs összevonás eredménye
o b csúcsból újragenerált részfa
• Nagyobb részfába 6 miatt
• Kisebb részfába 1 miatt
:Origin
:Origin :Origin
[1,6]
1
6
b
6
:Origin :Origin
…
a
 Megoldás
o „Legrövidebb” úton elérve a-t
o Utolsó szám alapján: 6
SPLIT
:Origin
:Origin :Origin
[1,6]
1
6
b
6
:Origin :Origin
…
MATCH (r:Red)-[n:NEXT]->(b:Blue)
WITH r, b, n.Tmax as Tmax, n.Tmin as
Tmin, n.symbol as symbol
UNWIND range(Tmin, Tmax-1) AS t
MATCH (b)-[:NEXT*0..]->(s1:State)-
[:Origin]->(so1:OrigState),
trace1=(so1)<-[OrigNext*0..]-
(redOrigNext:OrigState), (redOrigNext)<-
[no1:OrigNext]-(redOrig:OrigState)<-
[:Origin]-(r)
WHERE none(x IN nodes(trace1) WHERE
(x)<-[:Origin]-(r))
WITH r, b, t, Tmin, Tmax, symbol, s1,
no1, so1
a
 Megoldás
o „Legrövidebb” úton elérve a-t
o Utolsó szám alapján: 6
SPLIT
:Origin
:Origin :Origin
[1,6]
1
6
b
6
:Origin :Origin
…
MATCH (b)-[:NEXT*0..]->(s1:State)-
[:Origin]->(so1:OrigState),
trace1=(so1)<-[OrigNext*0..]-
(redOrigNext:OrigState), (redOrigNext)<-
[no1:OrigNext]-(redOrig:OrigState)<-
[:Origin]-(r)
WHERE none(x IN nodes(trace1) WHERE
(x)<-[:Origin]-(r)) AND
toInteger(no1.time)>t
WITH r, b, t, metric, Tmin, Tmax,
symbol, collect(so1) as so1s
MATCH (b)-[:NEXT*0..]->(s2:State)-
[:Origin]->(so2:OrigState),
trace2=(so2)<-[OrigNext*0..]-
(redOrigNext:OrigState), (redOrigNext)<-
[no2:OrigNext]-(redOrig:OrigState)<-
[:Origin]-(r)
WHERE none(x IN nodes(trace2) WHERE
(x)<-[:Origin]-(r)) AND
toInteger(no2.time)<=t
RETURN r, b, t, metric, Tmin, Tmax,
symbol, so1s, collect(so2) as so2s
a
SPLIT
:Origin
:Origin :Origin
[1,6]
1
6
6
:Origin :Origin
…
a s2
ao
an
b
 Megoldás
o „Legrövidebb” úton elérve a-t
o Utolsó szám alapján: 6
MATCH
(a)-[:NEXT*0..]->(s2:State)-[:Origin]->(b:OrigState),
trace=(b)<-[OrigNext*0..]-(an:OrigState),
(an)<-[no:OrigNext]-(ao:OrigState)<-[:Origin]-(a)
Szétvágandó él az
eredeti lefutásokban
SPLIT
Szétvágandó él az
eredeti lefutásokban
:Origin
:Origin :Origin
[1,6]
1
6
6
:Origin :Origin
…ao
a
an
s2
b
MATCH
(a)-[:NEXT*0..]->(s2:State)-[:Origin]->(b:OrigState),
trace=(b)<-[OrigNext*0..]-(an:OrigState),
(an)<-[no:OrigNext]-(ao:OrigState)<-[:Origin]-(a)
 Megoldás
o „Legrövidebb” úton elérve a-t
o Utolsó szám alapján: 6
SPLIT
WHERE none(x IN nodes(trace) WHERE (x)<-[:Origin]-(a))
Legrövidebb lehetséges út
keresése, olyan node, amiből
csak közvetlenül lehet elérni
az „a” csúcsot.
 Megoldás
o „Legrövidebb” úton elérve a-t
o Utolsó szám alapján: 6
:Origin
:Origin :Origin
[1,6]
1
6
6
:Origin :Origin
…
a s2
ao
b
an
MATCH
(a)-[:NEXT*0..]->(s2:State)-[:Origin]->(b:OrigState),
trace=(b)<-[OrigNext*0..]-(an:OrigState),
(an)<-[no:OrigNext]-(ao:OrigState)<-[:Origin]-(a)
Technikai részletek
 Vizualizáció
NEO4J ELŐNYEI
 Vizualizáció
 Adatmodell könnyen fejleszthető
o Új címkék, tulajdonságok, csúcsok
o Nem kell sémát definiálni előre
NEO4J ELŐNYEI
 Vizualizáció
 Adatmodell könnyen fejleszthető
o Új címkék, tulajdonságok, csúcsok
o Nem kell sémát definiálni előre
 Gráfműveletek magasszintű leírása Cypher nyelven
NEO4J ELŐNYEI
WORKFLOW
 Neo4j web browser UI
WORKFLOW
MATCH (n)
RETURN n
 Neo4j web browser UI
WORKFLOW
MATCH (n)
RETURN n
 Neo4j web browser UI
WORKFLOW
 Neo4j web browser UI
WORKFLOW
 Neo4j web browser UI
WORKFLOW
 Neo4j web browser UI
WORKFLOW
 Neo4j web browser UI
WORKFLOW
 Neo4j web browser UI
WORKFLOW
 Neo4j web browser UI
WORKFLOW
 Neo4j web browser UI
WORKFLOW
 Neo4j web browser UI
TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
RETURN *
node
:Red {prop1: "val1"}
:Red {prop1: "val2"}
TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
RETURN *
node
:Red {prop1: "val1"}
:Red {prop1: "val2"}
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH 1 AS dummy
RETURN *
dummy
1
1
TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
RETURN *
node
:Red {prop1: "val1"}
:Red {prop1: "val2"}
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH 1 AS dummy
RETURN *
dummy
1
1
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH 1 AS dummy
MATCH (n)
RETURN *
node dummy
:Red {prop1: "val1"} 1
:Red {prop1: "val2"} 1
:Green {value: 13} 1
:Red {prop1: "val1"} 1
:Red {prop1: "val2"} 1
:Green {value: 13} 1
TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
RETURN *
node
:Red {prop1: "val1"}
:Red {prop1: "val2"}
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH 1 AS dummy
RETURN *
dummy
1
1
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH 1 AS dummy
MATCH (n)
RETURN *
node dummy
:Red {prop1: "val1"} 1
:Red {prop1: "val2"} 1
:Green {value: 13} 1
:Red {prop1: "val1"} 1
:Red {prop1: "val2"} 1
:Green {value: 13} 1
Descartes-szorzat
 minden sor
kétszer jelenik meg
TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
RETURN *
node
:Red {prop1: "val1"}
:Red {prop1: "val2"}
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH count(*) as dummy
RETURN *
dummy
2
TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
RETURN *
node
:Red {prop1: "val1"}
:Red {prop1: "val2"}
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH count(*) as dummy
RETURN *
dummy
2
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH count(*) as dummy
MATCH (n)
RETURN *
node dummy
:Red {prop1: "val1"} 2
:Red {prop1: "val2"} 2
:Green {value: 13} 2
TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
RETURN *
node
:Red {prop1: "val1"}
:Red {prop1: "val2"}
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH count(*) as dummy
RETURN *
dummy
2
MATCH (node:Blue)
REMOVE node:Blue
SET node:Red
WITH count(*) as dummy
MATCH (n)
RETURN *
node dummy
:Red {prop1: "val1"} 2
:Red {prop1: "val2"} 2
:Green {value: 13} 2
Pontosan 1 sor
eredmény
 második lekérdezésben
nem lesz ismétlődés
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
...
WITH count(*) as dummy
MATCH (n)
RETURN n
LEKÉRDEZÉSEK FUTTATÁSA
 Információ átadása lekérdezések között?
LEKÉRDEZÉSEK FUTTATÁSA
 Információ átadása lekérdezések között?
 Csúcs címkézése
LEKÉRDEZÉSEK FUTTATÁSA
 Információ átadása lekérdezések között?
 Csúcs címkézése
 Új csúcs ideiglenes információval
LEKÉRDEZÉSEK FUTTATÁSA
 Információ átadása lekérdezések között?
 Csúcs címkézése
 Új csúcs ideiglenes információval
 Embedded használat esetén
eredmény továbbadása paraméterként
LEKÉRDEZÉSEK FUTTATÁSA
 Információ átadása lekérdezések között?
 Csúcs címkézése
 Új csúcs ideiglenes információval
 Embedded használat esetén
eredmény továbbadása paraméterként
redNode num
:Red {prop1: "val1"} 1
LEKÉRDEZÉSEK FUTTATÁSA
 Információ átadása lekérdezések között?
 Csúcs címkézése
 Új csúcs ideiglenes információval
 Embedded használat esetén
eredmény továbbadása paraméterként
redNode num
:Red {prop1: "val1"} 1
Pontosan 1 sor
eredmény
LEKÉRDEZÉSEK FUTTATÁSA
 Információ átadása lekérdezések között?
 Csúcs címkézése
 Új csúcs ideiglenes információval
 Embedded használat esetén
eredmény továbbadása paraméterként
redNode num
:Red {prop1: "val1"} 1
WITH $redNode AS redNode
MATCH (g:Green {num: $num})
CREATE (redNode)-[:Edge]->(g)
Pontosan 1 sor
eredmény
CIKLUS
 Sok „ciklus jellegű” probléma megoldható listákkal:
o List comprehension [x IN xs WHERE condition | f(x)]
o Reduce: reduce(acc = "", x IN list | acc + x.prop)
CIKLUS
 Sok „ciklus jellegű” probléma megoldható listákkal:
o List comprehension [x IN xs WHERE condition | f(x)]
o Reduce: reduce(acc = "", x IN list | acc + x.prop)
 De ciklusra szükség lehet
o Java kódból lekérdezések futtatása
while (gds.execute(conditionQuery).hasNext()) {
gds.execute(step1Query);
gds.execute(step2Query);
}
CIKLUS
 Sok „ciklus jellegű” probléma megoldható listákkal:
o List comprehension [x IN xs WHERE condition | f(x)]
o Reduce: reduce(acc = "", x IN list | acc + x.prop)
 De ciklusra szükség lehet
o Java kódból lekérdezések futtatása
o Ciklusfeltétel az eredmény sorainak száma alapján
while (gds.execute(conditionQuery).hasNext()) {
gds.execute(step1Query);
gds.execute(step2Query);
}
IMPORT-EXPORT
 Algoritmus állapotának elmentése
IMPORT-EXPORT
 Algoritmus állapotának elmentése
 APOC* GraphML import-export
*Awesome Procedures on Cypher
IMPORT-EXPORT
 Algoritmus állapotának elmentése
 APOC* GraphML import-export
*Awesome Procedures on Cypher
// save
CALL apoc.export.graphml.all('my.graphml',
{storeNodeIds:true, readLabels:true, useTypes:true})
IMPORT-EXPORT
 Algoritmus állapotának elmentése
 APOC* GraphML import-export
*Awesome Procedures on Cypher
// save
CALL apoc.export.graphml.all('my.graphml',
{storeNodeIds:true, readLabels:true, useTypes:true})
// load
MATCH (n) // delete all
DETACH DELETE n
WITH count(*) AS dummy //-----------------
CALL apoc.import.graphml('my.graphml',
{storeNodeIds:true, readLabels:true, useTypes:true})
YIELD nodes, relationships
WITH count(*) AS dummy //-----------------
MATCH (n) RETURN n // show all
VISSZALÉPÉSES KERESÉS (BACKTRACKING)
 Ha vissza kell tudni állni egy korábbi állapotra
és onnan folytatni
?
VISSZALÉPÉSES KERESÉS (BACKTRACKING)
 Ha vissza kell tudni állni egy korábbi állapotra
és onnan folytatni
?
Metrika:
VISSZALÉPÉSES KERESÉS (BACKTRACKING)
 Ha vissza kell tudni állni egy korábbi állapotra
és onnan folytatni
?
Metrika: 5
VISSZALÉPÉSES KERESÉS (BACKTRACKING)
 Ha vissza kell tudni állni egy korábbi állapotra
és onnan folytatni
?
Metrika: 5 12
VISSZALÉPÉSES KERESÉS (BACKTRACKING)
 Ha vissza kell tudni állni egy korábbi állapotra
és onnan folytatni
?
Metrika: 5 12 8
VISSZALÉPÉSES KERESÉS (BACKTRACKING)
 Ha vissza kell tudni állni egy korábbi állapotra
és onnan folytatni
?
Metrika: 5 12 8
VISSZALÉPÉSES KERESÉS (BACKTRACKING)
 Ha vissza kell tudni állni egy korábbi állapotra
és onnan folytatni
 Megoldások:
o Import-export
?
Metrika: 5 12 8
VISSZALÉPÉSES KERESÉS (BACKTRACKING)
 Ha vissza kell tudni állni egy korábbi állapotra
és onnan folytatni
 Megoldások:
o Import-export
o Tranzakció meghiúsulása
• Csak egy szintű visszalépésre
?
Metrika: 5 12 8
HIBAKERESÉS
 Futtatás során állapotok rögzítése és visszajátszása
HIBAKERESÉS
 Futtatás során állapotok rögzítése és visszajátszása
o Visszajátszásnál előző állapot külön csúcsban tárolva
HIBAKERESÉS
 Futtatás során állapotok rögzítése és visszajátszása
o Visszajátszásnál előző állapot külön csúcsban tárolva
o Mentett lekérdezés a léptetésre
HIBAKERESÉS
 Futtatás során állapotok rögzítése és visszajátszása
o Visszajátszásnál előző állapot külön csúcsban tárolva
o Mentett lekérdezés a léptetésre
HIBAKERESÉS
 Bonyolult hibáknál
HIBAKERESÉS
 Bonyolult hibáknál
o Hibamintát Cypherben felírni
MATCH (node:Faulty)
RETURN node
HIBAKERESÉS
 Bonyolult hibáknál
o Hibamintát Cypherben felírni
o Kódban breakpoint, ha megtalálta
MATCH (node:Faulty)
RETURN node
if (gds.execute(query).hasNext())
// breakpoint
HIBAKERESÉS
 Bonyolult hibáknál
o Hibamintát Cypherben felírni
o Kódban breakpoint, ha megtalálta
o Adott állapot betöltése
o Léptetés az állapotok között
MATCH (node:Faulty)
RETURN node
if (gds.execute(query).hasNext())
// breakpoint
Tanulságok
Sicco Verwer:
Efficient identification of timed automata.
PhD disszertáció
PSZEUDOKÓD
Sicco Verwer:
Efficient identification of timed automata.
PhD disszertáció
PSZEUDOKÓD
Sicco Verwer:
Efficient identification of timed automata.
PhD disszertáció
PSZEUDOKÓD
Sicco Verwer:
Efficient identification of timed automata.
PhD disszertáció
PSZEUDOKÓD
Sicco Verwer:
Efficient identification of timed automata.
PhD disszertáció
PSZEUDOKÓD
Sicco Verwer:
Efficient identification of timed automata.
PhD disszertáció
PSZEUDOKÓD
TDK ÉS SZAKDOLGOZATOK
Gujgiczer Anna:
Időzített rendszerek tanulás alapú analízise.
BSc szakdolgozat
Elekes Márton:
Modellvezérelt automatatanulás.
BSc szakdolgozat
Elekes Márton, Gujgiczer Anna:
Modellalapú automatatanulás formális modellek szintéziséhez.
TDK dolgozat
A CYPHER KIFEJEZŐEREJE
 A legtöbb lekérdezés P-beli
 Két diszjunkt útvonal létezésének ellenőrzése már NP-teljes
 A Cypher nyelv Turing-teljes
o Listanézetek, reduce
o A gráf szalagként használható
 Cypher 9 (aktuális verzió)
 Cypher 10 (multiple graph-ok támogatása)
ÖSSZEFOGLALÁS
 Neo4j prototípus
o Gyors fejlesztés
o Specifikus problémákra APOC eljárások
 Felmerülő problémák
o APOC bug
o Megjelenítőfelület hiányosságai
o Fixpont hiánya
 Javasolt felhasználás
o Prototipizálás
o Utána újraírni imperatív kóddal
CSAPAT
Segítettek még: Semeráth Oszkár, Tóth Tamás, Vörös András
KÖSZÖNETNYILVÁNÍTÁS
 Az Emberi Erőforrások Minisztériuma ÚNKP-17-1-I. kódszámú
Új Nemzeti Kiválóság Programjának támogatásával készült
 Az MTA-BME Lendület Kiberfizikai Rendszerek Kutatócsoport
szakmai támogatásával készült
Ω

Mais conteúdo relacionado

Mais de Gábor Szárnyas

Compiling openCypher graph queries with Spark Catalyst
Compiling openCypher graph queries with Spark CatalystCompiling openCypher graph queries with Spark Catalyst
Compiling openCypher graph queries with Spark CatalystGábor Szárnyas
 
Towards the Characterization of Realistic Models: Evaluation of Multidiscipli...
Towards the Characterization of Realistic Models: Evaluation of Multidiscipli...Towards the Characterization of Realistic Models: Evaluation of Multidiscipli...
Towards the Characterization of Realistic Models: Evaluation of Multidiscipli...Gábor Szárnyas
 
Sharded Joins for Scalable Incremental Graph Queries
Sharded Joins for Scalable Incremental Graph QueriesSharded Joins for Scalable Incremental Graph Queries
Sharded Joins for Scalable Incremental Graph QueriesGábor Szárnyas
 
Towards a Macrobenchmark Framework for Performance Analysis of Java Applications
Towards a Macrobenchmark Framework for Performance Analysis of Java ApplicationsTowards a Macrobenchmark Framework for Performance Analysis of Java Applications
Towards a Macrobenchmark Framework for Performance Analysis of Java ApplicationsGábor Szárnyas
 
IncQuery-D: Distributed Incremental Graph Queries
IncQuery-D: Distributed Incremental Graph QueriesIncQuery-D: Distributed Incremental Graph Queries
IncQuery-D: Distributed Incremental Graph QueriesGábor Szárnyas
 
IncQuery-D: Incremental Queries in the Cloud
IncQuery-D: Incremental Queries in the CloudIncQuery-D: Incremental Queries in the Cloud
IncQuery-D: Incremental Queries in the CloudGábor Szárnyas
 

Mais de Gábor Szárnyas (6)

Compiling openCypher graph queries with Spark Catalyst
Compiling openCypher graph queries with Spark CatalystCompiling openCypher graph queries with Spark Catalyst
Compiling openCypher graph queries with Spark Catalyst
 
Towards the Characterization of Realistic Models: Evaluation of Multidiscipli...
Towards the Characterization of Realistic Models: Evaluation of Multidiscipli...Towards the Characterization of Realistic Models: Evaluation of Multidiscipli...
Towards the Characterization of Realistic Models: Evaluation of Multidiscipli...
 
Sharded Joins for Scalable Incremental Graph Queries
Sharded Joins for Scalable Incremental Graph QueriesSharded Joins for Scalable Incremental Graph Queries
Sharded Joins for Scalable Incremental Graph Queries
 
Towards a Macrobenchmark Framework for Performance Analysis of Java Applications
Towards a Macrobenchmark Framework for Performance Analysis of Java ApplicationsTowards a Macrobenchmark Framework for Performance Analysis of Java Applications
Towards a Macrobenchmark Framework for Performance Analysis of Java Applications
 
IncQuery-D: Distributed Incremental Graph Queries
IncQuery-D: Distributed Incremental Graph QueriesIncQuery-D: Distributed Incremental Graph Queries
IncQuery-D: Distributed Incremental Graph Queries
 
IncQuery-D: Incremental Queries in the Cloud
IncQuery-D: Incremental Queries in the CloudIncQuery-D: Incremental Queries in the Cloud
IncQuery-D: Incremental Queries in the Cloud
 

Időzített automatatanulás Cypherrel

  • 1. Időzített automatatanulás Cypherrel Szárnyas Gábor, Farkas Rebeka, Elekes Márton, Gujgiczer Anna Budapest Neo4j meetup 2018. február 13.
  • 2. Sicco Verwer, Mathijs de Weerdt, Cees Witteveen: An algorithm for learning real-time automata. Benelearn 2007
  • 3. AKADÁLYOK  Cikk tartalma: o Absztrakt leírások o Formalizálás hiánya Elakadtunk
  • 4. AKADÁLYOK  Cikk tartalma: o Absztrakt leírások o Formalizálás hiánya Elakadtunk  Megoldás:
  • 5. SZERKEZET  Rebus: Elméleti háttér  Anna: Érdekes lekérdezések  Marci: Neo4j munkafolyamat  Gábor: Tapasztalatok, tanulságok
  • 9. AUTOMATA  Állapotok: elfogadó/nem elfogadó  Lefutás: (véges) eseménysorozat  Elfogadott lefutás: elfogadó állapotban végződik  Modellezett viselkedés: elfogadott lefutásokOff Stop Continue Prepare Go switchPhase switchPhase switch Phase onOff onOff onOff onOff onOff switch Phase switch Phase
  • 10. AUTOMATA  Állapotok: elfogadó/nem elfogadó  Lefutás: (véges) eseménysorozat  Elfogadott lefutás: elfogadó állapotban végződik  Modellezett viselkedés: elfogadott lefutásokOff Stop Continue Prepare Go switchPhase switchPhase switch Phase onOff onOff onOff onOff onOff switch Phase + - - - - switch Phase
  • 11. IDŐZÍTÉS  Állapotban eltöltött idő  Őrfeltétel - intervallum Off Stop Continue Prepare Go switchPhase switchPhase switch Phase onOff onOff onOff onOff onOff switch Phase + - - - - switch Phase
  • 12. IDŐZÍTÉS  Állapotban eltöltött idő  Őrfeltétel - intervallum Off Stop Continue Prepare Go switchPhase switchPhase switch Phase onOff onOff onOff onOff onOff switch Phase + - - - - [3,5] [30,35] [1,2] switch Phase [30,35] [0,∞] [0,∞] [0,∞] [0,∞] [0,∞] [0,∞]
  • 13. AUTOMATATANULÁS  Rendszer - ismeretlen belső megvalósítás  Cél: működés feltérképezése  Eszköz: megfigyelés  lefutások  automata  Alkalmazás: monitorszintézis, tesztelés
  • 14. AUTOMATATANULÁS ALAPJAI + - - + a,1 a,5 + a,3 a,5 a,7 a,2 + - a,[1,2] + a,[1,5] + a,[3,5] - a,[1,5] + - a, [1,2] a,[1,2] a, [3,5] a, [3,5]
  • 15. AUTOMATATANULÁS ALGORITMUSA  Három művelet ismétlése o Split: Inkonzisztens állapotok szétválasztása + - a,[1,2] + a,[1,5] + a,[3,5] - a,[1,5] + +/- a,[1,5] +/- a,[1,5] + - - + a,1 a,5 + a,3 a,5 a,7 a,2
  • 16. AUTOMATATANULÁS ALGORITMUSA  Három művelet ismétlése o Split: Inkonzisztens állapotok szétválasztása o Merge: Hasonló állapotok összevonása - - b + + a a -b + + a a -b + a
  • 17. AUTOMATATANULÁS ALGORITMUSA  Három művelet ismétlése o Split: Inkonzisztens állapotok szétválasztása o Merge: Hasonló állapotok összevonása o Color: Állapot véglegesítése
  • 18. AUTOMATATANULÁS ALGORITMUSA  Három művelet ismétlése o Split: Inkonzisztens állapotok szétválasztása o Merge: Hasonló állapotok összevonása o Color: Állapot véglegesítése  Művelet kiválasztása: metrika o A művelet eredménye alapján Művelet kiválasztása Split végrehajtása Merge végrehajtása Color végrehajtása
  • 20. ÉRDEKES LEKÉRDEZÉSEK  Sokszor használt WHERE NOT  Merge o Összevonandó állapotok tranzitív lezártja  Split: kategóriasorolás/részfamásolás o Merge miatt több origNext él is lehet o Melyik alapján soroljunk kategóriába?
  • 21. WHERE NOT «MINTA»  Útvonal végének megtalálása WHERE NOT (v)-[:NEXT]->() :NEXT :NEXT … …v :NEXT
  • 22. WHERE NOT «MINTA»  Útvonal végének megtalálása WHERE NOT (v)-[:NEXT]->() :NEXT :NEXT … …v :NEXT
  • 23. WHERE NOT «MINTA»  Útvonal végének megtalálása  Útvonal elejének megtalálása WHERE NOT (v)-[:NEXT]->() WHERE NOT ()-[:NEXT]->(root) :NEXT :NEXT … …:NEXT root
  • 24. WHERE NOT «MINTA»  Útvonal végének megtalálása  Útvonal elejének megtalálása WHERE NOT (v)-[:NEXT]->() WHERE NOT ()-[:NEXT]->(root) :NEXT :NEXT … …:NEXT root
  • 25. MERGE :indexPair :indexPair - -:NEXT :NEXT + + :NEXT :NEXT … … :indexPair -:NEXT +:NEXT …  Összevonandó állapotok megjelölése  Metrika számítása  Inkonzisztencia kiszűrése  Eredmény
  • 26. MERGE + - :indexPair :indexPair  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt :indexPair :indexPair + -:NEXT :NEXT
  • 27. MERGE + - :indexPair :indexPair  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt :indexPair :indexPair + -:NEXT :NEXT while (driver.run(createIndexPairs, mergeMap))
  • 28. MERGE + - :indexPair :indexPair  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt :indexPair :indexPair + -:NEXT :NEXT MATCH (s1:IndexedMerge)-[:IndexPair*..]-(s2:IndexedMerge), s1p = (s1)-[:NEXT*0..]->(s12:State), s2p = (s2)-[:NEXT*0..]->(s22:State) WHERE id(s1) > id(s2) AND length(s1p) = length(s2p) AND NOT (s12)-[:IndexPair*0..]-(s22) WITH s12, s22, s1p, s2p,[s1r IN rels(s1p) | s1r.symbol] AS s1ss, [s2r IN rels(s2p) | s2r.symbol] AS s2ss, [s1r IN rels(s1p) | s1r.Tmin] AS s1mins, [s2r IN rels(s2p) | s2r.Tmin ] AS s2mins, [s1r IN rels(s1p) | s1r.Tmax] AS s1maxs, [s2r IN rels(s2p) | s2r.Tmax ] AS s2maxs WHERE s1ss = s2ss AND s1mins = s2mins AND s1maxs = s2maxs WITH collect([s12, s22]) as pairs MATCH ()-[ip:IndexPair]->() WITH max(ip.index) + 1 as nextIndex, pairs UNWIND range(0, length(pairs)-1) as idx WITH pairs[idx][0] as s12, pairs[idx][1] as s22, idx + nextIndex as edgeIndex CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22) SET s12:IndexedMerge, s22:IndexedMerge while (driver.run(createIndexPairs, mergeMap))
  • 29. MERGE + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXT  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt
  • 30. MERGE MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge), s1p = (s1)-[:NEXT*0..]->(s12:State), s2p = (s2)-[:NEXT*0..]->(s22:State) WHERE id(s1) > id(s2) AND length(s1p) = length(s2p) AND NOT (s12)-[:IndexPair*0..]-(s22) + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXT  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt
  • 31. MERGE MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge), s1p = (s1)-[:NEXT*0..]->(s12:State), s2p = (s2)-[:NEXT*0..]->(s22:State) WHERE id(s1) > id(s2) AND length(s1p) = length(s2p) AND NOT (s12)-[:IndexPair*0..]-(s22) + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXT  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt Ellenőrzés szempontjából kritikus állapotpárok
  • 32. MERGE MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge), s1p = (s1)-[:NEXT*0..]->(s12:State), s2p = (s2)-[:NEXT*0..]->(s22:State) WHERE id(s1) > id(s2) AND length(s1p) = length(s2p) AND NOT (s12)-[:IndexPair*0..]-(s22) + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXT  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt s1 s1 s2 s2 Ellenőrzés szempontjából kritikus állapotpárok
  • 33. MERGE MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge), s1p = (s1)-[:NEXT*0..]->(s12:State), s2p = (s2)-[:NEXT*0..]->(s22:State) WHERE id(s1) > id(s2) AND length(s1p) = length(s2p) AND NOT (s12)-[:IndexPair*0..]-(s22) + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXT  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt s1 s1 s2 s2 WITH s12, s22, s1p, s2p, [s1r IN rels(s1p) | s1r.symbol] AS s1ss, [s2r IN rels(s2p) | s2r.symbol] AS s2ss, [s1r IN rels(s1p) | s1r.Tmin] AS s1mins, [s2r IN rels(s2p) | s2r.Tmin ] AS s2mins, [s1r IN rels(s1p) | s1r.Tmax] AS s1maxs, [s2r IN rels(s2p) | s2r.Tmax ] AS s2maxs WHERE s1ss = s2ss AND s1mins = s2mins AND s1maxs = s2maxs ... Ellenőrzés szempontjából kritikus állapotpárok
  • 34. MERGE MATCH (s1:IndexedMerge)-[:IndexPair*]-(s2:IndexedMerge), s1p = (s1)-[:NEXT*0..]->(s12:State), s2p = (s2)-[:NEXT*0..]->(s22:State) WHERE id(s1) > id(s2) AND length(s1p) = length(s2p) AND NOT (s12)-[:IndexPair*0..]-(s22) + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXT  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt s1 s1 s2 s2 WITH s12, s22, s1p, s2p, [s1r IN rels(s1p) | s1r.symbol] AS s1ss, [s2r IN rels(s2p) | s2r.symbol] AS s2ss, [s1r IN rels(s1p) | s1r.Tmin] AS s1mins, [s2r IN rels(s2p) | s2r.Tmin ] AS s2mins, [s1r IN rels(s1p) | s1r.Tmax] AS s1maxs, [s2r IN rels(s2p) | s2r.Tmax ] AS s2maxs WHERE s1ss = s2ss AND s1mins = s2mins AND s1maxs = s2maxs ... • Ugyan olyan hosszú útvonal • Ugyan olyan események • Stb. Ellenőrzés szempontjából kritikus állapotpárok
  • 35. MERGE  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXTs1 s1 s2 s2
  • 36. MERGE CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22) SET s12:IndexedMerge, s22:IndexedMerge  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXTs1 s1 s2 s2
  • 37. MERGE CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22) SET s12:IndexedMerge, s22:IndexedMerge  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXTs1 s1 s2 s2 Új megtalált indexpárok megjelölése
  • 38. MERGE CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22) SET s12:IndexedMerge, s22:IndexedMerge  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXTs1 s1 s2 s2 :indexPair :indexPair Új megtalált indexpárok megjelölése
  • 39. MERGE CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22) SET s12:IndexedMerge, s22:IndexedMerge  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXTs1 s1 s2 s2 :indexPair :indexPair Új megtalált indexpárok megjelölése while (driver.run(createIndexPairs, mergeMap))
  • 40. MERGE CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22) SET s12:IndexedMerge, s22:IndexedMerge  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXTs1 s1 s2 s2 :indexPair :indexPair Új megtalált indexpárok megjelölése while (driver.run(createIndexPairs, mergeMap)) Java kódból hívva ciklikusan
  • 41. MERGE CREATE (s12)-[:IndexPair {index: edgeIndex}]->(s22) SET s12:IndexedMerge, s22:IndexedMerge  Probléma o Nem érzékel inkonzisztenciát  Megoldás o Tranzitív lezárt + - :indexPair :indexPair :indexPair :indexPair + -:NEXT :NEXTs1 s1 s2 s2 :indexPair :indexPair Új megtalált indexpárok megjelölése while (driver.run(createIndexPairs, mergeMap)) Java kódból hívva ciklikusan
  • 42. SPLIT :Origin :Origin :Origin :Origin [1,6] 1 6  Szétválasztás o Egy élet szétvág o Időpont alapján: t • Eredeti átmeneten o Két végpont • Kisebb: < t • Nagyobb: ≥ t 2 :Origin :Origin +/- + + -
  • 43. SPLIT :Origin :Origin :Origin :Origin [1,6] 1 6 2 :Origin :Origin  Szétválasztás o Egy élet szétvág o Időpont alapján: 5 • Eredeti átmeneten o Két végpont • Kisebb: < t • Nagyobb: ≥ t +/- + + -
  • 44. SPLIT  Szétválasztás o Egy élet szétvág o Időpont alapján: 5 • Eredeti átmeneten o Két végpont • Kisebb: < t • Nagyobb: ≥ t o Eredmény [1,4] [5,6] + -
  • 45. SPLIT  Probléma o a csúcs összevonás eredménye o b csúcsból újragenerált részfa • Nagyobb részfába 6 miatt • Kisebb részfába 1 miatt :Origin :Origin :Origin [1,6] 1 6 b 6 :Origin :Origin … a
  • 46.  Megoldás o „Legrövidebb” úton elérve a-t o Utolsó szám alapján: 6 SPLIT :Origin :Origin :Origin [1,6] 1 6 b 6 :Origin :Origin … MATCH (r:Red)-[n:NEXT]->(b:Blue) WITH r, b, n.Tmax as Tmax, n.Tmin as Tmin, n.symbol as symbol UNWIND range(Tmin, Tmax-1) AS t MATCH (b)-[:NEXT*0..]->(s1:State)- [:Origin]->(so1:OrigState), trace1=(so1)<-[OrigNext*0..]- (redOrigNext:OrigState), (redOrigNext)<- [no1:OrigNext]-(redOrig:OrigState)<- [:Origin]-(r) WHERE none(x IN nodes(trace1) WHERE (x)<-[:Origin]-(r)) WITH r, b, t, Tmin, Tmax, symbol, s1, no1, so1 a
  • 47.  Megoldás o „Legrövidebb” úton elérve a-t o Utolsó szám alapján: 6 SPLIT :Origin :Origin :Origin [1,6] 1 6 b 6 :Origin :Origin … MATCH (b)-[:NEXT*0..]->(s1:State)- [:Origin]->(so1:OrigState), trace1=(so1)<-[OrigNext*0..]- (redOrigNext:OrigState), (redOrigNext)<- [no1:OrigNext]-(redOrig:OrigState)<- [:Origin]-(r) WHERE none(x IN nodes(trace1) WHERE (x)<-[:Origin]-(r)) AND toInteger(no1.time)>t WITH r, b, t, metric, Tmin, Tmax, symbol, collect(so1) as so1s MATCH (b)-[:NEXT*0..]->(s2:State)- [:Origin]->(so2:OrigState), trace2=(so2)<-[OrigNext*0..]- (redOrigNext:OrigState), (redOrigNext)<- [no2:OrigNext]-(redOrig:OrigState)<- [:Origin]-(r) WHERE none(x IN nodes(trace2) WHERE (x)<-[:Origin]-(r)) AND toInteger(no2.time)<=t RETURN r, b, t, metric, Tmin, Tmax, symbol, so1s, collect(so2) as so2s a
  • 48. SPLIT :Origin :Origin :Origin [1,6] 1 6 6 :Origin :Origin … a s2 ao an b  Megoldás o „Legrövidebb” úton elérve a-t o Utolsó szám alapján: 6 MATCH (a)-[:NEXT*0..]->(s2:State)-[:Origin]->(b:OrigState), trace=(b)<-[OrigNext*0..]-(an:OrigState), (an)<-[no:OrigNext]-(ao:OrigState)<-[:Origin]-(a) Szétvágandó él az eredeti lefutásokban
  • 49. SPLIT Szétvágandó él az eredeti lefutásokban :Origin :Origin :Origin [1,6] 1 6 6 :Origin :Origin …ao a an s2 b MATCH (a)-[:NEXT*0..]->(s2:State)-[:Origin]->(b:OrigState), trace=(b)<-[OrigNext*0..]-(an:OrigState), (an)<-[no:OrigNext]-(ao:OrigState)<-[:Origin]-(a)  Megoldás o „Legrövidebb” úton elérve a-t o Utolsó szám alapján: 6
  • 50. SPLIT WHERE none(x IN nodes(trace) WHERE (x)<-[:Origin]-(a)) Legrövidebb lehetséges út keresése, olyan node, amiből csak közvetlenül lehet elérni az „a” csúcsot.  Megoldás o „Legrövidebb” úton elérve a-t o Utolsó szám alapján: 6 :Origin :Origin :Origin [1,6] 1 6 6 :Origin :Origin … a s2 ao b an MATCH (a)-[:NEXT*0..]->(s2:State)-[:Origin]->(b:OrigState), trace=(b)<-[OrigNext*0..]-(an:OrigState), (an)<-[no:OrigNext]-(ao:OrigState)<-[:Origin]-(a)
  • 53.  Vizualizáció  Adatmodell könnyen fejleszthető o Új címkék, tulajdonságok, csúcsok o Nem kell sémát definiálni előre NEO4J ELŐNYEI
  • 54.  Vizualizáció  Adatmodell könnyen fejleszthető o Új címkék, tulajdonságok, csúcsok o Nem kell sémát definiálni előre  Gráfműveletek magasszintű leírása Cypher nyelven NEO4J ELŐNYEI
  • 56. WORKFLOW MATCH (n) RETURN n  Neo4j web browser UI
  • 57. WORKFLOW MATCH (n) RETURN n  Neo4j web browser UI
  • 66. TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE MATCH (node:Blue) REMOVE node:Blue SET node:Red RETURN * node :Red {prop1: "val1"} :Red {prop1: "val2"}
  • 67. TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE MATCH (node:Blue) REMOVE node:Blue SET node:Red RETURN * node :Red {prop1: "val1"} :Red {prop1: "val2"} MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH 1 AS dummy RETURN * dummy 1 1
  • 68. TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE MATCH (node:Blue) REMOVE node:Blue SET node:Red RETURN * node :Red {prop1: "val1"} :Red {prop1: "val2"} MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH 1 AS dummy RETURN * dummy 1 1 MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH 1 AS dummy MATCH (n) RETURN * node dummy :Red {prop1: "val1"} 1 :Red {prop1: "val2"} 1 :Green {value: 13} 1 :Red {prop1: "val1"} 1 :Red {prop1: "val2"} 1 :Green {value: 13} 1
  • 69. TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE MATCH (node:Blue) REMOVE node:Blue SET node:Red RETURN * node :Red {prop1: "val1"} :Red {prop1: "val2"} MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH 1 AS dummy RETURN * dummy 1 1 MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH 1 AS dummy MATCH (n) RETURN * node dummy :Red {prop1: "val1"} 1 :Red {prop1: "val2"} 1 :Green {value: 13} 1 :Red {prop1: "val1"} 1 :Red {prop1: "val2"} 1 :Green {value: 13} 1 Descartes-szorzat  minden sor kétszer jelenik meg
  • 70. TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE MATCH (node:Blue) REMOVE node:Blue SET node:Red RETURN * node :Red {prop1: "val1"} :Red {prop1: "val2"} MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH count(*) as dummy RETURN * dummy 2
  • 71. TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE MATCH (node:Blue) REMOVE node:Blue SET node:Red RETURN * node :Red {prop1: "val1"} :Red {prop1: "val2"} MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH count(*) as dummy RETURN * dummy 2 MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH count(*) as dummy MATCH (n) RETURN * node dummy :Red {prop1: "val1"} 2 :Red {prop1: "val2"} 2 :Green {value: 13} 2
  • 72. TÖBB LEKÉRDEZÉS ÖSSZEFŰZÉSE MATCH (node:Blue) REMOVE node:Blue SET node:Red RETURN * node :Red {prop1: "val1"} :Red {prop1: "val2"} MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH count(*) as dummy RETURN * dummy 2 MATCH (node:Blue) REMOVE node:Blue SET node:Red WITH count(*) as dummy MATCH (n) RETURN * node dummy :Red {prop1: "val1"} 2 :Red {prop1: "val2"} 2 :Green {value: 13} 2 Pontosan 1 sor eredmény  második lekérdezésben nem lesz ismétlődés
  • 73. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS
  • 74. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 75. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 76. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 77. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 78. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 79. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 80. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 81. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 82. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 83. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 84. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 85. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 86. ALGORITMUS FUTTATÁSA ÉS VIZUALIZÁLÁS ... WITH count(*) as dummy MATCH (n) RETURN n
  • 87. LEKÉRDEZÉSEK FUTTATÁSA  Információ átadása lekérdezések között?
  • 88. LEKÉRDEZÉSEK FUTTATÁSA  Információ átadása lekérdezések között?  Csúcs címkézése
  • 89. LEKÉRDEZÉSEK FUTTATÁSA  Információ átadása lekérdezések között?  Csúcs címkézése  Új csúcs ideiglenes információval
  • 90. LEKÉRDEZÉSEK FUTTATÁSA  Információ átadása lekérdezések között?  Csúcs címkézése  Új csúcs ideiglenes információval  Embedded használat esetén eredmény továbbadása paraméterként
  • 91. LEKÉRDEZÉSEK FUTTATÁSA  Információ átadása lekérdezések között?  Csúcs címkézése  Új csúcs ideiglenes információval  Embedded használat esetén eredmény továbbadása paraméterként redNode num :Red {prop1: "val1"} 1
  • 92. LEKÉRDEZÉSEK FUTTATÁSA  Információ átadása lekérdezések között?  Csúcs címkézése  Új csúcs ideiglenes információval  Embedded használat esetén eredmény továbbadása paraméterként redNode num :Red {prop1: "val1"} 1 Pontosan 1 sor eredmény
  • 93. LEKÉRDEZÉSEK FUTTATÁSA  Információ átadása lekérdezések között?  Csúcs címkézése  Új csúcs ideiglenes információval  Embedded használat esetén eredmény továbbadása paraméterként redNode num :Red {prop1: "val1"} 1 WITH $redNode AS redNode MATCH (g:Green {num: $num}) CREATE (redNode)-[:Edge]->(g) Pontosan 1 sor eredmény
  • 94. CIKLUS  Sok „ciklus jellegű” probléma megoldható listákkal: o List comprehension [x IN xs WHERE condition | f(x)] o Reduce: reduce(acc = "", x IN list | acc + x.prop)
  • 95. CIKLUS  Sok „ciklus jellegű” probléma megoldható listákkal: o List comprehension [x IN xs WHERE condition | f(x)] o Reduce: reduce(acc = "", x IN list | acc + x.prop)  De ciklusra szükség lehet o Java kódból lekérdezések futtatása while (gds.execute(conditionQuery).hasNext()) { gds.execute(step1Query); gds.execute(step2Query); }
  • 96. CIKLUS  Sok „ciklus jellegű” probléma megoldható listákkal: o List comprehension [x IN xs WHERE condition | f(x)] o Reduce: reduce(acc = "", x IN list | acc + x.prop)  De ciklusra szükség lehet o Java kódból lekérdezések futtatása o Ciklusfeltétel az eredmény sorainak száma alapján while (gds.execute(conditionQuery).hasNext()) { gds.execute(step1Query); gds.execute(step2Query); }
  • 98. IMPORT-EXPORT  Algoritmus állapotának elmentése  APOC* GraphML import-export *Awesome Procedures on Cypher
  • 99. IMPORT-EXPORT  Algoritmus állapotának elmentése  APOC* GraphML import-export *Awesome Procedures on Cypher // save CALL apoc.export.graphml.all('my.graphml', {storeNodeIds:true, readLabels:true, useTypes:true})
  • 100. IMPORT-EXPORT  Algoritmus állapotának elmentése  APOC* GraphML import-export *Awesome Procedures on Cypher // save CALL apoc.export.graphml.all('my.graphml', {storeNodeIds:true, readLabels:true, useTypes:true}) // load MATCH (n) // delete all DETACH DELETE n WITH count(*) AS dummy //----------------- CALL apoc.import.graphml('my.graphml', {storeNodeIds:true, readLabels:true, useTypes:true}) YIELD nodes, relationships WITH count(*) AS dummy //----------------- MATCH (n) RETURN n // show all
  • 101. VISSZALÉPÉSES KERESÉS (BACKTRACKING)  Ha vissza kell tudni állni egy korábbi állapotra és onnan folytatni ?
  • 102. VISSZALÉPÉSES KERESÉS (BACKTRACKING)  Ha vissza kell tudni állni egy korábbi állapotra és onnan folytatni ? Metrika:
  • 103. VISSZALÉPÉSES KERESÉS (BACKTRACKING)  Ha vissza kell tudni állni egy korábbi állapotra és onnan folytatni ? Metrika: 5
  • 104. VISSZALÉPÉSES KERESÉS (BACKTRACKING)  Ha vissza kell tudni állni egy korábbi állapotra és onnan folytatni ? Metrika: 5 12
  • 105. VISSZALÉPÉSES KERESÉS (BACKTRACKING)  Ha vissza kell tudni állni egy korábbi állapotra és onnan folytatni ? Metrika: 5 12 8
  • 106. VISSZALÉPÉSES KERESÉS (BACKTRACKING)  Ha vissza kell tudni állni egy korábbi állapotra és onnan folytatni ? Metrika: 5 12 8
  • 107. VISSZALÉPÉSES KERESÉS (BACKTRACKING)  Ha vissza kell tudni állni egy korábbi állapotra és onnan folytatni  Megoldások: o Import-export ? Metrika: 5 12 8
  • 108. VISSZALÉPÉSES KERESÉS (BACKTRACKING)  Ha vissza kell tudni állni egy korábbi állapotra és onnan folytatni  Megoldások: o Import-export o Tranzakció meghiúsulása • Csak egy szintű visszalépésre ? Metrika: 5 12 8
  • 109. HIBAKERESÉS  Futtatás során állapotok rögzítése és visszajátszása
  • 110. HIBAKERESÉS  Futtatás során állapotok rögzítése és visszajátszása o Visszajátszásnál előző állapot külön csúcsban tárolva
  • 111. HIBAKERESÉS  Futtatás során állapotok rögzítése és visszajátszása o Visszajátszásnál előző állapot külön csúcsban tárolva o Mentett lekérdezés a léptetésre
  • 112. HIBAKERESÉS  Futtatás során állapotok rögzítése és visszajátszása o Visszajátszásnál előző állapot külön csúcsban tárolva o Mentett lekérdezés a léptetésre
  • 114. HIBAKERESÉS  Bonyolult hibáknál o Hibamintát Cypherben felírni MATCH (node:Faulty) RETURN node
  • 115. HIBAKERESÉS  Bonyolult hibáknál o Hibamintát Cypherben felírni o Kódban breakpoint, ha megtalálta MATCH (node:Faulty) RETURN node if (gds.execute(query).hasNext()) // breakpoint
  • 116. HIBAKERESÉS  Bonyolult hibáknál o Hibamintát Cypherben felírni o Kódban breakpoint, ha megtalálta o Adott állapot betöltése o Léptetés az állapotok között MATCH (node:Faulty) RETURN node if (gds.execute(query).hasNext()) // breakpoint
  • 118. Sicco Verwer: Efficient identification of timed automata. PhD disszertáció PSZEUDOKÓD
  • 119. Sicco Verwer: Efficient identification of timed automata. PhD disszertáció PSZEUDOKÓD
  • 120. Sicco Verwer: Efficient identification of timed automata. PhD disszertáció PSZEUDOKÓD
  • 121. Sicco Verwer: Efficient identification of timed automata. PhD disszertáció PSZEUDOKÓD
  • 122. Sicco Verwer: Efficient identification of timed automata. PhD disszertáció PSZEUDOKÓD
  • 123. Sicco Verwer: Efficient identification of timed automata. PhD disszertáció PSZEUDOKÓD
  • 124. TDK ÉS SZAKDOLGOZATOK Gujgiczer Anna: Időzített rendszerek tanulás alapú analízise. BSc szakdolgozat Elekes Márton: Modellvezérelt automatatanulás. BSc szakdolgozat Elekes Márton, Gujgiczer Anna: Modellalapú automatatanulás formális modellek szintéziséhez. TDK dolgozat
  • 125.
  • 126.
  • 127. A CYPHER KIFEJEZŐEREJE  A legtöbb lekérdezés P-beli  Két diszjunkt útvonal létezésének ellenőrzése már NP-teljes  A Cypher nyelv Turing-teljes o Listanézetek, reduce o A gráf szalagként használható  Cypher 9 (aktuális verzió)  Cypher 10 (multiple graph-ok támogatása)
  • 128. ÖSSZEFOGLALÁS  Neo4j prototípus o Gyors fejlesztés o Specifikus problémákra APOC eljárások  Felmerülő problémák o APOC bug o Megjelenítőfelület hiányosságai o Fixpont hiánya  Javasolt felhasználás o Prototipizálás o Utána újraírni imperatív kóddal
  • 129. CSAPAT Segítettek még: Semeráth Oszkár, Tóth Tamás, Vörös András
  • 130. KÖSZÖNETNYILVÁNÍTÁS  Az Emberi Erőforrások Minisztériuma ÚNKP-17-1-I. kódszámú Új Nemzeti Kiválóság Programjának támogatásával készült  Az MTA-BME Lendület Kiberfizikai Rendszerek Kutatócsoport szakmai támogatásával készült
  • 131. Ω