SlideShare a Scribd company logo
1 of 159
Download to read offline
PERFORMANCETESTING
Using Gatling
GATLING.IO
https://gatling.io/docs/current/cheat-sheet/
NEW SCALA CLASS
Right Click on “scala” directory.
NAME IT.
Go with “NetworkCount”.
import io.gatling.core.Predef._
import
io.gatling.core.scenario.Simulat
ion
import io.gatling.http.Predef._
class NetworkCount extends
Simulation {
// Setup server, username and
password
val httpProtocol = http
Your password.
// Use a data file for our requests and repeat
values if we get to the end.
val feeder = csv("data/usernames.csv").circular
// The cypher queries we will test
val count = """CALL
com.maxdemarzi.network.count($username, 4)"""
val cypherQuery = """{"statements" : [{"statement"
: "%s", "parameters" : { "username": "${username}"
}}]}"""
.format(count)
val scn = scenario("NetworkCounts")
.during(30 ) {
feed(feeder)
.exec(
http("network count")
.post("/db/data/
transaction/commit")
.body(StringBody(cypherQu
ery))
.asJson
.check(status.is(200))
)
setUp(
scn.inject(atOnceUsers
(4)),
).protocols(httpProtoc
ol)
/*
If you want to see the response from the
server, add the following to the .check
.check(bodyString.saveAs("BODY"))
)
.exec(session => {
val response =
session("BODY").as[String]
println(s"Response body:
n$response")
session
}
*/
MATCH (n:User)
RETURN
n.username
LIMIT 10000
EXPORT CSV
The one time this is useful.
COPY IT
Paste it in your “src/test/resources/data/“ directory of the new
project.
BACKTO INTELLIJ
You see it right?
RENAME IT
Right Click on it, choose “Refactor”, choose “Rename…”.
NAME IT
Call it “usernames.csv”. Stick with me this time.
OPEN IT, EDIT IT
Remove the “n.” before “username”.
RUN IT
Right Click on “Engine”, Choose “Run ‘Engine’ ”.
GIVE IT A DESCRIPTION
It will wait until you hit “Enter”.
30 SECONDS LATER
Highlight the filename, and Control-C.
NUMBERS AND CHARTS
5.677 Requests/Second…Not bad.
COPYTHE SIMULATION
Right Click on “Network Count”.
PASTE IT
In the same directory.
RENAME IT
Skip 2, have it end in 3.
// The cypher queries we will test
val count = """CALL
com.maxdemarzi.network.count3($username, 4)"""
val cypherQuery = """{"statements" : [{"statement" :
"%s", "parameters" : { "username": "$
{username}" }}]}"""
.format(count)
val scn = scenario("NetworkCounts")
.during(30 ) {
feed(feeder)
.exec(
http("network count 3")
REPEAT FOR 4 AND 5.
RUN IT AGAIN
You got this.
CHOICES
0-3 are given as prompts for which test to run.
CHOOSE 3
NetworkCount5 FTW. Give it a description and hit “Enter”.
30 SECONDS LATER
Highlight the filename, and Control-C.
FASTER
17.5 Requests/Second…Nicer.
PROFILING
What is this thing doing?
YOURKIT
https://www.yourkit.com/ comes with 15 day trial.
GET IT
Windows, MacOS or this is not the year of linux on the desktop.
ALSO GETTHE ZIP
From the Linux option.
https://www.yourkit.com/java/profiler/download/
GET STARTED WITH PROFILER
It should look like this.
WHICH APP?
I don’t see Neo4j…
COMMERCIAL ENTRY POINT
Don’t worry about the error message.
ONCE IT CONNECTS
Click on CPU usage telemetry.
XRAYVISION
Highlight a section of time.
MAKE IT WORK
Run the query without the arrow.
MATCH (u:User)-
[*1..4]-(c)
WHERE u.username =
'Khloe17'
RETURN count(DISTINCT
c)
GREEN AREA
Highlight the green area.
EXPAND IT
Right Click on “AllThreads”.
DOWN ANDTOTHE RIGHT
Scroll until you see PruningVarLengthExpandPipe.scala
STORED PROC
Run the stored procedure now.
SIZE MATTERS
The green area is too small, can’t really tell from a single call.
GATLINGTOTHE RESCUE
Run the Engine on the PerformanceTest project.
MORE GREEN
Ok, this we can work with.
MOAR DETAILS
Click on the Clock with a green Play button.
LONG PAUSE
There are ways to avoid this, just deal with it today.
ERROR
If you get this, don’t worry, just keep trying.
RECONNECT
You may have to reconnect a couple of times.
RED LINE
Once you see the red line it means you are good to go.
GATLING AGAIN
Run the Engine on the PerformanceTest project again.
LINE NUMBERS
Now you know what it is doing.
GATLING AGAIN
Run the Engine on the PerformanceTest project again.
Choose NetworkCount5.
SAMPLING
Doesn’t always tell the whole story.
TRYTHE OTHER ONE
Stop the profiling, switch to “Tracing”, restart it.
GATLING AGAIN
Run the Engine on the PerformanceTest project again.
Choose NetworkCount5.
TRACING
Better at telling the whole story?
MEMORY
Check your Object Allocations. 500k relationships, 100M relationship objects.
READTHE DOCS
https://www.yourkit.com/docs/java/help/cpu_intro.jsp
REFERENCE ONLY
Don’t do this now.
GETTHE ZIP IFYOU DIDN’T EARLIER
From the Linux option.
https://www.yourkit.com/java/profiler/download/
ENABLE IT
Use the line for your particular Operating System.
https://www.yourkit.com/docs/java/help/agent.jsp
dbms.jvm.additional=-agentpath:/Users/
maxdemarzi/Downloads/YourKit-
JavaProfiler-2018.04/bin/mac/libyjpagent.jnilib
Edit your neo4j.conf file, and restart it.
GREEN
No more agent connection troubles.
TEALTO PINK
How do we reach the pink node from the teal node?
MATCH p=(u:User)-[*1..2]-(u2:User)
WHERE u.username = 'Khloe17' AND
u2.username = 'Michelle21'
RETURN p, REDUCE(weight = 0.0, r in
relationships(p) |
weight + r.weight) /
length(p) AS weight
ORDER BY weight DESC
LIMIT 100
PROFILE IT
VarLengthExpand… hum.
3Let’s go up a notch.
MATCH p=(u:User)-[*1..3]-(u2:User)
WHERE u.username = 'Khloe17' AND
u2.username = 'Michelle21'
RETURN p, REDUCE(weight = 0.0, r in
relationships(p) |
weight + r.weight) /
length(p) AS weight
ORDER BY weight DESC
LIMIT 100
492,448,313 DB HITS
OMGWTFBBQ
4Let’s go up another notch.
MATCH p=(u:User)-[*1..4]-(u2:User)
WHERE u.username = 'Khloe17' AND
u2.username = 'Michelle21'
RETURN p, REDUCE(weight = 0.0, r in
relationships(p) |
weight + r.weight) /
length(p) AS weight
ORDER BY weight DESC
LIMIT 100
DON’T RUN IT
If you jumped the gun and did, restart neo4j.
GOOD FRIENDS
[:FRIENDS {weight:0.80+}] and sort by length
MATCH p=(u:User)-[*1..4]-(u2:User)
WHERE u.username = 'Khloe17' AND
u2.username = 'Michelle21' AND
ALL (r IN relationships(p) WHERE
r.weight >= 0.80)
RETURN p, REDUCE(weight = 0.0, r in
relationships(p) |
weight + r.weight) /
length(p) AS weight
ORDER BY length(p), weight DESC
LIMIT 100
80 SECONDS
Much better.Why?
FILTER IN EXPAND
Checks the weight property as it goes.
TRAVERSAL API - PART 2
Evaluators and Expanders.
ADD A NEW CLASS
Right Click on “results” and add it.
CALL IT WEIGHTEDPATHRESULT
It will return a Path and a weight.
package com.maxdemarzi.results;
import org.neo4j.graphdb.Path;
public class WeightedPathResult {
public Path path;
public double weight;
public WeightedPathResult(Path path, double
weight) {
this.path = path;
this.weight = weight;
}
public int getLength() {
return path.length();
}
public double getWeight() {
COMPARATOR
Which paths are better?
private static final Comparator<WeightedPathResult> comparator
=
Comparator.comparingInt(WeightedPathResult::getLength)
.thenComparing(Comparator.comparingDouble(WeightedPath
Result::getWeight)
.reversed());
This goes in Procedures.java inside the class, outside any methods.
@Procedure(name="com.maxdemarzi.reach.after", mode = Mode.READ)
@Description("com.maxdemarzi.reach.after(String username1, String
username2)")
public Stream<WeightedPathResult> reachAfter(@Name("username1")
String username1,
@Name("username2")
String username2) {
Node user1 = db.findNode(Label.label("User"), "username",
username1);
Node user2 = db.findNode(Label.label("User"), "username",
username2);
if (user1 == null || user2 == null) {
return Stream.empty();
}
TraversalDescription leftSide =
db.traversalDescription()
.breadthFirst()
.expand(PathExpanders.allTypesAndDirection
s())
.evaluator(Evaluators.toDepth(2))
.uniqueness(Uniqueness.RELATIONSHIP_PATH);
TraversalDescription rightSide =
db.traversalDescription()
.breadthFirst()
.expand(PathExpanders.allTypesAndDirection
s())
.evaluator(Evaluators.toDepth(2))
.uniqueness(Uniqueness.RELATIONSHIP_PATH);
BidirectionalTraversalDescription bidirtd =
outerloop:
for (Path path : bidirtd.traverse(user1, user2)) {
double weight = 0.0;
for (Relationship r : path.relationships()) {
double each = (double)
r.getProperty("weight");
if (each >= 0.80) {
weight += each;
} else {
continue outerloop;
}
}
list.add(new WeightedPathResult(path, weight /
path.length()));
}
list.sort(comparator);
CALL com.maxdemarzi.reach.after('Khloe17',
'Michelle21')
DON’T RUN IT
If you jumped the gun and did, restart neo4j.
ADD A NEW JAVA CLASS
Make sure you are on your Package folder and Right-Click.
CALL IT GOODFRIENDEVALUATOR
It will evaluate Paths.
public class GoodFriendEvaluator implements
Evaluator {
@Override
public Evaluation evaluate(Path path) {
for (Relationship r :
path.relationships()) {
if
((double)r.getProperty("weight") < 0.80) {
return
Evaluation.EXCLUDE_AND_PRUNE;
}
}
return
Evaluation.INCLUDE_AND_CONTINUE;
}
}
private static final GoodFriendEvaluator evaluator = new
GoodFriendEvaluator();
@Procedure(name="com.maxdemarzi.reach.evaluator", mode = Mode.READ)
@Description("com.maxdemarzi.reach.evaluator(String username1,
String username2)")
public Stream<WeightedPathResult> reachEvaluator(@Name("username1")
String username1,
@Name("username2")
String username2) {
Node user1 = db.findNode(Label.label("User"), "username",
username1);
Node user2 = db.findNode(Label.label("User"), "username",
username2);
if (user1 == null || user2 == null) {
return Stream.empty();
}
TraversalDescription eachSide =
db.traversalDescription()
.breadthFirst()
.expand(PathExpanders.allTypesAndDire
ctions())
.evaluator(Evaluators.toDepth(2))
.evaluator(evaluator)
.uniqueness(Uniqueness.RELATIONSHIP_P
ATH);
EVALUATETHE COLLISION
What do you do when two traversals collide?
BidirectionalTraversalDescription
bidirtd =
db.bidirectionalTraversalDescript
ion()
.mirroredSides(eachSide)
.collisionEvaluator(evalu
ator);
ArrayList<WeightedPathResult> list = new
ArrayList<>();
for (Path path : bidirtd.traverse(user1, user2)) {
double weight = 0.0;
for (Relationship r : path.relationships()) {
weight += (double)
r.getProperty("weight");
}
list.add(new WeightedPathResult(path, weight /
path.length()));
}
list.sort(comparator);
return list.stream().limit(100);
CALL com.maxdemarzi.reach.evaluator('Khloe17',
'Michelle21')
7 SECONDS
Not bad. Better than the 80 seconds we started with.
ADD A NEW JAVA CLASS
Make sure you are on your Package folder and Right-Click.
CALL IT GOODFRIENDEXPANDER
It will expand Paths.
public class GoodFriendExpander implements PathExpander {
@Override
public Iterable<Relationship> expand(Path path, BranchState
branchState) {
List<Relationship> rels = new ArrayList<>();
for (Relationship r : path.endNode()
.getRelationships(RelationshipType.wit
hName("FRIENDS"))) {
if ((double)r.getProperty("weight") >= 0.80) {
rels.add(r);
}
}
return rels;
}
@Override
public PathExpander reverse() {
// Doesn't matter, do the same thing.
return this;
}
}
private static final GoodFriendExpander expander = new
GoodFriendExpander();
@Procedure(name="com.maxdemarzi.reach.expander", mode = Mode.READ)
@Description("com.maxdemarzi.reach.expander(String username1,
String username2)")
public Stream<WeightedPathResult> reachExpander(@Name("username1")
String username1,
@Name("username2")
String username2) {
Node user1 = db.findNode(Label.label("User"), "username",
username1);
Node user2 = db.findNode(Label.label("User"), "username",
username2);
if (user1 == null || user2 == null) {
return Stream.empty();
}
TraversalDescription eachSide =
db.traversalDescription()
.breadthFirst()
.expand(expander)
.evaluator(Evaluators.toDepth(2))
.uniqueness(Uniqueness.RELATIONSHIP_P
ATH);
BidirectionalTraversalDescription bidirtd =
db.bidirectionalTraversalDescription()
.mirroredSides(eachSide);
ArrayList<WeightedPathResult> list = new
ArrayList<>();
for (Path path : bidirtd.traverse(user1, user2)) {
double weight = 0.0;
for (Relationship r : path.relationships()) {
weight += (double)
r.getProperty("weight");
}
list.add(new WeightedPathResult(path, weight /
path.length()));
}
list.sort(comparator);
return list.stream().limit(100);
CALL com.maxdemarzi.reach.expander('Khloe17',
'Michelle21')
211 MILLISECONDS
Better than 7 seconds and way better than 80 seconds.
EXPANDER > EVALUATOR
Check before traverse is better than check after traverse.
BOTH?
Sure, why not.
ADD A NEW JAVA CLASS
Make sure you are on your Package folder and Right-Click.
TOO MANY FRIENDS
Another Evaluator.
public class TooManyFriendsEvaluator implements Evaluator {
private PriorityQueue<WeightedPathResult> paths;
TooManyFriendsEvaluator(PriorityQueue<WeightedPathResult> paths) {
this.paths = paths;
}
@Override
public Evaluation evaluate(Path path) {
double weight = 0.0;
for (Relationship r : path.relationships()) {
weight += (double) r.getProperty("weight");
}
if (paths.size() < 100) {
paths.add(new WeightedPathResult(path, weight /
path.length()));
} else {
WeightedPathResult last = paths.peek();
if(last.getLength() >= path.length() && last.weight < weight/
path.length()) {
paths.poll();
paths.add(new WeightedPathResult(path, weight /
path.length()));
}
}
@Procedure(name =“com.maxdemarzi.reach.both", mode = Mode.READ)
@Description("com.maxdemarzi.reach.both(String username1, String
username2)")
public Stream<WeightedPathResult> reachBoth(@Name("username1")
String username1,
@Name("username2")
String username2) {
Node user1 = db.findNode(Label.label("User"), "username",
username1);
Node user2 = db.findNode(Label.label("User"), "username",
username2);
if (user1 == null || user2 == null) {
return Stream.empty();
}
PriorityQueue<WeightedPathResult> paths = new
PriorityQueue<>(100, comparator);
TraversalDescription eachSide =
db.traversalDescription()
.breadthFirst()
.expand(expander)
.evaluator(Evaluators.toDepth(2))
.uniqueness(Uniqueness.NODE_PATH);
BidirectionalTraversalDescription bidirtd =
db.bidirectionalTraversalDescription()
.mirroredSides(eachSide)
.collisionEvaluator(new
TooManyFriendsEvaluator(paths));
int count = 0;
for (Path ignore :
bidirtd.traverse(user1, user2)) {
count++;
}
return paths.stream();
168 MILLISECONDS
Nice…
CA$HING
Great for immutable properties and slow changing traversals.
LOOK AT POM.XML
Look at it.
JUST KIDDING
Caffeine is already included by Neo4j, so we don’t need to add it.
CLOSE POM.XML
Close it.
private static GraphDatabaseService graph;
private static final LoadingCache<Integer, String>
usernames = Caffeine.newBuilder()
.maximumSize(100001L)
.build(Procedures::getNodeUsername);
private static String getNodeUsername(Integer key)
{
return
(String)graph.getNodeById(key).getProperty("userna
me");
}
private static final LoadingCache<Integer, RoaringBitmap>
nodeFriends = Caffeine.newBuilder()
.maximumSize(100001L)
.expireAfterWrite(1L, TimeUnit.HOURS)
.build(Procedures::getNodeFriends);
private static RoaringBitmap getNodeFriends(Integer key) {
Node user = graph.getNodeById(key);
RoaringBitmap friends = new RoaringBitmap();
for (Relationship r :
user.getRelationships(RelationshipType.withName("FRIENDS"))) {
friends.add((int)r.getOtherNodeId(key));
}
return friends;
}
ANALYTICS
Writing to Disk, Logging progress, more…
HATEDTHAT SHOW
Seriously.
MATCH (u:User)-[:FRIENDS]-(u2:User)-
[:FRIENDS]-(u3:User)
RETURN u.username, u2.username, u3.username
LIMIT 100
7 MS
That’s fast.
SMART
Find u2, expand.
DUMB
Why you expand again?
IN ORDER
Don’t run this next query.
MATCH (u:User)-[:FRIENDS]-(u2:User)-
[:FRIENDS]-(u3:User)
RETURN u.username, u2.username, u3.username
ORDER BY u.username, u2.username, u3.username
LIMIT 100
EXPLAIN MATCH (u:User)-[:FRIENDS]-(u2:User)-
[:FRIENDS]-(u3:User)
RETURN u.username, u2.username, u3.username
ORDER BY u.username, u2.username, u3.username
LIMIT 100
DUMB
Top is at the bottom.
REPORT
I want to know for every friend of
friends, how many friends they have
in common….Oh and I want it in
order by username alphabetically
and then the count in descending
order.
EXPLAIN MATCH (u:User)-[:FRIENDS]-(u2:User)-
[:FRIENDS]-(u3:User)
RETURN u.username, u3.username, COUNT(u2)
ORDER BY u.username, COUNT(u2) DESC
THIS IS GOINGTO SUCK
Let’s go.
LOOK AT POM.XML
Look at it.
<properties>
<neo4j.version>3.5.1</neo4j.version>
<neo4j.driver.version>1.7.2</neo4j.driver.version>
<roaring.version>0.7.30</roaring.version>
<fastcsv.version>1.0.3</fastcsv.version>
<project.build.sourceEncoding>UTF-8</
project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>de.siegmar</groupId>
<artifactId>fastcsv</artifactId>
<version>${fastcsv.version}</version>
</dependency>
CLOSE POM.XML
Close it.
@Procedure(name="com.maxdemarzi.fic", mode = Mode.READ)
@Description("com.maxdemarzi.fic(String path)")
public Stream<StringResult> friendsInCommon(@Name(value="path") String
path) throws IOException {
if (graph == null) {
graph = this.db;
}
ResourceIterator userIterator = db.findNodes(Label.label("User"));
ArrayList<Pair<String, Node>> users = new ArrayList<>();
while (userIterator.hasNext()) {
Node user = (Node)userIterator.next();
String username = usernames.get((int)user.getId());
users.add(Pair.of(username, user));
}
users.sort(Comparator.comparing(Pair<String, Node>::first));
RoaringBitmap fofs;
RoaringBitmap friends;
IntIterator intIterator;
File file = new File(path);
CsvWriter csvWriter = new CsvWriter();
try (CsvAppender csvAppender = csvWriter.append(file,
StandardCharsets.UTF_8)){
csvAppender.appendLine("user", "fof", "fic_count");
int userCount = 0;
for (Pair<String, Node> pair : users) {
int fof;
if (userCount++ > 1000) break; // short circuit for
class
fofs = new RoaringBitmap();
friends = nodeFriends.get((int)pair.other().getId());
intIterator = friends.getIntIterator();
while (intIterator.hasNext()) {
fofs.or(nodeFriends.get(intIterator.next()));
}
fofs.remove((int) pair.other().getId());
ArrayList<Pair<String, Integer>> counts = new ArrayList<>();
intIterator = fofs.getIntIterator();
while (intIterator.hasNext()) {
fof = intIterator.next();
int cardinality = RoaringBitmap.and(friends,
nodeFriends.get(fof)).getCardinality();
if (cardinality <= 5) continue; // short circuit for class
counts.add(Pair.of(usernames.get(fof), cardinality));
}
counts.sort(Comparator.comparingInt(Pair<String,
Integer>::other).reversed());
for (Pair<String, Integer> count : counts) {
csvAppender.appendLine(pair.first(), count.first(),
String.valueOf(count.other()));
}
}
}
return Stream.of(new StringResult("Report written to " + path));
CALL IT AND WAIT
CALL com.maxdemarzi.fic('/Users/maxdemarzi/Documents/Projects/
procedures/fic.csv')
OPEN IT
If you remove the short circuits, you will get gigs of data.
YOU CAN’T DOTHIS IN NEPTUNE
Or in CosmosDB for that matter.
ANALYTICS
What is the distribution of mutual friends?
EXPLAIN MATCH (u:User)-[:FRIENDS]-(u2:User)-
[:FRIENDS]-(u3:User)
WITH u, u3, COUNT(u2) AS counts
RETURN counts, COUNT(*)
ORDER BY counts
ADD A NEW CLASS
Right Click on “results” and add it.
CALL IT COUNTVALUERESULT
It will return a Count and aValue.
package com.maxdemarzi.results;
public class CountValueResult {
public final Long count;
public final Long value;
public CountValueResult(Long count,
Long value) {
this.count = count;
this.value = value;
}
}
@Procedure(name = "com.maxdemarzi.fic.distribution",
mode = Mode.READ)
@Description("com.maxdemarzi.fic.distribution")
public Stream<CountValueResult>
friendsInCommonDistribution() {
long start = System.nanoTime();
if (graph == null) {
graph = this.db;
}
ResourceIterator userIterator =
db.findNodes(Label.label("User"));
Map<Long, long[]> instances = new HashMap<>();
Roaring64NavigableMap seen = new
Roaring64NavigableMap();
int count = 0;
while (userIterator.hasNext()) {
Node user = (Node) userIterator.next();
RoaringBitmap friendsMap = nodeFriends.get((int)
user.getId());
int[] friends = friendsMap.toArray();
for (int i = 0; i < friends.length; i++) {
for (int j = i + 1; j < friends.length; j++) {
long key = (((long)friends[i]) << 32) |
(friends[j] & 0xffffffffL);
seen.add(key);
}
}
if(count++ % 1000 == 0) {
log.warn("On User # " + count + " at " +
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start));
}
}
count = 0;
Iterator<Long> iterator = seen.iterator();
long size = seen.getLongCardinality();
while(iterator.hasNext()) {
long l = iterator.next();
int firstNodeId = (int)(l >> 32);
int secondNodeId = (int)l;
long common = RoaringBitmap
.and(nodeFriends.get(firstNodeId),
nodeFriends.get(secondNodeId))
.getCardinality();
instances.putIfAbsent(common, new long[]{0L});
instances.get(common)[0]++;
if(count++ % 50_000_000 == 0) {
log.warn("On Combination # " + count + " of "
+ size + " at " +
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() -
start));
return instances.entrySet()
.stream()
.sorted(Comparator.comparingLong(Map.Entry<Long,
long[]>::getKey))
.map(entry -> new CountValueResult(entry.getKey(),
entry.getValue()[0]));
CALL IT
CALL com.maxdemarzi.fic.distribution
15 MINUTES
tail -f ./neo4j-enterprise-3.5.1/logs/neo4j.log
Q & A
What is on your mind?
PERFORMANCE TESTING WITH GATLING AND NEO4J

More Related Content

What's hot

Introduction to GraphQL
Introduction to GraphQLIntroduction to GraphQL
Introduction to GraphQLAppier
 
Relational to Graph - Import
Relational to Graph - ImportRelational to Graph - Import
Relational to Graph - ImportNeo4j
 
Social Network Analysis power point presentation
Social Network Analysis power point presentation Social Network Analysis power point presentation
Social Network Analysis power point presentation Ratnesh Shah
 
JSON-LD: JSON for Linked Data
JSON-LD: JSON for Linked DataJSON-LD: JSON for Linked Data
JSON-LD: JSON for Linked DataGregg Kellogg
 
Airflow - a data flow engine
Airflow - a data flow engineAirflow - a data flow engine
Airflow - a data flow engineWalter Liu
 
Apache Sedona: how to process petabytes of agronomic data with Spark
Apache Sedona: how to process petabytes of agronomic data with SparkApache Sedona: how to process petabytes of agronomic data with Spark
Apache Sedona: how to process petabytes of agronomic data with SparkLuiz Henrique Zambom Santana
 
Creating data apps using Streamlit in Python
Creating data apps using Streamlit in PythonCreating data apps using Streamlit in Python
Creating data apps using Streamlit in PythonNithish Raghunandanan
 
API Security : Patterns and Practices
API Security : Patterns and PracticesAPI Security : Patterns and Practices
API Security : Patterns and PracticesPrabath Siriwardena
 
JSON: The Basics
JSON: The BasicsJSON: The Basics
JSON: The BasicsJeff Fox
 
Neo4j GraphTalk Helsinki - Introduction and Graph Use Cases
Neo4j GraphTalk Helsinki - Introduction and Graph Use CasesNeo4j GraphTalk Helsinki - Introduction and Graph Use Cases
Neo4j GraphTalk Helsinki - Introduction and Graph Use CasesNeo4j
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJSDavid Parsons
 
Custom policies in mule 4 and a circuit breaker example
Custom policies in mule 4 and a circuit breaker exampleCustom policies in mule 4 and a circuit breaker example
Custom policies in mule 4 and a circuit breaker exampleRoyston Lobo
 

What's hot (20)

Introduction to GraphQL
Introduction to GraphQLIntroduction to GraphQL
Introduction to GraphQL
 
Introduction to GraphQL
Introduction to GraphQLIntroduction to GraphQL
Introduction to GraphQL
 
Pig latin
Pig latinPig latin
Pig latin
 
JSON WEB TOKEN
JSON WEB TOKENJSON WEB TOKEN
JSON WEB TOKEN
 
Relational to Graph - Import
Relational to Graph - ImportRelational to Graph - Import
Relational to Graph - Import
 
Introduction to HDFS
Introduction to HDFSIntroduction to HDFS
Introduction to HDFS
 
Social Network Analysis power point presentation
Social Network Analysis power point presentation Social Network Analysis power point presentation
Social Network Analysis power point presentation
 
JSON-LD: JSON for Linked Data
JSON-LD: JSON for Linked DataJSON-LD: JSON for Linked Data
JSON-LD: JSON for Linked Data
 
Airflow - a data flow engine
Airflow - a data flow engineAirflow - a data flow engine
Airflow - a data flow engine
 
Apache Sedona: how to process petabytes of agronomic data with Spark
Apache Sedona: how to process petabytes of agronomic data with SparkApache Sedona: how to process petabytes of agronomic data with Spark
Apache Sedona: how to process petabytes of agronomic data with Spark
 
Keycloak SSO basics
Keycloak SSO basicsKeycloak SSO basics
Keycloak SSO basics
 
Creating data apps using Streamlit in Python
Creating data apps using Streamlit in PythonCreating data apps using Streamlit in Python
Creating data apps using Streamlit in Python
 
API Security : Patterns and Practices
API Security : Patterns and PracticesAPI Security : Patterns and Practices
API Security : Patterns and Practices
 
JSON: The Basics
JSON: The BasicsJSON: The Basics
JSON: The Basics
 
gRPC in Go
gRPC in GogRPC in Go
gRPC in Go
 
Neo4j GraphTalk Helsinki - Introduction and Graph Use Cases
Neo4j GraphTalk Helsinki - Introduction and Graph Use CasesNeo4j GraphTalk Helsinki - Introduction and Graph Use Cases
Neo4j GraphTalk Helsinki - Introduction and Graph Use Cases
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Graph based data models
Graph based data modelsGraph based data models
Graph based data models
 
Apache Airflow
Apache AirflowApache Airflow
Apache Airflow
 
Custom policies in mule 4 and a circuit breaker example
Custom policies in mule 4 and a circuit breaker exampleCustom policies in mule 4 and a circuit breaker example
Custom policies in mule 4 and a circuit breaker example
 

Similar to PERFORMANCE TESTING WITH GATLING AND NEO4J

Dropwizard and Friends
Dropwizard and FriendsDropwizard and Friends
Dropwizard and FriendsYun Zhi Lin
 
CIS407AWk2iLabDefault.aspx Greetings and Salutations.docx
CIS407AWk2iLabDefault.aspx        Greetings and Salutations.docxCIS407AWk2iLabDefault.aspx        Greetings and Salutations.docx
CIS407AWk2iLabDefault.aspx Greetings and Salutations.docxclarebernice
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to javaciklum_ods
 
Examples from Pune meetup
Examples from Pune meetupExamples from Pune meetup
Examples from Pune meetupSantosh Ojha
 
33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good TestsTomek Kaczanowski
 
How to make a Load Testing with Visual Studio 2012
How to make a Load Testing with Visual Studio 2012How to make a Load Testing with Visual Studio 2012
How to make a Load Testing with Visual Studio 2012Chen-Tien Tsai
 
Java rmi example program with code
Java rmi example program with codeJava rmi example program with code
Java rmi example program with codekamal kotecha
 
[xp2013] Narrow Down What to Test
[xp2013] Narrow Down What to Test[xp2013] Narrow Down What to Test
[xp2013] Narrow Down What to TestZsolt Fabok
 
Structural pattern 3
Structural pattern 3Structural pattern 3
Structural pattern 3Naga Muruga
 
The Ring programming language version 1.8 book - Part 95 of 202
The Ring programming language version 1.8 book - Part 95 of 202The Ring programming language version 1.8 book - Part 95 of 202
The Ring programming language version 1.8 book - Part 95 of 202Mahmoud Samir Fayed
 
Release with confidence
Release with confidenceRelease with confidence
Release with confidenceJohn Congdon
 
Innovative Specifications for Better Performance Logging and Monitoring
Innovative Specifications for Better Performance Logging and MonitoringInnovative Specifications for Better Performance Logging and Monitoring
Innovative Specifications for Better Performance Logging and MonitoringCary Millsap
 
Appium Automation with Kotlin
Appium Automation with KotlinAppium Automation with Kotlin
Appium Automation with KotlinRapidValue
 
Testing in android
Testing in androidTesting in android
Testing in androidjtrindade
 

Similar to PERFORMANCE TESTING WITH GATLING AND NEO4J (20)

Dropwizard and Friends
Dropwizard and FriendsDropwizard and Friends
Dropwizard and Friends
 
CIS407AWk2iLabDefault.aspx Greetings and Salutations.docx
CIS407AWk2iLabDefault.aspx        Greetings and Salutations.docxCIS407AWk2iLabDefault.aspx        Greetings and Salutations.docx
CIS407AWk2iLabDefault.aspx Greetings and Salutations.docx
 
Lesson 2
Lesson 2Lesson 2
Lesson 2
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
 
Examples from Pune meetup
Examples from Pune meetupExamples from Pune meetup
Examples from Pune meetup
 
Lambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter LawreyLambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter Lawrey
 
J Unit
J UnitJ Unit
J Unit
 
Beyond Unit Testing
Beyond Unit TestingBeyond Unit Testing
Beyond Unit Testing
 
33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests
 
How to make a Load Testing with Visual Studio 2012
How to make a Load Testing with Visual Studio 2012How to make a Load Testing with Visual Studio 2012
How to make a Load Testing with Visual Studio 2012
 
Jdbc tutorial
Jdbc tutorialJdbc tutorial
Jdbc tutorial
 
00_Introduction to Java.ppt
00_Introduction to Java.ppt00_Introduction to Java.ppt
00_Introduction to Java.ppt
 
Java rmi example program with code
Java rmi example program with codeJava rmi example program with code
Java rmi example program with code
 
[xp2013] Narrow Down What to Test
[xp2013] Narrow Down What to Test[xp2013] Narrow Down What to Test
[xp2013] Narrow Down What to Test
 
Structural pattern 3
Structural pattern 3Structural pattern 3
Structural pattern 3
 
The Ring programming language version 1.8 book - Part 95 of 202
The Ring programming language version 1.8 book - Part 95 of 202The Ring programming language version 1.8 book - Part 95 of 202
The Ring programming language version 1.8 book - Part 95 of 202
 
Release with confidence
Release with confidenceRelease with confidence
Release with confidence
 
Innovative Specifications for Better Performance Logging and Monitoring
Innovative Specifications for Better Performance Logging and MonitoringInnovative Specifications for Better Performance Logging and Monitoring
Innovative Specifications for Better Performance Logging and Monitoring
 
Appium Automation with Kotlin
Appium Automation with KotlinAppium Automation with Kotlin
Appium Automation with Kotlin
 
Testing in android
Testing in androidTesting in android
Testing in android
 

More from Max De Marzi

DataDay 2023 Presentation
DataDay 2023 PresentationDataDay 2023 Presentation
DataDay 2023 PresentationMax De Marzi
 
DataDay 2023 Presentation - Notes
DataDay 2023 Presentation - NotesDataDay 2023 Presentation - Notes
DataDay 2023 Presentation - NotesMax De Marzi
 
Developer Intro Deck-PowerPoint - Download for Speaker Notes
Developer Intro Deck-PowerPoint - Download for Speaker NotesDeveloper Intro Deck-PowerPoint - Download for Speaker Notes
Developer Intro Deck-PowerPoint - Download for Speaker NotesMax De Marzi
 
Outrageous Ideas for Graph Databases
Outrageous Ideas for Graph DatabasesOutrageous Ideas for Graph Databases
Outrageous Ideas for Graph DatabasesMax De Marzi
 
Neo4j Training Cypher
Neo4j Training CypherNeo4j Training Cypher
Neo4j Training CypherMax De Marzi
 
Neo4j Training Modeling
Neo4j Training ModelingNeo4j Training Modeling
Neo4j Training ModelingMax De Marzi
 
Neo4j Training Introduction
Neo4j Training IntroductionNeo4j Training Introduction
Neo4j Training IntroductionMax De Marzi
 
Detenga el fraude complejo con Neo4j
Detenga el fraude complejo con Neo4jDetenga el fraude complejo con Neo4j
Detenga el fraude complejo con Neo4jMax De Marzi
 
Data Modeling Tricks for Neo4j
Data Modeling Tricks for Neo4jData Modeling Tricks for Neo4j
Data Modeling Tricks for Neo4jMax De Marzi
 
Fraud Detection and Neo4j
Fraud Detection and Neo4j Fraud Detection and Neo4j
Fraud Detection and Neo4j Max De Marzi
 
Detecion de Fraude con Neo4j
Detecion de Fraude con Neo4jDetecion de Fraude con Neo4j
Detecion de Fraude con Neo4jMax De Marzi
 
Neo4j Data Science Presentation
Neo4j Data Science PresentationNeo4j Data Science Presentation
Neo4j Data Science PresentationMax De Marzi
 
Decision Trees in Neo4j
Decision Trees in Neo4jDecision Trees in Neo4j
Decision Trees in Neo4jMax De Marzi
 
Neo4j y Fraude Spanish
Neo4j y Fraude SpanishNeo4j y Fraude Spanish
Neo4j y Fraude SpanishMax De Marzi
 
Data modeling with neo4j tutorial
Data modeling with neo4j tutorialData modeling with neo4j tutorial
Data modeling with neo4j tutorialMax De Marzi
 
Neo4j Fundamentals
Neo4j FundamentalsNeo4j Fundamentals
Neo4j FundamentalsMax De Marzi
 
Neo4j Presentation
Neo4j PresentationNeo4j Presentation
Neo4j PresentationMax De Marzi
 
Fraud Detection Class Slides
Fraud Detection Class SlidesFraud Detection Class Slides
Fraud Detection Class SlidesMax De Marzi
 
Bootstrapping Recommendations OSCON 2015
Bootstrapping Recommendations OSCON 2015Bootstrapping Recommendations OSCON 2015
Bootstrapping Recommendations OSCON 2015Max De Marzi
 

More from Max De Marzi (20)

DataDay 2023 Presentation
DataDay 2023 PresentationDataDay 2023 Presentation
DataDay 2023 Presentation
 
DataDay 2023 Presentation - Notes
DataDay 2023 Presentation - NotesDataDay 2023 Presentation - Notes
DataDay 2023 Presentation - Notes
 
Developer Intro Deck-PowerPoint - Download for Speaker Notes
Developer Intro Deck-PowerPoint - Download for Speaker NotesDeveloper Intro Deck-PowerPoint - Download for Speaker Notes
Developer Intro Deck-PowerPoint - Download for Speaker Notes
 
Outrageous Ideas for Graph Databases
Outrageous Ideas for Graph DatabasesOutrageous Ideas for Graph Databases
Outrageous Ideas for Graph Databases
 
Neo4j Training Cypher
Neo4j Training CypherNeo4j Training Cypher
Neo4j Training Cypher
 
Neo4j Training Modeling
Neo4j Training ModelingNeo4j Training Modeling
Neo4j Training Modeling
 
Neo4j Training Introduction
Neo4j Training IntroductionNeo4j Training Introduction
Neo4j Training Introduction
 
Detenga el fraude complejo con Neo4j
Detenga el fraude complejo con Neo4jDetenga el fraude complejo con Neo4j
Detenga el fraude complejo con Neo4j
 
Data Modeling Tricks for Neo4j
Data Modeling Tricks for Neo4jData Modeling Tricks for Neo4j
Data Modeling Tricks for Neo4j
 
Fraud Detection and Neo4j
Fraud Detection and Neo4j Fraud Detection and Neo4j
Fraud Detection and Neo4j
 
Detecion de Fraude con Neo4j
Detecion de Fraude con Neo4jDetecion de Fraude con Neo4j
Detecion de Fraude con Neo4j
 
Neo4j Data Science Presentation
Neo4j Data Science PresentationNeo4j Data Science Presentation
Neo4j Data Science Presentation
 
Decision Trees in Neo4j
Decision Trees in Neo4jDecision Trees in Neo4j
Decision Trees in Neo4j
 
Neo4j y Fraude Spanish
Neo4j y Fraude SpanishNeo4j y Fraude Spanish
Neo4j y Fraude Spanish
 
Data modeling with neo4j tutorial
Data modeling with neo4j tutorialData modeling with neo4j tutorial
Data modeling with neo4j tutorial
 
Neo4j Fundamentals
Neo4j FundamentalsNeo4j Fundamentals
Neo4j Fundamentals
 
Neo4j Presentation
Neo4j PresentationNeo4j Presentation
Neo4j Presentation
 
Fraud Detection Class Slides
Fraud Detection Class SlidesFraud Detection Class Slides
Fraud Detection Class Slides
 
Neo4j in Depth
Neo4j in DepthNeo4j in Depth
Neo4j in Depth
 
Bootstrapping Recommendations OSCON 2015
Bootstrapping Recommendations OSCON 2015Bootstrapping Recommendations OSCON 2015
Bootstrapping Recommendations OSCON 2015
 

Recently uploaded

BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdfBASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdfSoniaTolstoy
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformChameera Dedduwage
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityGeoBlogs
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfciinovamais
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdfQucHHunhnh
 
Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Disha Kariya
 
9548086042 for call girls in Indira Nagar with room service
9548086042  for call girls in Indira Nagar  with room service9548086042  for call girls in Indira Nagar  with room service
9548086042 for call girls in Indira Nagar with room servicediscovermytutordmt
 
mini mental status format.docx
mini    mental       status     format.docxmini    mental       status     format.docx
mini mental status format.docxPoojaSen20
 
Disha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfDisha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfchloefrazer622
 
Student login on Anyboli platform.helpin
Student login on Anyboli platform.helpinStudent login on Anyboli platform.helpin
Student login on Anyboli platform.helpinRaunakKeshri1
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationnomboosow
 
social pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajansocial pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajanpragatimahajan3
 
Introduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The BasicsIntroduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The BasicsTechSoup
 
1029 - Danh muc Sach Giao Khoa 10 . pdf
1029 -  Danh muc Sach Giao Khoa 10 . pdf1029 -  Danh muc Sach Giao Khoa 10 . pdf
1029 - Danh muc Sach Giao Khoa 10 . pdfQucHHunhnh
 
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxSayali Powar
 
Sanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfSanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfsanyamsingh5019
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3JemimahLaneBuaron
 
Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingTechSoup
 

Recently uploaded (20)

BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdfBASLIQ CURRENT LOOKBOOK  LOOKBOOK(1) (1).pdf
BASLIQ CURRENT LOOKBOOK LOOKBOOK(1) (1).pdf
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy Reform
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
 
Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..
 
9548086042 for call girls in Indira Nagar with room service
9548086042  for call girls in Indira Nagar  with room service9548086042  for call girls in Indira Nagar  with room service
9548086042 for call girls in Indira Nagar with room service
 
mini mental status format.docx
mini    mental       status     format.docxmini    mental       status     format.docx
mini mental status format.docx
 
Disha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfDisha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdf
 
Student login on Anyboli platform.helpin
Student login on Anyboli platform.helpinStudent login on Anyboli platform.helpin
Student login on Anyboli platform.helpin
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communication
 
social pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajansocial pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajan
 
Introduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The BasicsIntroduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The Basics
 
1029 - Danh muc Sach Giao Khoa 10 . pdf
1029 -  Danh muc Sach Giao Khoa 10 . pdf1029 -  Danh muc Sach Giao Khoa 10 . pdf
1029 - Danh muc Sach Giao Khoa 10 . pdf
 
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptxINDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
 
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
 
Sanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfSanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdf
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3
 
Advance Mobile Application Development class 07
Advance Mobile Application Development class 07Advance Mobile Application Development class 07
Advance Mobile Application Development class 07
 
Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy Consulting
 

PERFORMANCE TESTING WITH GATLING AND NEO4J