Stel, ik wil weten welke acteurs meer dan 1 keer met een andere acteur in een film gespeeld hebben.
Dit is dan de SQL query, die ik in 1 minuut gemaakt heb:
select actor_id, aantal
from
(
select actor_id, count(1) as aantal from
movie_actor
where movie_id in (select movie_id from movie_actor where actor_id = (select actor_id from actor where actor_id = 1534))
and actor_id != 1534
group by actor_id
)
where aantal > 1
order by aantal desc
En dan nu de Gremlin query:
g.V().has("actor_id", 1534).as("d").match(
__.as("a").out("speelt in").as("b"),
__.as("b").in("speelt in").as("c"),
__.as("c").where(P.neq("d"))
).select("c").groupCount().by("actor_id")
.order(Scope.local).by(org.apache.tinkerpop.gremlin.structure.Column.values, Order.decr).next().forEach((x,aantal) -> {
if (aantal > 1) {
System.out.println(x);
System.out.println(aantal);
}
});
Het valt mij op dat de complexiteit van de Gremlin query behoorlijk is, terwijl Gremlin toch zou moeten stralen in dit soort gevallen. De Gremlin query bevat jammergenoeg rare elementen, zoals __ en Scope.local, Column.values. Verder moet er een vervelende loop gemaakt worden op het laatst.
Ik durf te beweren dat de SQL query 10 keer sneller is, minimaal.
De API van gremlin wijzigt trouwens sterk. Een groot aantal functie's in de 2.x versie reeks is niet meer te gebruiken bij 3.x
Open sores: Tinkerpop Gremlin is vooral ontwikkeld door Marko A. Rodriguez. Die heeft ook een zware hand gehad in Titan, de Graph database van de Hortonworks Hadoop stack. Echter, het hele team van Titan, namelijk Aurelius, is overgenomen door Datastax. Nieuwe versie's zijn er sinds die tijd niet meer geweest.
Geef Marko en z'n team Aurelius eens ongelijk!
Geen opmerkingen:
Een reactie posten