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!
maandag 30 mei 2016
zaterdag 14 mei 2016
Java vs dotnet
Java heeft een nettere foreach, namelijk:
for (Object obj : list) {
}
Instinkers:
In Java kun je nooit roepen if (var == "string") { ... }
Want je moet altijd equals gebruiken. De == kijkt namelijk naar String geheugen locatie, en die is vrijwel nooit hetzelfde. Dus altijd if (var.equals("string")) { ... } gebruiken.
In Java heb je geen partial classes.
for (Object obj : list) {
}
Instinkers:
In Java kun je nooit roepen if (var == "string") { ... }
Want je moet altijd equals gebruiken. De == kijkt namelijk naar String geheugen locatie, en die is vrijwel nooit hetzelfde. Dus altijd if (var.equals("string")) { ... } gebruiken.
In Java heb je geen partial classes.
vrijdag 13 mei 2016
SparkJava 2.5 problems
SparkJava 2.5 contains bugs.
1) It doesn't run out of the box. It misses a dependency:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.13</version>
</dependency>
2) The after filter is NOT triggered.
So, I went back to version 2.3
3) The StaticFileLocation does not set the content-type header, so Internet Explorer 11 does not use the CSS file. I took me a while to figure that out.
Add this:
after("/css/*.css", (request, response) -> {
response.type("text/css");
});
Addition 1 june 2016:
Quick fix for problem 2 and 3:
1) It doesn't run out of the box. It misses a dependency:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.13</version>
</dependency>
2) The after filter is NOT triggered.
So, I went back to version 2.3
3) The StaticFileLocation does not set the content-type header, so Internet Explorer 11 does not use the CSS file. I took me a while to figure that out.
Add this:
after("/css/*.css", (request, response) -> {
response.type("text/css");
});
Addition 1 june 2016:
Quick fix for problem 2 and 3:
Download the spark-master at GitHub. Unpack the zip.
2)
In the file StaticFilesConfiguration.java change the consume method into:
public boolean consume(HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws IOException {
String url = httpRequest.getRequestURL(). toString();
if (url.endsWith(".css")) {
httpResponse.setContentType(" text/css");
}
if ( consumeWithFileResourceHandler s(httpRequest, httpResponse)) {
return true;
}
if ( consumeWithJarResourceHandler( httpRequest, httpResponse)) {
return true;
}
return false;
}
3)
in the POM.xml
change:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</ artifactId>
<version>1.7.13</version>
<scope>test</scope>
</dependency>
into:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</ artifactId>
<version>1.7.13</version>
</dependency>
Do -> mvn clean install
And you got your 2.6-SNAPSHOT
Reference it with:
<dependency>
<groupId>com.sparkjava</ groupId>
<artifactId>spark-core</ artifactId>
<version>2.6-SNAPSHOT</ version>
</dependency>
Abonneren op:
Posts (Atom)