master 020a4c95de2c cached
83 files
319.2 KB
76.9k tokens
455 symbols
1 requests
Download .txt
Showing preview only (351K chars total). Download the full file or copy to clipboard to get everything.
Repository: iansrobinson/graph-databases-use-cases
Branch: master
Commit: 020a4c95de2c
Files: 83
Total size: 319.2 KB

Directory structure:
gitextract_0j5cs4sk/

├── .gitignore
├── .gitmodules
├── README.md
├── configuration/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── org/
│                   └── neo4j/
│                       └── graphdatabases/
│                           ├── AccessControlConfig.java
│                           ├── AccessControlWithRelationshipPropertiesConfig.java
│                           ├── LogisticsConfig.java
│                           ├── SimpleSocialNetworkConfig.java
│                           └── SocialNetworkConfig.java
├── data-generation/
│   ├── pom.xml
│   └── src/
│       └── test/
│           └── java/
│               └── org/
│                   └── neo4j/
│                       └── graphdatabases/
│                           └── dataset_builders/
│                               ├── AccessControl.java
│                               ├── AccessControlWithRelationshipProperties.java
│                               ├── Logistics.java
│                               ├── SimpleSocialNetwork.java
│                               ├── SocialNetwork.java
│                               ├── helpers/
│                               │   └── SevenDays.java
│                               ├── properties/
│                               │   ├── DurationOnProjectProperty.java
│                               │   ├── ProjectDuration.java
│                               │   ├── ProjectDurationGenerator.java
│                               │   └── ProjectDurationProperty.java
│                               └── traversers/
│                                   ├── FindAllColleagues.java
│                                   ├── FindColleagues.java
│                                   └── IsCompanyProject.java
├── performance-testing/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── org/
│       │           └── neo4j/
│       │               └── graphdatabases/
│       │                   └── performance_tests/
│       │                       └── testing/
│       │                           ├── DefaultExecutionEngineWrapper.java
│       │                           ├── DoNothingWithTestResults.java
│       │                           ├── MultipleTestRuns.java
│       │                           ├── ParamsGenerator.java
│       │                           ├── PrintTestResults.java
│       │                           ├── QueryType.java
│       │                           ├── ResultFormatter.java
│       │                           ├── ResultsContainSameElementsUnordered.java
│       │                           ├── SingleTest.java
│       │                           ├── SingleTestRunResultHandler.java
│       │                           ├── SingleTestRunResultHandlerFactory.java
│       │                           ├── SysOutWriter.java
│       │                           ├── TakeXTestResults.java
│       │                           └── TestResultsHandler.java
│       └── test/
│           └── java/
│               └── org/
│                   └── neo4j/
│                       └── graphdatabases/
│                           └── performance_tests/
│                               ├── AccessControl.java
│                               ├── AccessControlWithRelationshipProperties.java
│                               ├── Logistics.java
│                               ├── SimpleSocialNetwork.java
│                               ├── SocialNetwork.java
│                               └── testing/
│                                   └── ResultsContainSameElementsUnorderedTest.java
├── pom.xml
└── queries/
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── org/
        │   │       └── neo4j/
        │   │           └── graphdatabases/
        │   │               └── queries/
        │   │                   ├── AccessControlQueries.java
        │   │                   ├── AccessControlWithRelationshipPropertiesQueries.java
        │   │                   ├── EmailQueries.java
        │   │                   ├── LogisticsQueries.java
        │   │                   ├── ShakespeareQueries.java
        │   │                   ├── ShakespeareQueriesUsingAutoIndexes.java
        │   │                   ├── SimpleSocialNetworkQueries.java
        │   │                   ├── SocialNetworkQueries.java
        │   │                   ├── helpers/
        │   │                   │   ├── DbUtils.java
        │   │                   │   ├── ExecutionEngineWrapper.java
        │   │                   │   ├── ExecutionResultIterator.java
        │   │                   │   ├── ExecutionResultsIterator.java
        │   │                   │   ├── IndexNodeByOtherNodeIndexer.java
        │   │                   │   ├── QueryUnionExecutionEngine.java
        │   │                   │   └── QueryUnionExecutionResult.java
        │   │                   ├── server/
        │   │                   │   └── SimpleSocialNetworkExtension.java
        │   │                   ├── testing/
        │   │                   │   ├── IndexParam.java
        │   │                   │   ├── IndexParams.java
        │   │                   │   └── TestOutputWriter.java
        │   │                   └── traversals/
        │   │                       ├── FriendOfAFriendDepth4.java
        │   │                       ├── IndexResources.java
        │   │                       ├── ParcelRouteCalculator.java
        │   │                       └── SimpleParcelRouteCalculator.java
        │   └── resources/
        │       └── META_INF/
        │           └── services/
        │               ├── javax.script.ScriptEngineFactory
        │               └── org.neo4j.server.plugins.ServerPlugin
        └── test/
            └── java/
                └── org/
                    └── neo4j/
                        └── graphdatabases/
                            └── queries/
                                ├── AccessControlQueriesTest.java
                                ├── AccessControlWithRelationshipPropertiesQueriesTest.java
                                ├── EmailQueriesTest.java
                                ├── LogisticsQueriesTest.java
                                ├── ShakespeareQueriesTest.java
                                ├── SimpleSocialNetworkQueriesTest.java
                                ├── SocialNetworkQueriesTest.java
                                ├── helpers/
                                │   ├── Db.java
                                │   ├── IndexNodeByOtherNodeIndexerTest.java
                                │   ├── PrintingExecutionEngineWrapper.java
                                │   └── QueryUnionExecutionEngineTest.java
                                └── server/
                                    └── SimpleSocialNetworkExtensionTest.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
datasets/
examples/
datasets-old/
.DS_Store
build
target
.settings
.project
.idea
.classpath
*.iml


================================================
FILE: .gitmodules
================================================
[submodule "neode"]
	path = neode
	url = https://github.com/jexp/neode.git

================================================
FILE: README.md
================================================
Graph Databases Use Cases
=========================

Example use case implementations from the O'Reilly book [Graph Databases](http://graphdatabases.com/) by [@iansrobinson](http://twitter.com/iansrobinson), [@jimwebber](http://twitter.com/jimwebber) and [@emileifrem](http://twitter.com/emileifrem).

Setup
-----

This repository contains a submodule, _neode_, which is used to build the performance datasets. After cloning the repository, you will need to initialize the submodule:

    git submodule init

and then:

    git submodule update

To run the use case queries:

    mvn clean install

Overview
--------

Queries are developed in a test-driven fashion against small, well-known representative graphs (as described pp.83-87 of the book). The queries can then be run against a much larger, randomly-generated graph (typically, 1-2 million nodes and several million relationships), to test their relative performance. (Note: these performance tests do not test production-like scenarios; rather, they act as a sanity check, ensuring that queries that run fast against a very small graph are still reasonably performant when run against a larger graph.)

The project contains 3 modules (in addition to the _neode_ submodule):

*  _queries_

   Contains the use case queries and the unit tests used to develop the queries.
* _dataset_builders_

   Builds larger, randomly-generated sample datasets.
* _performance_tests_

   Runs the queries against the large sample datasets.

Running the Performance Tests
-----------------------------

First, build the project as described in Setup.

Before you run the performance tests you will need to generate sample datasets. To create a sample dataset run:

    mvn test -pl data-generation -DargLine="-Xms2g -Xmx2g" -Dtest=AccessControl|Logistics|SocialNetwork

For example, to generate a sample dataset for the Logistics queries, run:

    mvn test -pl data-generation -DargLine="-Xms2g -Xmx2g" -Dtest=Logistics

*WARNING:* Building the sample datasets takes a long time (several tens of minutes in some cases).

To execute the performance tests against a sample dataset, run:

    mvn test -pl performance-testing -DargLine="-Xms2g -Xmx2g" -Dtest=AccessControl|Logistics|SocialNetwork


================================================
FILE: configuration/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.neo4j.graphdatabases</groupId>
    <artifactId>configuration</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.1</version>
        </dependency>
    </dependencies>

</project>

================================================
FILE: configuration/src/main/java/org/neo4j/graphdatabases/AccessControlConfig.java
================================================
package org.neo4j.graphdatabases;

public class AccessControlConfig
{
    public static final String STORE_DIR = "../datasets/access-control-no-attributes/";
    public static final String TITLE = "Access Control (fine-grained permission relationships)";
    public static final int NUMBER_OF_ADMINS = 1000;
    public static final int NUMBER_OF_GROUPS = 2000;
    public static final int NUMBER_OF_COMPANIES = 30000;
}


================================================
FILE: configuration/src/main/java/org/neo4j/graphdatabases/AccessControlWithRelationshipPropertiesConfig.java
================================================
package org.neo4j.graphdatabases;

public class AccessControlWithRelationshipPropertiesConfig
{
    public static final String STORE_DIR = "../datasets/access-control/";
    public static final String TITLE = "Access Control";
    public static final int NUMBER_OF_ADMINS = 1000;
    public static final int NUMBER_OF_GROUPS = 2000;
    public static final int NUMBER_OF_COMPANIES = 30000;
}


================================================
FILE: configuration/src/main/java/org/neo4j/graphdatabases/LogisticsConfig.java
================================================
package org.neo4j.graphdatabases;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

public class LogisticsConfig
{
    public static final String TITLE = "Logistics";
    public static final String STORE_DIR = "../datasets/logistics/";
    public static final DateTime START_DATE = new DateTime( 2012, 10, 15, 0, 0, 0, 0, DateTimeZone.UTC );
    public static final int NUMBER_OF_PARCEL_CENTRES = 20;
    public static final int MIN_NUMBER_OF_DELIVERY_BASES_PER_PARCEL_CENTRE = 30;
    public static final int MAX_NUMBER_OF_DELIVERY_BASES_PER_PARCEL_CENTRE = 50;
    public static final int MIN_NUMBER_OF_DELIVERY_AREAS_PER_DELIVERY_BASE = 20;
    public static final int MAX_NUMBER_OF_DELIVERY_AREAS_PER_DELIVERY_BASE = 40;
    public static final int MIN_NUMBER_OF_DELIVERY_SEGMENTS_PER_DELIVERY_AREA = 50;
    public static final int MAX_NUMBER_OF_DELIVERY_SEGMENTS_PER_DELIVERY_AREA = 100;
}


================================================
FILE: configuration/src/main/java/org/neo4j/graphdatabases/SimpleSocialNetworkConfig.java
================================================
package org.neo4j.graphdatabases;

public class SimpleSocialNetworkConfig
{
    public static final String STORE_DIR = "../datasets/simple-social-network/";
    public static final String TITLE = "Simple Social Network";
    public static final int NUMBER_USERS = 20900;
    public static final int MIN_NUMBER_OF_FRIENDS = 50;
    public static final int MAX_NUMBER_OF_FRIENDS = 100;
}


================================================
FILE: configuration/src/main/java/org/neo4j/graphdatabases/SocialNetworkConfig.java
================================================
package org.neo4j.graphdatabases;

public class SocialNetworkConfig
{
    public static final String STORE_DIR = "../datasets/social-network";
    public static final String TITLE = "Social Network";
    public static final int NUMBER_USERS = 1000000;
    public static final int NUMBER_COMPANIES = 10000;
    public static final int NUMBER_TOPICS = 100;
}


================================================
FILE: data-generation/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.neo4j.graphdatabases</groupId>
    <artifactId>data-generation</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <neo4j.version>2.0.1</neo4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-kernel</artifactId>
            <version>${neo4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-enterprise</artifactId>
            <version>${neo4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j.graphdatabases</groupId>
            <artifactId>configuration</artifactId>
            <version>2.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j.graphdatabases</groupId>
            <artifactId>queries</artifactId>
            <version>2.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>neode</groupId>
            <artifactId>neode</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.1</version>
        </dependency>
        <dependency>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/AccessControl.java
================================================
package org.neo4j.graphdatabases.dataset_builders;

import java.io.File;

import org.junit.Test;

import org.neo4j.graphdatabases.AccessControlConfig;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdatabases.queries.traversals.IndexResources;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.kernel.impl.util.FileUtils;
import org.neo4j.neode.Dataset;
import org.neo4j.neode.DatasetManager;
import org.neo4j.neode.NodeCollection;
import org.neo4j.neode.NodeSpecification;
import org.neo4j.neode.Range;
import org.neo4j.neode.RelationshipSpecification;
import org.neo4j.neode.RelationshipUniqueness;
import org.neo4j.neode.logging.SysOutLog;
import org.neo4j.neode.statistics.AsciiDocFormatter;
import org.neo4j.neode.statistics.GraphStatistics;

import static org.neo4j.neode.Range.minMax;
import static org.neo4j.neode.TargetNodesStrategy.create;
import static org.neo4j.neode.TargetNodesStrategy.getExisting;
import static org.neo4j.neode.TargetNodesStrategy.getOrCreate;
import static org.neo4j.neode.properties.Property.indexableProperty;
import static org.neo4j.neode.properties.Property.property;

public class AccessControl
{
    public static final Range GROUPS_PER_ADMIN = minMax( 1, 3 );
    public static final Range ALLOWED_COMPANIES_PER_GROUP = minMax( 10, 50 );
    public static final Range DENIED_COMPANIES_PER_GROUP = minMax( 2, 10 );
    public static final Range EMPLOYEES_PER_COMPANY = minMax( 5, 100 );
    public static final Range ACCOUNTS_PER_EMPLOYEE = minMax( 1, 5 );

    @Test
    public void buildAccessControl() throws Exception
    {
        File dir = new File( AccessControlConfig.STORE_DIR );
        FileUtils.deleteRecursively( dir );

        GraphDatabaseService db = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder( AccessControlConfig.STORE_DIR )
                .setConfig( DbUtils.dbConfig() )
                .newGraphDatabase();
        DatasetManager dsm = new DatasetManager( db, SysOutLog.INSTANCE );

        NodeSpecification adminSpec = dsm.nodeSpecification( "Administrator", indexableProperty( db, "Administrator", "name" ) );
        NodeSpecification groupSpec = dsm.nodeSpecification( "Group", property( "name" ) );
        NodeSpecification companySpec = dsm.nodeSpecification( "Company", indexableProperty( db, "Company", "name" ) );
        NodeSpecification customerSpec = dsm.nodeSpecification( "Employee", indexableProperty( db, "Employee", "name", "Resource"));
        NodeSpecification accountSpec = dsm.nodeSpecification( "Account", indexableProperty( db, "Account", "name", "Resource"));

        RelationshipSpecification member_of = dsm.relationshipSpecification( "MEMBER_OF" );
        RelationshipSpecification allowed_inherit = dsm.relationshipSpecification( "ALLOWED_INHERIT" );
        RelationshipSpecification allowed_do_not_inherit = dsm.relationshipSpecification( "ALLOWED_DO_NOT_INHERIT" );
        RelationshipSpecification denied = dsm.relationshipSpecification( "DENIED" );
        RelationshipSpecification child_of = dsm.relationshipSpecification( "CHILD_OF" );
        RelationshipSpecification works_for = dsm.relationshipSpecification( "WORKS_FOR" );
        RelationshipSpecification has_account = dsm.relationshipSpecification( "HAS_ACCOUNT" );

        Dataset dataset = dsm.newDataset( "Access Control (without using inherit attributes)" );

        NodeCollection administrators = adminSpec.create( AccessControlConfig.NUMBER_OF_ADMINS ).update( dataset );
        NodeCollection groups = administrators.createRelationshipsTo(
                getOrCreate( groupSpec, AccessControlConfig.NUMBER_OF_GROUPS )
                        .numberOfTargetNodes( GROUPS_PER_ADMIN )
                        .relationship( member_of )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies1allowedInherit = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.17 ) )
                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )
                        .relationship( allowed_inherit )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies1allowedDoNotInherit = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.08 ) )
                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )
                        .relationship( allowed_do_not_inherit )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies1denied = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.1 ) )
                        .numberOfTargetNodes( DENIED_COMPANIES_PER_GROUP )
                        .relationship( denied )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies2allowedInherit = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.33 ) )
                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )
                        .relationship( allowed_inherit )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies2allowedDoNotInherit = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.17 ) )
                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )
                        .relationship( allowed_do_not_inherit )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies2denied = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.15 ) )
                        .numberOfTargetNodes( DENIED_COMPANIES_PER_GROUP )
                        .relationship( denied )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies1 = companies1allowedInherit.combine( companies1allowedDoNotInherit ).combine(
                companies1denied );
        NodeCollection companies2 = companies2allowedInherit.combine( companies2allowedDoNotInherit ).combine(
                companies2denied );

        companies2.createRelationshipsTo(
                getExisting( companies1 )
                        .numberOfTargetNodes( 1 )
                        .relationship( child_of )
                        .exactlyOneRelationship() )
                .updateNoReturn( dataset );


        NodeCollection companies = companies1.combine( companies2 );
        NodeCollection employees = companies.createRelationshipsTo(
                create( customerSpec )
                        .numberOfTargetNodes( EMPLOYEES_PER_COMPANY )
                        .relationship( works_for, Direction.INCOMING )
                        .exactlyOneRelationship() )
                .update( dataset, 1000 );

        employees.createRelationshipsTo(
                create( accountSpec )
                        .numberOfTargetNodes( ACCOUNTS_PER_EMPLOYEE )
                        .relationship( has_account, Direction.OUTGOING )
                        .exactlyOneRelationship() )
                .updateNoReturn( dataset );

        dataset.end();

        new IndexResources( db ).execute();

        GraphStatistics.create( db, AccessControlConfig.TITLE )
                .describeTo( new AsciiDocFormatter( SysOutLog.INSTANCE ) );

        db.shutdown();
    }

    private int percentageOf( int i, double percentage )
    {
        return (int) (i * percentage);
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/AccessControlWithRelationshipProperties.java
================================================
package org.neo4j.graphdatabases.dataset_builders;

import java.io.File;
import java.util.Random;

import org.junit.Test;

import org.neo4j.graphdatabases.AccessControlWithRelationshipPropertiesConfig;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdatabases.queries.traversals.IndexResources;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.PropertyContainer;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.kernel.impl.util.FileUtils;
import org.neo4j.neode.Dataset;
import org.neo4j.neode.DatasetManager;
import org.neo4j.neode.NodeCollection;
import org.neo4j.neode.NodeSpecification;
import org.neo4j.neode.Range;
import org.neo4j.neode.RelationshipSpecification;
import org.neo4j.neode.RelationshipUniqueness;
import org.neo4j.neode.logging.SysOutLog;
import org.neo4j.neode.properties.Property;
import org.neo4j.neode.statistics.AsciiDocFormatter;
import org.neo4j.neode.statistics.GraphStatistics;

import static org.neo4j.neode.Range.minMax;
import static org.neo4j.neode.TargetNodesStrategy.create;
import static org.neo4j.neode.TargetNodesStrategy.getExisting;
import static org.neo4j.neode.TargetNodesStrategy.getOrCreate;
import static org.neo4j.neode.properties.Property.indexableProperty;
import static org.neo4j.neode.properties.Property.property;

public class AccessControlWithRelationshipProperties
{
    public static final Range GROUPS_PER_ADMIN = minMax( 1, 3 );
    public static final Range ALLOWED_COMPANIES_PER_GROUP = minMax( 10, 50 );
    public static final Range DENIED_COMPANIES_PER_GROUP = minMax( 2, 10 );
    public static final Range EMPLOYEES_PER_COMPANY = minMax( 5, 100 );
    public static final Range ACCOUNTS_PER_EMPLOYEE = minMax( 1, 5 );

    @Test
    public void buildAccessControl() throws Exception
    {
        File dir = new File( AccessControlWithRelationshipPropertiesConfig.STORE_DIR );
        FileUtils.deleteRecursively( dir );

        GraphDatabaseService db = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder( AccessControlWithRelationshipPropertiesConfig.STORE_DIR )
                .setConfig( DbUtils.dbConfig() )
                .newGraphDatabase();
        DatasetManager dsm = new DatasetManager( db, SysOutLog.INSTANCE );

        NodeSpecification adminSpec = dsm.nodeSpecification( "Administrator", indexableProperty( db, "Administrator", "name" ) );
        NodeSpecification groupSpec = dsm.nodeSpecification( "Group", property( "name" ) );
        NodeSpecification companySpec = dsm.nodeSpecification( "Company", indexableProperty( db, "Company", "name" ) );
        NodeSpecification customerSpec = dsm.nodeSpecification( "Employee", indexableProperty( db, "Employee", "name", "Resource"));
        NodeSpecification accountSpec = dsm.nodeSpecification( "Account", indexableProperty( db, "Account", "name", "Resource"));

        Property inheritProperty = new Property()
        {
            private final Random random = new Random();

            @Override
            public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,
                                     String label, int iteration )
            {
                int i = random.nextInt( 3 );
                boolean value = i < 2;
                propertyContainer.setProperty( "inherit", value );
            }
        };

        RelationshipSpecification member_of = dsm.relationshipSpecification( "MEMBER_OF" );
        RelationshipSpecification allowed = dsm.relationshipSpecification( "ALLOWED", inheritProperty );
        RelationshipSpecification denied = dsm.relationshipSpecification( "DENIED" );
        RelationshipSpecification child_of = dsm.relationshipSpecification( "CHILD_OF" );
        RelationshipSpecification works_for = dsm.relationshipSpecification( "WORKS_FOR" );
        RelationshipSpecification has_account = dsm.relationshipSpecification( "HAS_ACCOUNT" );

        Dataset dataset = dsm.newDataset( AccessControlWithRelationshipPropertiesConfig.TITLE );

        NodeCollection administrators = adminSpec.create( AccessControlWithRelationshipPropertiesConfig
                .NUMBER_OF_ADMINS ).update( dataset );
        NodeCollection groups = administrators.createRelationshipsTo(
                getOrCreate( groupSpec, AccessControlWithRelationshipPropertiesConfig.NUMBER_OF_GROUPS )
                        .numberOfTargetNodes( GROUPS_PER_ADMIN )
                        .relationship( member_of )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies1allowed = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlWithRelationshipPropertiesConfig
                        .NUMBER_OF_COMPANIES, 0.25 ) )
                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )
                        .relationship( allowed )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies1denied = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlWithRelationshipPropertiesConfig
                        .NUMBER_OF_COMPANIES, 0.1 ) )
                        .numberOfTargetNodes( DENIED_COMPANIES_PER_GROUP )
                        .relationship( denied )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies2allowed = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlWithRelationshipPropertiesConfig
                        .NUMBER_OF_COMPANIES, 0.50 ) )
                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )
                        .relationship( allowed )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies2denied = groups.createRelationshipsTo(
                getOrCreate( companySpec, percentageOf( AccessControlWithRelationshipPropertiesConfig
                        .NUMBER_OF_COMPANIES, 0.15 ) )
                        .numberOfTargetNodes( DENIED_COMPANIES_PER_GROUP )
                        .relationship( denied )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        NodeCollection companies1 = companies1allowed.combine( companies1denied );
        NodeCollection companies2 = companies2allowed.combine( companies2denied );

        companies2.createRelationshipsTo(
                getExisting( companies1 )
                        .numberOfTargetNodes( 1 )
                        .relationship( child_of )
                        .exactlyOneRelationship() )
                .updateNoReturn( dataset );


        NodeCollection companies = companies1.combine( companies2 );
        NodeCollection employees = companies.createRelationshipsTo(
                create( customerSpec )
                        .numberOfTargetNodes( EMPLOYEES_PER_COMPANY )
                        .relationship( works_for, Direction.INCOMING )
                        .exactlyOneRelationship() )
                .update( dataset, 1000 );

        employees.createRelationshipsTo(
                create( accountSpec )
                        .numberOfTargetNodes( ACCOUNTS_PER_EMPLOYEE )
                        .relationship( has_account, Direction.OUTGOING )
                        .exactlyOneRelationship() )
                .updateNoReturn( dataset );

        dataset.end();

        new IndexResources( db ).execute();

        GraphStatistics.create( db, AccessControlWithRelationshipPropertiesConfig.TITLE )
                .describeTo( new AsciiDocFormatter( SysOutLog.INSTANCE ) );

        db.shutdown();

    }

    private int percentageOf( int i, double percentage )
    {
        return (int) (i * percentage);
    }

}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/Logistics.java
================================================
package org.neo4j.graphdatabases.dataset_builders;

import java.io.File;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Random;

import org.joda.time.Interval;
import org.junit.Test;

import org.neo4j.graphdatabases.LogisticsConfig;
import org.neo4j.graphdatabases.dataset_builders.helpers.SevenDays;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.PropertyContainer;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.kernel.impl.util.FileUtils;
import org.neo4j.neode.Dataset;
import org.neo4j.neode.DatasetManager;
import org.neo4j.neode.NodeCollection;
import org.neo4j.neode.NodeSpecification;
import org.neo4j.neode.logging.SysOutLog;
import org.neo4j.neode.properties.Property;
import org.neo4j.neode.statistics.AsciiDocFormatter;
import org.neo4j.neode.statistics.GraphStatistics;

import static org.neo4j.neode.Range.exactly;
import static org.neo4j.neode.Range.minMax;
import static org.neo4j.neode.TargetNodesStrategy.create;
import static org.neo4j.neode.TargetNodesStrategy.getOrCreate;
import static org.neo4j.neode.properties.Property.indexableProperty;

public class Logistics
{
    @Test
    public void buildLogistics() throws Exception
    {
        File dir = new File( LogisticsConfig.STORE_DIR );
        FileUtils.deleteRecursively( dir );

        GraphDatabaseService db = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder( LogisticsConfig.STORE_DIR )
                .setConfig( DbUtils.dbConfig() )
                .newGraphDatabase();
        DatasetManager dsm = new DatasetManager( db, SysOutLog.INSTANCE );

        NodeSpecification parcelCentreSpec = dsm.nodeSpecification( "ParcelCentre",
                indexableProperty( db, "ParcelCentre", "name", "Location" ) );
        NodeSpecification deliveryBaseSpec = dsm.nodeSpecification( "DeliveryBase",
                indexableProperty( db, "DeliveryBase","name", "Location" ) );
        NodeSpecification deliveryAreaSpec = dsm.nodeSpecification( "DeliveryArea",
                indexableProperty( db, "DeliveryArea", "name", "Location" ) );
        NodeSpecification deliverySegmentSpec = dsm.nodeSpecification( "DeliverySegment",
                indexableProperty( db, "DeliverySegment", "name", "Location" ) );

        Property costProperty = new CostProperty();

        Dataset dataset = dsm.newDataset( LogisticsConfig.TITLE );

        NodeCollection parcelCentres = parcelCentreSpec.create( LogisticsConfig.NUMBER_OF_PARCEL_CENTRES ).update(
                dataset );

        NodeCollection deliveryBases = parcelCentres.createRelationshipsTo(
                getOrCreate( deliveryBaseSpec, 400 )
                        .numberOfTargetNodes( minMax(
                                LogisticsConfig.MIN_NUMBER_OF_DELIVERY_BASES_PER_PARCEL_CENTRE,
                                LogisticsConfig.MAX_NUMBER_OF_DELIVERY_BASES_PER_PARCEL_CENTRE ) )
                        .relationship( dsm.relationshipSpecification( "CONNECTED_TO",
                                new IntervalProperty( 2 ),
                                costProperty ) )
                        .relationshipConstraints( exactly( 2 ) ) )
                .update( dataset );

        NodeCollection deliveryAreas = deliveryBases.createRelationshipsTo(
                create( deliveryAreaSpec )
                        .numberOfTargetNodes( minMax(
                                LogisticsConfig.MIN_NUMBER_OF_DELIVERY_AREAS_PER_DELIVERY_BASE,
                                LogisticsConfig.MAX_NUMBER_OF_DELIVERY_AREAS_PER_DELIVERY_BASE ) )
                        .relationship( dsm.relationshipSpecification( "DELIVERY_ROUTE",
                                new IntervalProperty( 3 ),
                                costProperty ) )
                        .relationshipConstraints( exactly( 3 ) ) )
                .update( dataset );
        deliveryAreas.createRelationshipsTo(
                create( deliverySegmentSpec )
                        .numberOfTargetNodes( minMax(
                                LogisticsConfig.MIN_NUMBER_OF_DELIVERY_SEGMENTS_PER_DELIVERY_AREA,
                                LogisticsConfig.MAX_NUMBER_OF_DELIVERY_SEGMENTS_PER_DELIVERY_AREA ) )
                        .relationship( dsm.relationshipSpecification( "DELIVERY_ROUTE",
                                new IntervalProperty( 3 ),
                                costProperty ) )
                        .relationshipConstraints( exactly( 3 ) ) )
                .updateNoReturn( dataset, 1000 );

        dataset.end();

        GraphStatistics.create( db, LogisticsConfig.TITLE )
                .describeTo( new AsciiDocFormatter( SysOutLog.INSTANCE ) );

        db.shutdown();

    }

    private static class IntervalProperty extends Property
    {
        private final int numberOfIntervals;
        private final SevenDays sevenDays = new SevenDays( LogisticsConfig.START_DATE );

        private Iterator<Interval> intervals;
        private int counter;

        private IntervalProperty( int numberOfIntervals )
        {
            this.numberOfIntervals = numberOfIntervals;
            this.counter = numberOfIntervals;
        }

        @Override
        public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,
                                 String label, int iteration )
        {
            if ( counter++ >= numberOfIntervals )
            {
                intervals = sevenDays.calculateIntervals( numberOfIntervals ).iterator();
                counter = 1;
            }

            try
            {
                Interval nextInterval = intervals.next();
                propertyContainer.setProperty( "start_date", nextInterval.getStartMillis() );
                propertyContainer.setProperty( "end_date", nextInterval.getEndMillis() );
            }
            catch ( NoSuchElementException e )
            {
                throw new IllegalStateException( String.format( "counter: %s, numberOfIntervals: %s, iteration: %s",
                        counter, numberOfIntervals, iteration ) );
            }
        }
    }

    private static class CostProperty extends Property
    {
        private final Random random = new Random();

        @Override
        public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,
                                 String s, int i )
        {
            propertyContainer.setProperty( "cost", random.nextInt( 10 ) + 1 );
        }
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/SimpleSocialNetwork.java
================================================
package org.neo4j.graphdatabases.dataset_builders;

import java.io.File;

import org.junit.Test;

import org.neo4j.graphdatabases.SimpleSocialNetworkConfig;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.kernel.impl.util.FileUtils;
import org.neo4j.neode.Dataset;
import org.neo4j.neode.DatasetManager;
import org.neo4j.neode.NodeCollection;
import org.neo4j.neode.NodeSpecification;
import org.neo4j.neode.RelationshipSpecification;
import org.neo4j.neode.logging.Log;
import org.neo4j.neode.logging.SysOutLog;
import org.neo4j.neode.statistics.AsciiDocFormatter;
import org.neo4j.neode.statistics.GraphStatistics;

import static org.neo4j.neode.Range.minMax;
import static org.neo4j.neode.RelationshipUniqueness.BOTH_DIRECTIONS;
import static org.neo4j.neode.TargetNodesStrategy.getExisting;
import static org.neo4j.neode.properties.Property.indexableProperty;

public class SimpleSocialNetwork
{
    @Test
    public void buildSocialNetwork() throws Exception
    {
        File dir = new File( SimpleSocialNetworkConfig.STORE_DIR );
        FileUtils.deleteRecursively( dir );

        GraphDatabaseService db = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder( SimpleSocialNetworkConfig.STORE_DIR )
                .setConfig( DbUtils.dbConfig() )
                .newGraphDatabase();
        createSampleDataset( db );

        GraphStatistics.create( db, SimpleSocialNetworkConfig.TITLE )
                .describeTo( new AsciiDocFormatter( SysOutLog.INSTANCE ) );

        db.shutdown();
    }

    private void createSampleDataset( GraphDatabaseService db )
    {
        DatasetManager dsm = new DatasetManager( db, new Log()
        {
            @Override
            public void write( String value )
            {
                System.out.println( value );
            }
        } );

        NodeSpecification userSpec = dsm.nodeSpecification(
                "User", indexableProperty( db, "User", "name" ) );
        RelationshipSpecification friend =
                dsm.relationshipSpecification( "FRIEND" );

        Dataset dataset =
                dsm.newDataset( "Simple social network example" );

        NodeCollection users =
                userSpec.create( SimpleSocialNetworkConfig.NUMBER_USERS )
                        .update( dataset );

        users.createRelationshipsTo(
                getExisting( users )
                        .numberOfTargetNodes( minMax( SimpleSocialNetworkConfig.MIN_NUMBER_OF_FRIENDS,
                                SimpleSocialNetworkConfig.MAX_NUMBER_OF_FRIENDS ) )
                        .relationship( friend )
                        .relationshipConstraints( BOTH_DIRECTIONS ) )
                .updateNoReturn( dataset, 20000 );

        dataset.end();
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/SocialNetwork.java
================================================
package org.neo4j.graphdatabases.dataset_builders;

import java.io.File;

import org.junit.Test;

import org.neo4j.graphdatabases.SocialNetworkConfig;
import org.neo4j.graphdatabases.dataset_builders.properties.DurationOnProjectProperty;
import org.neo4j.graphdatabases.dataset_builders.properties.ProjectDurationProperty;
import org.neo4j.graphdatabases.dataset_builders.traversers.FindAllColleagues;
import org.neo4j.graphdatabases.dataset_builders.traversers.IsCompanyProject;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.kernel.Traversal;
import org.neo4j.kernel.Uniqueness;
import org.neo4j.kernel.impl.util.FileUtils;
import org.neo4j.neode.Dataset;
import org.neo4j.neode.DatasetManager;
import org.neo4j.neode.NodeCollection;
import org.neo4j.neode.NodeSpecification;
import org.neo4j.neode.RelationshipSpecification;
import org.neo4j.neode.RelationshipUniqueness;
import org.neo4j.neode.logging.SysOutLog;
import org.neo4j.neode.properties.Property;
import org.neo4j.neode.statistics.AsciiDocFormatter;
import org.neo4j.neode.statistics.GraphStatistics;

import static org.neo4j.graphdb.DynamicRelationshipType.withName;
import static org.neo4j.neode.GraphQuery.traversal;
import static org.neo4j.neode.Range.minMax;
import static org.neo4j.neode.TargetNodesStrategy.getExisting;
import static org.neo4j.neode.TargetNodesStrategy.getOrCreate;
import static org.neo4j.neode.TargetNodesStrategy.queryBasedGetOrCreate;
import static org.neo4j.neode.probabilities.ProbabilityDistribution.flatDistribution;
import static org.neo4j.neode.probabilities.ProbabilityDistribution.normalDistribution;
import static org.neo4j.neode.properties.Property.indexableProperty;
import static org.neo4j.neode.properties.Property.property;

public class SocialNetwork
{
    @Test
    public void buildSocialNetwork() throws Exception
    {
        File dir = new File( SocialNetworkConfig.STORE_DIR );
        FileUtils.deleteRecursively( dir );

        GraphDatabaseService db = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder( SocialNetworkConfig.STORE_DIR )
                .setConfig( DbUtils.dbConfig() )
                .newGraphDatabase();
        DatasetManager dsm = new DatasetManager( db, SysOutLog.INSTANCE );

        TraversalDescription findCompanyProjects = createFindCompanyProjectsTraversalDescription();
        Property projectDuration = new ProjectDurationProperty();
        Property durationOnProject = new DurationOnProjectProperty();

        NodeSpecification userSpec = dsm.nodeSpecification( "User", indexableProperty(db, "User", "name" ) );
        NodeSpecification topicSpec = dsm.nodeSpecification( "Topic", indexableProperty(db, "Topic", "name" ) );
        NodeSpecification companySpec = dsm.nodeSpecification( "Company", indexableProperty(db, "company", "name" ) );
        NodeSpecification projectSpec = dsm.nodeSpecification( "Project",
                property( "name" ),
                projectDuration );

        RelationshipSpecification interested_in = dsm.relationshipSpecification( "INTERESTED_IN" );
        RelationshipSpecification works_for = dsm.relationshipSpecification( "WORKS_FOR" );
        RelationshipSpecification worked_on = dsm.relationshipSpecification( "WORKED_ON", durationOnProject );
        RelationshipSpecification worked_with = dsm.relationshipSpecification( "WORKED_WITH" );

        Dataset dataset = dsm.newDataset( "Social network example" );

        NodeCollection users = userSpec.create( SocialNetworkConfig.NUMBER_USERS ).update( dataset );

        users.createRelationshipsTo(
                getOrCreate( topicSpec, SocialNetworkConfig.NUMBER_TOPICS, normalDistribution() )
                        .numberOfTargetNodes( minMax( 1, 3 ) )
                        .relationship( interested_in )
                        .exactlyOneRelationship() )
                .updateNoReturn( dataset );

        users.createRelationshipsTo(
                getOrCreate( companySpec, SocialNetworkConfig.NUMBER_COMPANIES, flatDistribution() )
                        .numberOfTargetNodes( 1 )
                        .relationship( works_for )
                        .exactlyOneRelationship() )
                .updateNoReturn( dataset );

        NodeCollection allProjects = users.createRelationshipsTo(
                queryBasedGetOrCreate( projectSpec, traversal( findCompanyProjects ), 5.0 )
                        .numberOfTargetNodes( minMax( 1, 5 ), normalDistribution() )
                        .relationship( worked_on )
                        .exactlyOneRelationship() )
                .update( dataset );

        users.approxPercentage( 30 ).createRelationshipsTo(
                getExisting( allProjects )
                        .numberOfTargetNodes( minMax( 1, 2 ), normalDistribution() )
                        .relationship( worked_on )
                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )
                .update( dataset );

        users.createRelationshipsTo(
                getExisting( new FindAllColleagues() )
                        .numberOfTargetNodes( 1 )
                        .relationship( worked_with )
                        .exactlyOneRelationship() )
                .updateNoReturn( dataset, 5000 );


        dataset.end();

        GraphStatistics.create( db, SocialNetworkConfig.TITLE ).describeTo(
                new AsciiDocFormatter( SysOutLog.INSTANCE ) );

        db.shutdown();
    }

    private TraversalDescription createFindCompanyProjectsTraversalDescription()
    {
        return Traversal.description()
                .depthFirst()
                .uniqueness( Uniqueness.NODE_GLOBAL )
                .relationships( withName( "WORKS_FOR" ), Direction.BOTH )
                .relationships( withName( "WORKED_ON" ), Direction.OUTGOING )
                .evaluator( new IsCompanyProject() );
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/helpers/SevenDays.java
================================================
package org.neo4j.graphdatabases.dataset_builders.helpers;

import static java.util.Arrays.asList;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

import org.joda.time.DateTime;
import org.joda.time.Interval;

public class SevenDays
{
    private final DateTime start;
    private final Random random;

    @SuppressWarnings( "unchecked" )
    private static final List<List<Integer>> days = asList(
            asList( 1, 1, 5 ),
            asList( 1, 2, 4 ),
            asList( 1, 3, 3 ),
            asList( 2, 2, 3 ) );

    public SevenDays( DateTime start )
    {
        this.start = start;
        this.random = new Random();
    }

    public Iterable<Interval> calculateIntervals( int numberOfIntervals )
    {
        if ( numberOfIntervals < 1 || numberOfIntervals > 3 )
        {
            throw new IllegalArgumentException( "numberOfIntervals must be 1 or 3" );
        }

        List<Interval> intervals = new ArrayList<Interval>();

        if ( numberOfIntervals == 1 )
        {
            intervals.add( new Interval( start, start.plusDays( 7 ) ) );
        }
        else if ( numberOfIntervals == 2 )
        {
            int numberOfDays = random.nextInt( 6 ) + 1;
            DateTime mid = start.plusDays( numberOfDays );
            intervals.add( new Interval( start, mid ) );
            intervals.add( new Interval( mid, start.plusDays( 7 ) ) );
        }
        else
        {
            int i = random.nextInt( days.size() );
            List<Integer> plusDays = days.get( i );
            Collections.shuffle( plusDays, random );

            DateTime mid1 = start.plusDays( plusDays.get( 0 ) );
            DateTime mid2 = mid1.plusDays( plusDays.get( 1 ) );

            intervals.add( new Interval( start, mid1 ) );
            intervals.add( new Interval( mid1, mid2 ) );
            intervals.add( new Interval( mid2, start.plusDays( 7 ) ) );
        }

        return intervals;
    }

}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/DurationOnProjectProperty.java
================================================
package org.neo4j.graphdatabases.dataset_builders.properties;

import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.PropertyContainer;
import org.neo4j.graphdb.Relationship;
import org.neo4j.neode.properties.Property;

public class DurationOnProjectProperty extends Property
{
    @Override
    public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,
                             String s, int i )
    {
        Node endNode = ((Relationship) propertyContainer).getEndNode();

        Long startDateTime = (Long) endNode.getProperty( "start_date" );
        Long endDateTime = (Long) endNode.getProperty( "end_date" );
        ProjectDuration projectDuration = new ProjectDuration( startDateTime, endDateTime );
        ProjectDuration durationOnProject = projectDuration.getSubDuration();

        propertyContainer.setProperty( "duration", durationOnProject.toString() );
        propertyContainer.setProperty( "start_date", durationOnProject.getStartDateMs() );
        propertyContainer.setProperty( "end_date", durationOnProject.getEndDateMs() );
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDuration.java
================================================
package org.neo4j.graphdatabases.dataset_builders.properties;

import static org.neo4j.neode.Range.minMax;
import static org.neo4j.neode.probabilities.ProbabilityDistribution.normalDistribution;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Duration;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.neo4j.neode.probabilities.ProbabilityDistribution;

public class ProjectDuration
{
    private static final ProbabilityDistribution normalDistribution = normalDistribution();
    private static final DateTimeFormatter fmt = DateTimeFormat.forPattern( "dd-MM-yyyy" );

    private final Long startMs;
    private final Long endMs;

    public ProjectDuration( Long startMs, Long endMs )
    {
        this.endMs = endMs;
        this.startMs = startMs;
    }

    public Long getStartDateMs()
    {
        return startMs;
    }

    public Long getEndDateMs()
    {
        return endMs;
    }

    public ProjectDuration getSubDuration()
    {
        DateTime startDateTime = new DateTime( startMs, DateTimeZone.UTC );
        DateTime endDateTime = new DateTime( endMs, DateTimeZone.UTC );

        int durationInDays = (int) new Duration( startDateTime, endDateTime ).getStandardDays();
        int offsetDaysFromStart = normalDistribution.generateSingle( minMax( 0, (int) (durationInDays * 0.75) ) );
        int remainingDays = durationInDays - offsetDaysFromStart;
        int subDurationInDays = (int) ((remainingDays * 0.75) +
                (normalDistribution.generateSingle( minMax( 0, (int) (remainingDays * (0.25)) ) )));

        DateTime subDurationStartDateTime = startDateTime.plusDays( offsetDaysFromStart );
        DateTime subDurationEndDateTime = subDurationStartDateTime.plusDays( subDurationInDays );

        return new ProjectDuration( subDurationStartDateTime.getMillis(), subDurationEndDateTime.getMillis() );
    }

    public String toString()
    {
        return "Start: " + new DateTime( startMs, DateTimeZone.UTC ).toString( fmt )
                + ", End : " + new DateTime( endMs, DateTimeZone.UTC ).toString( fmt );
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDurationGenerator.java
================================================
package org.neo4j.graphdatabases.dataset_builders.properties;

import java.util.Random;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

public class ProjectDurationGenerator
{
    private final static DateTime durationLowerLimit = new DateTime(2000, 1, 1, 0, 0, DateTimeZone.UTC);
    private final Random rand = new Random();

    public ProjectDuration getNextProjectDuration()
    {
        DateTime startDateTime = durationLowerLimit.plusMonths( rand.nextInt( 9 *12 ) );
        DateTime endDateTime = startDateTime.plusMonths( 3 + (rand.nextInt(33)) ) ;
        return new ProjectDuration( startDateTime.getMillis(), endDateTime.getMillis() );
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDurationProperty.java
================================================
package org.neo4j.graphdatabases.dataset_builders.properties;

import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.PropertyContainer;
import org.neo4j.neode.properties.Property;

public class ProjectDurationProperty extends Property
{
    private final ProjectDurationGenerator generator = new ProjectDurationGenerator();

    @Override
    public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,
                             String s, int i )
    {
        ProjectDuration projectDuration = generator.getNextProjectDuration();
        propertyContainer.setProperty( "duration", projectDuration.toString() );
        propertyContainer.setProperty( "start_date", projectDuration.getStartDateMs() );
        propertyContainer.setProperty( "end_date", projectDuration.getEndDateMs() );
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/FindAllColleagues.java
================================================
package org.neo4j.graphdatabases.dataset_builders.traversers;

import static org.neo4j.graphdb.DynamicRelationshipType.withName;

import org.neo4j.graphalgo.GraphAlgoFactory;
import org.neo4j.graphalgo.PathFinder;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Path;
import org.neo4j.graphdb.PathExpander;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.RelationshipExpander;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.traversal.BranchState;
import org.neo4j.graphdb.traversal.Evaluation;
import org.neo4j.graphdb.traversal.Evaluator;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.kernel.Traversal;
import org.neo4j.kernel.Uniqueness;
import org.neo4j.neode.GraphQuery;

public class FindAllColleagues extends GraphQuery
{
    private static final RelationshipType WORKED_ON = withName( "WORKED_ON" );
    private static PathFinder<Path> workedWithPathFinder = GraphAlgoFactory.shortestPath( Traversal.expanderForTypes( withName( "WORKED_WITH" )), 1 );
    private static final TraversalDescription traversal = Traversal.description()
            .depthFirst()
            .uniqueness( Uniqueness.NODE_GLOBAL )
            .expand( new WorkOnPathExpander() )
            .evaluator( new Evaluator()
            {
                @Override
                public Evaluation evaluate( Path path )
                {
                    if ( path.length() == 2 )
                    {
                        if ( workedWithPathFinder.findSinglePath( path.startNode(), path.endNode() ) == null)
                        {
                            return Evaluation.INCLUDE_AND_PRUNE;
                        }
                        else
                        {
                            return Evaluation.EXCLUDE_AND_PRUNE;
                        }
                    }
                    return Evaluation.EXCLUDE_AND_CONTINUE;
                }
            } );

    @Override
    public Iterable<Node> execute( Node node )
    {
        return traversal.traverse( node ).nodes();
    }

    private static class WorkOnPathExpander implements PathExpander<Object>
    {
        @Override
        public Iterable<Relationship> expand( Path path, BranchState<Object> branchState )
        {
            if (path.length() == 0)
            {
                return path.endNode().getRelationships( WORKED_ON, Direction.OUTGOING );
            }
            else
            {
                return path.endNode().getRelationships( WORKED_ON, Direction.INCOMING );
            }
        }

        @Override
        public PathExpander<Object> reverse()
        {
            return null;
        }
    }
}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/FindColleagues.java
================================================
package org.neo4j.graphdatabases.dataset_builders.traversers;

import static org.neo4j.graphdb.DynamicRelationshipType.withName;

import java.util.ArrayList;
import java.util.List;

import org.joda.time.Duration;
import org.joda.time.Interval;
import org.joda.time.Period;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Path;
import org.neo4j.graphdb.PathExpander;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.traversal.BranchState;
import org.neo4j.graphdb.traversal.Evaluation;
import org.neo4j.graphdb.traversal.Evaluator;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.kernel.Traversal;
import org.neo4j.kernel.Uniqueness;
import org.neo4j.neode.GraphQuery;

public class FindColleagues extends GraphQuery
{
    private static final TraversalDescription traversal = Traversal.description()
            .depthFirst()
            .uniqueness( Uniqueness.NODE_GLOBAL )
            .relationships( withName( "WORKED_ON" ), Direction.BOTH )
            .expand( new OverlappingWorkedOnRels() )
            .evaluator( new IsColleague() );

    @Override
    public Iterable<Node> execute( Node node )
    {
        return traversal.traverse( node ).nodes();
    }

    private static class IsColleague implements Evaluator
    {
        @Override
        public Evaluation evaluate( Path path )
        {
            if ( path.length() == 2 )
            {
                return Evaluation.INCLUDE_AND_PRUNE;
            }

            return Evaluation.EXCLUDE_AND_CONTINUE;
        }
    }

    private static class OverlappingWorkedOnRels implements PathExpander<Interval>
    {
        private static final DynamicRelationshipType WORKED_ON = withName( "WORKED_ON" );
        private static final Duration ONE_YEAR = new Period( 0, 0, 0, 365, 0, 0, 0, 0 ).toStandardDuration();


        @Override
        public Iterable<Relationship> expand( Path path, BranchState<Interval> branchState )
        {

            if ( path.length() == 1 )
            {
                List<Relationship> rels = new ArrayList<Relationship>();


                Long start_date = (Long) path.lastRelationship().getProperty( "start_date" );
                Long end_date = (Long) path.lastRelationship().getProperty( "end_date" );
                Interval interval = new Interval( start_date, end_date );


                for ( Relationship rel : path.endNode().getRelationships( WORKED_ON, Direction.INCOMING ) )
                {
                    if ( !rel.equals( path.lastRelationship() ) )
                    {
                        Long rel_start_date = (Long) rel.getProperty( "start_date" );
                        Long rel_end_date = (Long) rel.getProperty( "end_date" );
                        Interval rel_interval = new Interval( rel_start_date, rel_end_date );

                        if ( intervalsOverlapByDuration( interval, rel_interval ) )
                        {
                            rels.add( rel );
                        }
                    }
                }

                return rels;
            }

            return path.endNode().getRelationships( WORKED_ON, Direction.OUTGOING );

        }

        @Override
        public PathExpander<Interval> reverse()
        {
            return null;
        }

        private boolean intervalsOverlapByDuration( Interval myInterval, Interval otherInterval )
        {
            return otherInterval.overlaps( myInterval ) &&
                    otherInterval.overlap( myInterval ).toDuration().compareTo( ONE_YEAR ) > 0;
        }
    }

}


================================================
FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/IsCompanyProject.java
================================================
package org.neo4j.graphdatabases.dataset_builders.traversers;

import static org.neo4j.graphdb.DynamicRelationshipType.withName;

import org.neo4j.graphdb.Path;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.traversal.Evaluation;
import org.neo4j.graphdb.traversal.Evaluator;

public class IsCompanyProject implements Evaluator
{
    private static final RelationshipType WORKED_ON = withName( "WORKED_ON" );

    @Override
    public Evaluation evaluate( Path path )
    {
        if ( path.length() == 0 )
        {
            return Evaluation.EXCLUDE_AND_CONTINUE;
        }
        if ( path.lastRelationship().isType( WORKED_ON ) )
        {
            return Evaluation.INCLUDE_AND_PRUNE;
        }
        return Evaluation.EXCLUDE_AND_CONTINUE;
    }
}


================================================
FILE: performance-testing/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.neo4j.graphdatabases</groupId>
    <artifactId>performance-testing</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <neo4j.version>2.0.1</neo4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-enterprise</artifactId>
            <version>${neo4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j.graphdatabases</groupId>
            <artifactId>queries</artifactId>
            <version>2.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j.graphdatabases</groupId>
            <artifactId>configuration</artifactId>
            <version>2.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>neode</groupId>
            <artifactId>neode</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/DefaultExecutionEngineWrapper.java
================================================
package org.neo4j.graphdatabases.performance_tests.testing;

import java.util.Map;

import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;
import org.neo4j.graphdb.GraphDatabaseService;

public class DefaultExecutionEngineWrapper implements ExecutionEngineWrapper
{
    private final ExecutionEngine executionEngine;

    public DefaultExecutionEngineWrapper( GraphDatabaseService db )
    {
        this.executionEngine = new ExecutionEngine( db );
    }

    @Override
    public ExecutionResult execute( String query, Map<String, Object> params )
    {
        return executionEngine.execute( query, params );
    }

    @Override
    public ExecutionResult execute( String query, Map<String, Object> params, int index )
    {
        return execute( query, params );
    }
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/DoNothingWithTestResults.java
================================================
package org.neo4j.graphdatabases.performance_tests.testing;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public class DoNothingWithTestResults implements TestResultsHandler
{
    public static TestResultsHandler doNothing()
    {
        return new DoNothingWithTestResults();
    }

    @Override
    public void handle( String queryType, Object results, SingleTestRunResultHandler singleTestRunResultHandler )
    {
        //Do nothing
    }

    @Override
    public void writeTo( TestOutputWriter writer )
    {
        // Do nothing
    }

}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/MultipleTestRuns.java
================================================
package org.neo4j.graphdatabases.performance_tests.testing;

import static org.neo4j.neode.Range.minMax;
import static org.neo4j.neode.probabilities.ProbabilityDistribution.flatDistribution;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public class MultipleTestRuns
{
    private final int numberOfRuns;
    private final TestOutputWriter writer;

    public MultipleTestRuns( int numberOfRuns, TestOutputWriter writer )
    {
        this.numberOfRuns = numberOfRuns;
        this.writer = writer;
    }

    public void execute( String title,
                         ParamsGenerator paramsGenerator,
                         SingleTestRunResultHandlerFactory singleTestRunResultHandlerFactory,
                         TestResultsHandler testResultsHandler,
                         SingleTest... tests )
    {
        writer.writeln( title );
        testResultsHandler.writeTo( writer );

        Map<String, Long> totalTimes = new HashMap<String, Long>();
        for ( SingleTest singleTest : tests )
        {
            totalTimes.put( singleTest.queryType(), 0L );
        }

        for ( long i = 0; i < numberOfRuns; i++ )
        {
            SingleTestRunResultHandler singleTestRunResultHandler = singleTestRunResultHandlerFactory
                    .createSingleTestRunResultHandler();

            writer.writeln( String.format( "\nTest run %s of %s", i + 1, numberOfRuns ) );
            Map<String, String> params = paramsGenerator.generateParams();

            if ( !params.isEmpty() )
            {
                writer.write( "Params: " );
            }
            for ( String key : params.keySet() )
            {
                writer.write( String.format( "[%s: %s] ", key, params.get( key ) ) );
            }

            writer.writeln( "" );

            //Randomize the order in which tests are executed each run
            List<Integer> testIndexes = flatDistribution()
                    .generateList( tests.length, minMax( 0, tests.length - 1 ) );

            for ( Integer testIndex : testIndexes )
            {
                SingleTest singleTest = tests[testIndex];
                writer.writeln( String.format( "\n  %s", singleTest.queryType() ) );
                long startTime = System.nanoTime();
                Object lastResult = singleTest.execute( params );
                testResultsHandler.handle( singleTest.queryType(), lastResult, singleTestRunResultHandler );
                long endTime = System.nanoTime();
                long duration = endTime - startTime;
                writer.writeln( String.format( "  Duration (ms): %s", duration / 1000000 ) );
                Long currentTotalTime = totalTimes.get( singleTest.queryType() );
                totalTimes.put( singleTest.queryType(), currentTotalTime + duration );
            }

            singleTestRunResultHandler.summarize( writer );

        }

        writer.writeln( "\n======================================" );
        writer.writeln( title );
        writer.writeln( "Average times (ms)" );

        for ( SingleTest singleTest : tests )
        {
            long avgTime = totalTimes.get( singleTest.queryType() ) / numberOfRuns / 1000000;
            writer.writeln( String.format( "  %s: %s", singleTest.queryType(), avgTime ) );
        }
        writer.writeln( "======================================" );
    }

    public void execute( String title,
                         ParamsGenerator paramsGenerator,
                         TestResultsHandler testResultsHandler,
                         SingleTest... tests )
    {
        execute( title, paramsGenerator, new NullSingleTestRunResultHandlerFactory(), testResultsHandler, tests );
    }

    private static class NullSingleTestRunResultHandler implements SingleTestRunResultHandler
    {
        @Override
        public void handle( String queryType, String formattedResult )
        {
            // Do nothing
        }

        @Override
        public void summarize( TestOutputWriter writer )
        {
            // Do nothing
        }
    }

    private static class NullSingleTestRunResultHandlerFactory implements SingleTestRunResultHandlerFactory
    {
        private final  SingleTestRunResultHandler instance = new NullSingleTestRunResultHandler();

        @Override
        public SingleTestRunResultHandler createSingleTestRunResultHandler()
        {
            return instance;
        }
    }
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ParamsGenerator.java
================================================
/*
 * Copyright (C) 2012 Neo Technology
 * All rights reserved
 */
package org.neo4j.graphdatabases.performance_tests.testing;

import java.util.Map;

public interface ParamsGenerator
{
    Map<String, String> generateParams();
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/PrintTestResults.java
================================================
package org.neo4j.graphdatabases.performance_tests.testing;

import java.util.Iterator;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public class PrintTestResults implements TestResultsHandler
{
    private static ResultFormatter DEFAULT_FORMATTER = new ResultFormatter()
    {
        @Override
        public String format( Object result )
        {
            return result.toString();
        }
    };

    public static TestResultsHandler printResults( int numberOfResults, ResultFormatter resultFormatter,
                                                     TestOutputWriter writer )
    {
        return new PrintTestResults( numberOfResults, resultFormatter, writer );
    }

    public static TestResultsHandler printResults( int numberOfResults, TestOutputWriter writer )
    {
        return new PrintTestResults( numberOfResults, DEFAULT_FORMATTER, writer );
    }

    private final int numberOfResults;
    private final ResultFormatter resultFormatter;
    private final TestOutputWriter writer;

    private PrintTestResults( int numberOfResults, ResultFormatter resultFormatter, TestOutputWriter writer )
    {
        this.numberOfResults = numberOfResults;
        this.resultFormatter = resultFormatter;
        this.writer = writer;
    }

    @Override
    public void handle( String queryType, Object results, SingleTestRunResultHandler singleTestRunResultHandler )
    {
        if ( Iterable.class.isAssignableFrom( results.getClass() ) )
        {
            Iterator iterator = ((Iterable) results).iterator();
            int count = 0;

            if ( !iterator.hasNext() )
            {
                writer.write( " {EMPTY}" );
            }
            else
            {
                while ( iterator.hasNext() && count < numberOfResults )
                {
                    String formattedResult = resultFormatter.format( iterator.next() );
                    singleTestRunResultHandler.handle( queryType, formattedResult );
                    writer.writeln( String.format( "     [%s]", formattedResult ) );
                    count++;
                }
                writer.writeln("");
                writer.writeln(String.format( "     Total: %s", count ) );
                writer.writeln("");
            }
        }
        else
        {
            String formattedResult = resultFormatter.format( results );
            singleTestRunResultHandler.handle( queryType, formattedResult );
            writer.writeln( formattedResult );
        }
    }

    @Override
    public void writeTo( TestOutputWriter writer )
    {
        writer.writeln( String.format( "NUMBER_OF_RESULTS: %s", numberOfResults ) );
    }

}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/QueryType.java
================================================
/*
 * Copyright (C) 2012 Neo Technology
 * All rights reserved
 */
package org.neo4j.graphdatabases.performance_tests.testing;

public enum QueryType
{
    CoreAPI,
    Cypher,
    AltCypher,
    Gremlin,
    Traversal,
    GraphAlgo
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ResultFormatter.java
================================================
/*
 * Copyright (C) 2012 Neo Technology
 * All rights reserved
 */
package org.neo4j.graphdatabases.performance_tests.testing;

public interface ResultFormatter
{
    String format(Object result);
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ResultsContainSameElementsUnordered.java
================================================
package org.neo4j.graphdatabases.performance_tests.testing;

import static java.util.Arrays.asList;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public class ResultsContainSameElementsUnordered implements SingleTestRunResultHandler
{
    public static SingleTestRunResultHandlerFactory newFactory(final String... cleanResultRegExes)
    {
        return new SingleTestRunResultHandlerFactory()
        {
            @Override
            public SingleTestRunResultHandler createSingleTestRunResultHandler()
            {
                return new ResultsContainSameElementsUnordered(cleanResultRegExes);
            }
        };
    }

    private final List<String> cleanResultRegExes;
    private final Map<String, List<String>> results;
    private boolean newlineWritten = false;

    public ResultsContainSameElementsUnordered( String... cleanResultRegExes )
    {
        this.cleanResultRegExes = asList( cleanResultRegExes );
        results = new TreeMap<String, List<String>>();
    }

    @Override
    public void handle( String queryType, String formattedResult )
    {
        if ( !results.containsKey( queryType ) )
        {
            results.put( queryType, new ArrayList<String>() );
        }

        for ( String cleanResultRegEx : cleanResultRegExes )
        {
            formattedResult = formattedResult.replaceAll( cleanResultRegEx, "" );
        }

        results.get( queryType ).add( formattedResult );
    }

    @Override
    public void summarize( TestOutputWriter writer )
    {
        List<String> queryTypes = new ArrayList<String>( results.keySet() );
        for ( int i = 0; i < queryTypes.size() - 1; i++ )
        {
            String queryType1 = queryTypes.get( i );
            for ( int j = i + 1; j < queryTypes.size(); j++ )
            {
                String queryType2 = queryTypes.get( j );
                compareCollections( queryType1, results.get( queryType1 ), queryType2, results.get( queryType2 ),
                        writer );
            }
        }
    }

    private void compareCollections( String queryType1, Collection<String> results1, String queryType2,
                                     Collection<String> results2, TestOutputWriter writer )
    {
        compare( queryType1, results1, queryType2, results2, writer );
        compare( queryType2, results2, queryType1, results1, writer );
    }

    private void compare( String queryType1, Collection<String> results1, String queryType2,
                          Collection<String> results2, TestOutputWriter writer )
    {
        Collection<String> copyOfResults1 = new HashSet<String>( results1 );
        copyOfResults1.removeAll( results2 );
        if ( !copyOfResults1.isEmpty() )
        {
            if (!newlineWritten)
            {
                writer.writeln( "" );
                newlineWritten = true;
            }

            writer.writeln( String.format( "   %s v. %s: %s contains additional elements: %s", queryType1, queryType2,
                    queryType1, copyOfResults1 ) );

        }
    }


}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTest.java
================================================
/*
 * Copyright (C) 2012 Neo Technology
 * All rights reserved
 */
package org.neo4j.graphdatabases.performance_tests.testing;

import java.util.Map;

public interface SingleTest
{
    String queryType();
    Object execute( Map<String, String> params );
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTestRunResultHandler.java
================================================
/*
 * Copyright (C) 2012 Neo Technology
 * All rights reserved
 */
package org.neo4j.graphdatabases.performance_tests.testing;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public interface SingleTestRunResultHandler
{
    void handle( String queryType, String formattedResult );
    void summarize( TestOutputWriter writer );
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTestRunResultHandlerFactory.java
================================================
/*
 * Copyright (C) 2012 Neo Technology
 * All rights reserved
 */
package org.neo4j.graphdatabases.performance_tests.testing;

public interface SingleTestRunResultHandlerFactory
{
    SingleTestRunResultHandler createSingleTestRunResultHandler();
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SysOutWriter.java
================================================
package org.neo4j.graphdatabases.performance_tests.testing;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public class SysOutWriter implements TestOutputWriter
{
    public static final TestOutputWriter INSTANCE = new SysOutWriter();

    private SysOutWriter(){}

    @Override
    public void begin()
    {
    }

    @Override
    public void write( String value )
    {
        System.out.print(value);
    }

    @Override
    public void writeln( String value )
    {
        System.out.println( value );
    }

    @Override
    public void flush()
    {
    }

    @Override
    public void end()
    {
    }
}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/TakeXTestResults.java
================================================
package org.neo4j.graphdatabases.performance_tests.testing;


import java.util.Iterator;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public class TakeXTestResults implements TestResultsHandler
{
    public static TestResultsHandler take( int quantity )
    {
        return new TakeXTestResults( quantity );
    }

    private final int quantity;

    public TakeXTestResults( int quantity )
    {
        this.quantity = quantity;
    }

    @Override
    public void handle( String queryType, Object results, SingleTestRunResultHandler singleTestRunResultHandler )
    {
        int i = 0;
        if ( Iterable.class.isAssignableFrom( results.getClass() ) )
        {
            Iterator iterator = ((Iterable) results).iterator();
            while ( iterator.hasNext() && ++i < quantity )
            {
                iterator.next();
            }
        }
    }

    @Override
    public void writeTo( TestOutputWriter writer )
    {
        writer.writeln( String.format( "NUMBER_OF_RESULTS: %s", quantity ) );
    }

}


================================================
FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/TestResultsHandler.java
================================================
/*
 * Copyright (C) 2012 Neo Technology
 * All rights reserved
 */
package org.neo4j.graphdatabases.performance_tests.testing;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public interface TestResultsHandler
{
    void handle( String queryType, Object results, SingleTestRunResultHandler singleTestRunResultHandler );
    void writeTo(TestOutputWriter writer);
}


================================================
FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/AccessControl.java
================================================
package org.neo4j.graphdatabases.performance_tests;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.AccessControlConfig;
import org.neo4j.graphdatabases.AccessControlWithRelationshipPropertiesConfig;
import org.neo4j.graphdatabases.performance_tests.testing.DefaultExecutionEngineWrapper;
import org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;
import org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;
import org.neo4j.graphdatabases.performance_tests.testing.SingleTest;
import org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;
import org.neo4j.graphdatabases.queries.AccessControlQueries;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;
import org.neo4j.graphdb.GraphDatabaseService;

import static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;

public class AccessControl
{
    private static final int NUMBER_OF_TEST_RUNS = 20;
    private static final int NUMBER_OF_RESULTS = 15;

    private static int numberOfAccounts;
    private static int numberOfEmployees;

    private static GraphDatabaseService db;
    private static AccessControlQueries queries;
    private static MultipleTestRuns multipleTestRuns;
    private static Random random;
    private static TestOutputWriter writer = SysOutWriter.INSTANCE;

    @BeforeClass
    public static void init()
    {
        try
        {
            db = DbUtils.existingDB( AccessControlConfig.STORE_DIR );
            queries = new AccessControlQueries( new DefaultExecutionEngineWrapper( db ) );
            multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );

            random = new Random();

            numberOfAccounts = DbUtils.numberOfItemsWithLabel(db, "Account");
            numberOfEmployees = DbUtils.numberOfItemsWithLabel(db, "Employee");
        }
        catch ( Exception ex )
        {
            System.out.println( ex.getMessage() );
        }
    }

    @AfterClass
    public static void teardown()
    {
        db.shutdown();
    }

    @Test
    public void findAccessibleResources() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find accessible resources for admin",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAccessibleResources( params.get( "admin" ) );
                    }
                } );
    }

    @Test
    public void findAccessibleCompanies() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find accessible companies for admin",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAccessibleCompanies( params.get( "admin" ) );
                    }
                } );
    }

    @Test
    public void findAccessibleAccountsForCompany() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find accessible accounts for company for admin",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAccessibleAccountsForCompany(
                                params.get( "admin" ),
                                params.get( "company" ) );
                    }
                } );
    }

    @Test
    public void findAdminForCompany() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find admins for company",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAdminForCompany( params.get( "company" ) );
                    }
                } );
    }

    @Test
    public void findAdminForResource() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find admins for resource",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAdminForResource( params.get( "resource" ) );
                    }
                }
        );
    }

    @Test
    public void hasAccessToResource() throws Exception
    {
        // when
        multipleTestRuns.execute( "Does admin have access to resource?",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher (indexed resources)";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.hasAccessToIndexedResource( params.get( "admin" ), params.get( "resource" ) );
                    }
                }
        );
    }

    @Test
    public void hasAccessToResourceBakeoff() throws Exception
    {
        // when
        multipleTestRuns.execute( "Does admin have access to resource?",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.hasAccessToResource( params.get( "admin" ), params.get( "resource" ) );
                    }
                }, new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher (indexed resources)";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.hasAccessToIndexedResource( params.get( "admin" ), params.get( "resource" ) );
                    }
                }
        );
    }

    private ParamsGenerator createParams()
    {
        return new ParamsGenerator()
        {
            @Override
            public Map<String, String> generateParams()
            {
                HashMap<String, String> params = new HashMap<String, String>();

                String adminName = String.format( "Administrator-%s",
                        random.nextInt( AccessControlWithRelationshipPropertiesConfig.NUMBER_OF_ADMINS ) + 1 );

                String resourceName;
                if ( random.nextInt( 2 ) < 1 )
                {
                    resourceName = String.format( "Account-%s", random.nextInt( numberOfAccounts ) + 1 );
                }
                else
                {
                    resourceName = String.format( "Customer-%s", random.nextInt( numberOfEmployees ) + 1 );
                }

                ExecutionResult result = queries.findAccessibleCompanies( adminName );
                Iterator<Map<String, Object>> iterator = result.iterator();
                String companyName = (String) iterator.next().get( "company" );

                params.put( "admin", adminName );
                params.put( "company", companyName );
                params.put( "resource", resourceName );

                return params;
            }
        };
    }


}



================================================
FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/AccessControlWithRelationshipProperties.java
================================================
package org.neo4j.graphdatabases.performance_tests;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import org.neo4j.graphdatabases.AccessControlWithRelationshipPropertiesConfig;
import org.neo4j.graphdatabases.performance_tests.testing.DefaultExecutionEngineWrapper;
import org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;
import org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;
import org.neo4j.graphdatabases.performance_tests.testing.SingleTest;
import org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;
import org.neo4j.graphdatabases.queries.AccessControlWithRelationshipPropertiesQueries;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdatabases.queries.helpers.QueryUnionExecutionResult;
import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;

import static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;

public class AccessControlWithRelationshipProperties
{
    private static final int NUMBER_OF_TEST_RUNS = 20;
    private static final int NUMBER_OF_RESULTS = 15;

    private static int numberOfAccounts;
    private static int numberOfCustomers;

    private static GraphDatabaseService db;
    private static AccessControlWithRelationshipPropertiesQueries queries;
    private static MultipleTestRuns multipleTestRuns;
    private static Random random;
    private static TestOutputWriter writer = SysOutWriter.INSTANCE;

    @BeforeClass
    public static void init()
    {
        db = DbUtils.existingDB( AccessControlWithRelationshipPropertiesConfig.STORE_DIR );

        queries = new AccessControlWithRelationshipPropertiesQueries( new DefaultExecutionEngineWrapper( db ) );
        multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );

        random = new Random();

        numberOfAccounts = DbUtils.numberOfItemsWithLabel(db, "Account");
        numberOfCustomers = DbUtils.numberOfItemsWithLabel(db, "Employee");

    }

    @AfterClass
    public static void teardown()
    {
        db.shutdown();
    }

    @Test
    public void findAccessibleResources() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find accessible resources for admin",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public QueryUnionExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAccessibleResources( params.get( "admin" ) );
                    }
                } );
    }

    @Test
    public void findAccessibleCompanies() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find accessible companies for admin",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public QueryUnionExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAccessibleCompanies( params.get( "admin" ) );
                    }
                } );
    }

    @Test
    public void findAccessibleAccountsForCompany() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find accessible accounts for company for admin",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public QueryUnionExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAccessibleAccountsForCompany(
                                params.get( "admin" ),
                                params.get( "company" ) );
                    }
                } );
    }

    @Test
    public void findAdminForCompany() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find admins for company",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public QueryUnionExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAdminForCompany( params.get( "company" ) );
                    }
                } );
    }

    @Test
    public void findAdminForResource() throws Exception
    {
        // when
        multipleTestRuns.execute( "Find admins for resource",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public QueryUnionExecutionResult execute( Map<String, String> params )
                    {
                        return queries.findAdminForResource( params.get( "resource" ) );
                    }
                }
        );
    }

    @Test
    public void hasAccessToResource() throws Exception
    {
        // when
        multipleTestRuns.execute( "Does admin have access to resource?",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher (indexed resources)";
                    }

                    @Override
                    public QueryUnionExecutionResult execute( Map<String, String> params )
                    {
                        return queries.hasAccessToIndexedResource( params.get( "admin" ),
                                params.get( "resource" ) );
                    }
                }
        );
    }

    @Test
    public void hasAccessToResourceBakeoff() throws Exception
    {
        // when
        multipleTestRuns.execute( "Does admin have access to resource?",
                createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public QueryUnionExecutionResult execute( Map<String, String> params )
                    {
                        return queries.hasAccessToResource( params.get( "admin" ), params.get( "resource" ) );
                    }
                }, new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher (indexed resources)";
                    }

                    @Override
                    public QueryUnionExecutionResult execute( Map<String, String> params )
                    {
                        return queries.hasAccessToIndexedResource( params.get( "admin" ),
                                params.get( "resource" ) );
                    }
                }
        );
    }

    private ParamsGenerator createParams()
    {
        return new ParamsGenerator()
        {
            @Override
            public Map<String, String> generateParams()
            {
                HashMap<String, String> params = new HashMap<String, String>();

                String adminName = String.format( "Administrator-%s",
                        random.nextInt( AccessControlWithRelationshipPropertiesConfig.NUMBER_OF_ADMINS ) + 1 );

                String resourceName;
                if ( random.nextInt( 2 ) < 1 )
                {
                    resourceName = String.format( "Account-%s", random.nextInt( numberOfAccounts ) + 1 );
                }
                else
                {
                    resourceName = String.format( "Customer-%s", random.nextInt( numberOfCustomers ) + 1 );
                }

                QueryUnionExecutionResult result = queries.findAccessibleCompanies( adminName );
                Iterator<Map<String, Object>> iterator = result.iterator();
                String companyName = ((Node) iterator.next().get( "company" )).getProperty( "name" ).toString();

                params.put( "admin", adminName );
                params.put( "company", companyName );
                params.put( "resource", resourceName );

                return params;
            }
        };
    }

}


================================================
FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/Logistics.java
================================================
package org.neo4j.graphdatabases.performance_tests;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.LogisticsConfig;
import org.neo4j.graphdatabases.performance_tests.testing.DefaultExecutionEngineWrapper;
import org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;
import org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;
import org.neo4j.graphdatabases.performance_tests.testing.SingleTest;
import org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;
import org.neo4j.graphdatabases.queries.LogisticsQueries;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;
import org.neo4j.graphdb.DynamicLabel;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Transaction;
import org.neo4j.helpers.collection.IteratorUtil;
import org.neo4j.tooling.GlobalGraphOperations;

import static java.util.Arrays.asList;

import static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;

public class Logistics
{
    public static final int NUMBER_OF_TEST_RUNS = 20;
    private static final int NUMBER_OF_RESULTS = 15;

    private static GraphDatabaseService db;
    private static LogisticsQueries queries;
    private static MultipleTestRuns multipleTestRuns;
    private static Random random;
    private static TestOutputWriter writer = SysOutWriter.INSTANCE;

    @BeforeClass
    public static void init()
    {
        db = DbUtils.existingDB( LogisticsConfig.STORE_DIR );

        queries = new LogisticsQueries( db, new DefaultExecutionEngineWrapper( db ) );
        multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );

        random = new Random();

    }

    @AfterClass
    public static void teardown()
    {
        if ( db != null )
        {
            db.shutdown();
        }
    }


    @Test
    public void queryTest() throws Exception
    {
        List<Integer> customIds = asList( 6053, 210, 6, 56, 8, 87, 2, 95, 9, 256, 7476, 545580 );
        List<Integer> cypherIds = asList( 6053, 210, 6, 192, 9, 256, 7476, 545580 );
        Interval interval = Interval.parse( "2012-10-17T00:00:00.000+01:00/2012-10-18T00:00:00.000+01:00" );

        getPath( customIds, interval );
        getPath( cypherIds, interval );

    }

    private void getPath( List<Integer> ids, Interval interval )
    {
        StringBuilder sbWhere = new StringBuilder();
        StringBuilder sbMatch = new StringBuilder();

        for ( int i = 0; i < ids.size(); i++ )
        {
            sbWhere.append("id(n");
            sbWhere.append(i);
            sbWhere.append(")=");
            sbWhere.append(ids.get(i));
            if ( i < (ids.size() - 1) )
            {
                sbWhere.append(" AND ");
            }
            sbWhere.append(" ");

            sbMatch.append( "n" );
            sbMatch.append( i );
            if ( i < (ids.size() - 1) )
            {
                sbMatch.append( "--" );
            }
        }

        String q = String.format(
                "MATCH p = %s %n" +
                "WHERE %s AND ALL(r in relationships(p) where r.start_date <= %s and r.end_date >= %s) %n" +
                "RETURN REDUCE(weight=0, r in relationships(p) | weight+r.cost) AS score, p",
                sbMatch.toString(),
                sbWhere.toString(),
                interval.getStartMillis(),
                interval.getEndMillis());
        writer.writeln(q);


        ExecutionResult result = new ExecutionEngine( db ).execute( q );
        writer.writeln(result.toString());
    }

    @After
    public void flush()
    {
        writer.flush();
    }

    @Test
    public void shortestRoute() throws Exception
    {
        TestRunParams testRunParams = new TestRunParams( db, writer );

        // when
        multipleTestRuns.execute( "Shortest route through the parcel system",
                testRunParams.createParams(),
                printResults( NUMBER_OF_RESULTS, writer ),

                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "Cypher";
                    }

                    @Override
                    public Object execute( Map<String, String> params )
                    {
                        return queries.findShortestPathWithCypherReduce(
                                params.get( "start" ),
                                params.get( "end" ),
                                Interval.parse( params.get( "interval" ) ) );

                    }
                },
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "ParcelRouteCalculator";
                    }

                    @Override
                    public Object execute( Map<String, String> params )
                    {
                        return queries.findShortestPathWithParcelRouteCalculator(
                                params.get( "start" ),
                                params.get( "end" ),
                                Interval.parse( params.get( "interval" ) ) );

                    }
                }
        );
    }

    @Test
    public void testSingleCypherQuery() throws Exception
    {
        Map<String, String> params = new HashMap<String, String>();
        params.put( "start", "delivery-segment-181622" );
        params.put( "end", "delivery-segment-611694" );
        params.put( "interval", "2012-10-17T00:00:00.000-07:00/2012-10-18T00:00:00.000-07:00" );


        Interval interval = Interval.parse( params.get( "interval" ) );
        System.out.println( "Start: " + interval.getStartMillis() );
        System.out.println( "End: " + interval.getEndMillis() );
        ExecutionResult result = queries.findShortestPathWithCypherReduce(
                params.get( "start" ),
                params.get( "end" ),
                interval );

        writer.writeln( result.toString() );
    }

    private class TestRunParams
    {
        private int deliveryAreaCount;
        private int deliverySegmentCount;

        public TestRunParams( GraphDatabaseService db, TestOutputWriter writer )
        {
            GlobalGraphOperations ops = GlobalGraphOperations.at(db);
            try ( Transaction tx = db.beginTx())
            {
                deliveryAreaCount = IteratorUtil.count(ops.getAllNodesWithLabel(DynamicLabel.label("DeliveryArea")));
                deliverySegmentCount = IteratorUtil.count(ops.getAllNodesWithLabel(DynamicLabel.label("DeliverySegment")));

                writer.writeln( "deliveryAreaCount " + deliveryAreaCount );
                writer.writeln( "deliverySegmentCount " + deliverySegmentCount );
                tx.success();
            }
        }

        public ParamsGenerator createParams()
        {
            return new ParamsGenerator()
            {
                @Override
                public final Map<String, String> generateParams()
                {
                    Map<String, String> params = new HashMap<String, String>();
                    if ( random.nextInt( 2 ) < 1 )
                    {
                        params.put( "start",
                                String.format( "DeliverySegment-%s", random.nextInt( deliverySegmentCount ) + 1 ) );
                    }
                    else
                    {
                        params.put( "start",
                                String.format( "DeliveryArea-%s", random.nextInt( deliveryAreaCount ) + 1 ) );
                    }
                    params.put( "end",
                            String.format( "DeliverySegment-%s", random.nextInt( deliverySegmentCount ) + 1 ) );
                    DateTime startDtm = LogisticsConfig.START_DATE.plusDays( random.nextInt( 6 ) );
                    params.put( "interval", new Interval( startDtm, startDtm.plusDays( 1 ) ).toString() );
                    return params;
                }
            };
        }

    }

}


================================================
FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/SimpleSocialNetwork.java
================================================
package org.neo4j.graphdatabases.performance_tests;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.SimpleSocialNetworkConfig;
import org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;
import org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;
import org.neo4j.graphdatabases.performance_tests.testing.SingleTest;
import org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;
import org.neo4j.graphdatabases.queries.SimpleSocialNetworkQueries;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;
import org.neo4j.graphdatabases.queries.traversals.FriendOfAFriendDepth4;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Transaction;

import static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;

public class SimpleSocialNetwork
{
    private static GraphDatabaseService db;
    private static SimpleSocialNetworkQueries queries;
    private static MultipleTestRuns multipleTestRuns;
    private static Random random;
    private static TestOutputWriter writer = SysOutWriter.INSTANCE;

    public static final int NUMBER_OF_TEST_RUNS = 20;

    @BeforeClass
    public static void init()
    {
        db = DbUtils.existingDB( SimpleSocialNetworkConfig.STORE_DIR );

        queries = new SimpleSocialNetworkQueries( db );
        multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );

        random = new Random();
    }

    @AfterClass
    public static void teardown()
    {
        db.shutdown();
    }

    @Test
    public void foafToDepthFour() throws Exception
    {
        try ( Transaction tx = db.beginTx() )
        {
            // when
            multipleTestRuns.execute( "Foaf to depth 4", createParams(), printResults( 1, writer ), new SingleTest()
            {
                @Override
                public String queryType()
                {
                    return "Cypher";
                }

                @Override
                public ExecutionResult execute( Map<String, String> params )
                {
                    return queries.pathBetweenTwoFriends( params.get( "first-user" ), params.get( "second-user" ) );
                }
            } );
            tx.success();
        }
    }

    @Test
    public void friendOfAFriendToDepth4() throws Exception
    {
        try ( Transaction tx = db.beginTx() )
        {
            // when
            multipleTestRuns.execute( "Friend of a friend to depth 4", createParams(), printResults( 100, writer ),
                    new SingleTest()
                    {
                        @Override
                        public String queryType()
                        {
                            return "Cypher";
                        }

                        @Override
                        public ExecutionResult execute( Map<String, String> params )
                        {
                            return queries.friendOfAFriendToDepth4( params.get( "first-user" ) );
                        }
                    } );
            tx.success();
        }
    }

    @Test
    public void onlyFriendsAtDepth4UsingTraversalFramework() throws Exception
    {
        try ( Transaction tx = db.beginTx() )
        {
            final FriendOfAFriendDepth4 traversal = new FriendOfAFriendDepth4( db );

            // when
            multipleTestRuns.execute( "Only friends at depth 4 using Traversal Framework", createParams(),
                    printResults( 300000, writer ),
                    new SingleTest()
                    {
                        @Override
                        public String queryType()
                        {
                            return "Traversal Framework (custom class)";
                        }

                        @Override
                        public Iterable<Node> execute( Map<String, String> params )
                        {
                            return traversal.getFriends( params.get( "first-user" ) );
                        }
                    } );
            tx.success();
        }
    }

    private ParamsGenerator createParams()
    {
        return new ParamsGenerator()
        {
            @Override
            public Map<String, String> generateParams()
            {
                Map<String, String> params = new HashMap<String, String>();
                params.put( "first-user", String.format( "User-%s", random.nextInt( SimpleSocialNetworkConfig
                        .NUMBER_USERS
                ) + 1 ) );
                params.put( "second-user", String.format( "User-%s", random.nextInt( SimpleSocialNetworkConfig
                        .NUMBER_USERS
                ) + 1 ) );
                return params;
            }
        };
    }
}


================================================
FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/SocialNetwork.java
================================================
package org.neo4j.graphdatabases.performance_tests;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.junit.*;
import org.junit.rules.TestName;

import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.SocialNetworkConfig;
import org.neo4j.graphdatabases.performance_tests.testing.DefaultExecutionEngineWrapper;
import org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;
import org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;
import org.neo4j.graphdatabases.performance_tests.testing.ResultFormatter;
import org.neo4j.graphdatabases.performance_tests.testing.ResultsContainSameElementsUnordered;
import org.neo4j.graphdatabases.performance_tests.testing.SingleTest;
import org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;
import org.neo4j.graphdatabases.queries.SocialNetworkQueries;
import org.neo4j.graphdatabases.queries.helpers.DbUtils;
import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Transaction;

import static org.neo4j.graphdatabases.performance_tests.testing.DoNothingWithTestResults.doNothing;
import static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;
import static org.neo4j.graphdatabases.performance_tests.testing.TakeXTestResults.take;
import static org.neo4j.neode.Range.minMax;
import static org.neo4j.neode.probabilities.ProbabilityDistribution.flatDistribution;

public class SocialNetwork
{
    public static final int NUMBER_OF_RESULTS = 5;
    public static final int NUMBER_OF_TEST_RUNS = 20;

    private GraphDatabaseService db;
    private SocialNetworkQueries queries;
    private MultipleTestRuns multipleTestRuns;
    private Random random;
    private TestOutputWriter writer = SysOutWriter.INSTANCE;

    @Rule
    public TestName name = new TestName();

    @Before
    public void init()
    {
        db = DbUtils.existingDB( SocialNetworkConfig.STORE_DIR );

        queries = new SocialNetworkQueries( db, new DefaultExecutionEngineWrapper( db ) );
        multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );

        random = new Random();
    }

    @After
    public void teardown()
    {
        db.shutdown();
        writer.flush();
    }

    @Test
    public void sharedInterestsSameCompany() throws Exception
    {
        // when
        multipleTestRuns.execute( name.getMethodName(), createParams( "user" ),
                take( NUMBER_OF_RESULTS ), new SingleTest()
        {
            @Override
            public String queryType()
            {
                return "Cypher";
            }

            @Override
            public Object execute( Map<String, String> params )
            {
                return queries.sharedInterestsSameCompany( params.get( "user" ) );
            }
        } );

    }

    @Test
    public void sharedInterestsAllCompanies() throws Exception
    {
        // when
        multipleTestRuns.execute( name.getMethodName(), createParams( "user" ),
                take( NUMBER_OF_RESULTS ), new SingleTest()
        {
            @Override
            public String queryType()
            {
                return "Cypher";
            }

            @Override
            public Object execute( Map<String, String> params )
            {
                return queries.sharedInterestsAllCompanies( params.get( "user" ), NUMBER_OF_RESULTS );
            }
        } );
    }

    @Test
    public void sharedInterestsAlsoInterestedInTopic() throws Exception
    {
        // when
        multipleTestRuns.execute( name.getMethodName(),
                createParams( "user", "topic1" ), take( NUMBER_OF_RESULTS ), new SingleTest()
        {
            @Override
            public String queryType()
            {
                return "Cypher";
            }

            @Override
            public Object execute( Map<String, String> params )
            {
                return queries.sharedInterestsAlsoInterestedInTopic( params.get( "user" ), params.get( "topic1" ) );
            }
        } );
    }

    @Test
    public void friendOfAFriendWithInterest() throws Exception
    {
        try ( Transaction tx = db.beginTx() )
        {
            // when
            multipleTestRuns.execute(
                    name.getMethodName(), createParams( "user", "topic1" ), take( NUMBER_OF_RESULTS ),
                    new SingleTest()
                    {
                        @Override
                        public String queryType()
                        {
                            return "Cypher";
                        }

                        @Override
                        public Object execute( Map<String, String> params )
                        {
                            return queries.friendOfAFriendWithInterest( params.get( "user" ),
                                    params.get( "topic1" ), NUMBER_OF_RESULTS );
                        }
                    } );
            tx.success();
        }
    }

    @Test
    public void friendOfAFriendWithInterestTraversalFramework() throws Exception
    {
        try ( Transaction tx = db.beginTx() )
        {
            // when
            multipleTestRuns.execute( name.getMethodName(), createParams( "user", "topic1" ),
                    doNothing(), new SingleTest()
            {
                @Override
                public String queryType()
                {
                    return "Traversal Framework";
                }

                @Override
                public Object execute( Map<String, String> params )
                {
                    return queries.friendOfAFriendWithInterestTraversalFramework(
                            params.get( "user" ), params.get( "topic1" ), NUMBER_OF_RESULTS );
                }
            } );
            tx.success();
        }
    }


//    @Test
//    public void shouldFindColleagueOfAColleagueOfAColleagueEtcWithAParticularInterestUsingGremlin() throws Exception
//    {
//        // when
//        multipleTestRuns.execute( "Colleagues of colleagues interested in particular topic (gremlin)",
//                createParams(), printResults( 2 ), new SingleTestRun()
//        {
//            @Override
//            public QueryType queryType()
//            {
//                return QueryType.Gremlin;
//            }
//
//            @Override
//            public Object execute( Map<String, String> params )
//            {
//                try
//                {
//                    return queries.friendOfAFriendWithParticularInterestGremlin( params.get( "user" ),
//                            params.get( "topic" ) );
//                }
//                catch ( ScriptException e )
//                {
//                    throw new RuntimeException( e );
//                }
//            }
//        } );
//    }

    @Test
    public void queryBakeoff() throws Exception
    {
        try ( Transaction tx = db.beginTx() )
        {
            // when
            multipleTestRuns.execute( name.getMethodName(), createParams( "user", "topic1" ),
                    printResults( NUMBER_OF_RESULTS, resultFormatter(), writer ),
                    new SingleTest()
                    {
                        @Override
                        public String queryType()
                        {
                            return "Traversal Framework";
                        }

                        @Override
                        public Object execute( Map<String, String> params )
                        {
                            return queries.friendOfAFriendWithInterestTraversalFramework(
                                    params.get( "user" ), params.get( "topic1" ), NUMBER_OF_RESULTS );
                        }
                    }
    //                , new SingleTestRun()
    //                {
    //                    @Override
    //                    public QueryType queryType()
    //                    {
    //                        return QueryType.Gremlin;
    //                    }
    //
    //                    @Override
    //                    public Object execute( Map<String, String> params )
    //                    {
    //                        try
    //                        {
    //                            return queries.friendOfAFriendWithParticularInterestGremlin( params.get( "user" ),
    //                                    params.get( "topic" ) );
    //                        }
    //                        catch ( ScriptException e )
    //                        {
    //                            throw new RuntimeException( e );
    //                        }
    //                    }
    //                }
                    , new SingleTest()
                    {
                        @Override
                        public String queryType()
                        {
                            return "Cypher";
                        }

                        @Override
                        public Object execute( Map<String, String> params )
                        {
                            return queries.friendOfAFriendWithInterest(
                                    params.get( "user" ), params.get( "topic1" ), NUMBER_OF_RESULTS );
                        }
                    }
                    , new SingleTest()
                    {
                        @Override
                        public String queryType()
                        {
                            return "Cypher2";
                        }

                        @Override
                        public Object execute( Map<String, String> params )
                        {
                            return queries.friendWorkedWithFriendWithInterests(
                                    params.get( "user" ), NUMBER_OF_RESULTS,
                                    params.get( "topic1" ) );
                        }
                    }
            );
            tx.success();
        }
    }

    @Test
    public void friendWorkedWithFriendWithInterests() throws Exception
    {
        // when
        multipleTestRuns.execute(
                name.getMethodName(),
                createParams( "user", "topic1", "topic2", "topic3" ),
                take( NUMBER_OF_RESULTS ), new SingleTest()
        {
            @Override
            public String queryType()
            {
                return "Cypher";
            }

            @Override
            public ExecutionResult execute( Map<String, String> params )
            {
                return queries.friendWorkedWithFriendWithInterests( params.get( "user" ),
                        NUMBER_OF_RESULTS, params.get( "topic1" ), params.get( "topic2" ), params.get( "topic3" ) );
            }
        } );
    }

    @Test
    public void friendOfAFriendWithMultipleInterestsBakeoff() throws Exception
    {
        // when
        multipleTestRuns.execute(
                name.getMethodName(),
                createParams( "user", "topic1", "topic2", "topic3", "topic4", "topic5" ),
                ResultsContainSameElementsUnordered.newFactory(),
                printResults( NUMBER_OF_RESULTS, resultFormatter(), writer ),
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "friendOfAFriendWithMultipleInterest";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.friendOfAFriendWithMultipleInterest( params.get( "user" ),
                                NUMBER_OF_RESULTS,
                                params.get( "topic1" ),
                                params.get( "topic2" ),
                                params.get( "topic3" ),
                                params.get( "topic4" ),
                                params.get( "topic5" ) );
                    }
                },
                new SingleTest()
                {
                    @Override
                    public String queryType()
                    {
                        return "friendWorkedWithFriendWithInterests";
                    }

                    @Override
                    public ExecutionResult execute( Map<String, String> params )
                    {
                        return queries.friendWorkedWithFriendWithInterests( params.get( "user" ),
                                NUMBER_OF_RESULTS,
                                params.get( "topic1" ),
                                params.get( "topic2" ),
                                params.get( "topic3" ),
                                params.get( "topic4" ),
                                params.get( "topic5" ) );
                    }
                }
        );
    }

    private ParamsGenerator createParams( final String... keys )
    {
        return new ParamsGenerator()
        {
            @Override
            public final Map<String, String> generateParams()
            {

                List<Integer> topicIds = flatDistribution().generateList( 5, minMax( 1,
                        SocialNetworkConfig.NUMBER_TOPICS ) );

                Map<String, String> params = new HashMap<String, String>();
                for ( String key : keys )
                {
                    if ( key.equals( "user" ) )
                    {
                        params.put( "user", String.format( "User-%s",
                                random.nextInt( SocialNetworkConfig.NUMBER_USERS ) + 1 ) );
                    }
                    if ( key.equals( "topic1" ) )
                    {
                        params.put( "topic1", String.format( "Topic-%s", topicIds.get( 0 ) ) );
                    }
                    if ( key.equals( "topic2" ) )
                    {
                        params.put( "topic2", String.format( "Topic-%s", topicIds.get( 1 ) ) );
                    }
                    if ( key.equals( "topic3" ) )
                    {
                        params.put( "topic3", String.format( "Topic-%s", topicIds.get( 2 ) ) );
                    }
                    if ( key.equals( "topic4" ) )
                    {
                        params.put( "topic4", String.format( "Topic-%s", topicIds.get( 3 ) ) );
                    }
                    if ( key.equals( "topic5" ) )
                    {
                        params.put( "topic5", String.format( "Topic-%s", topicIds.get( 4 ) ) );
                    }
                }

                return params;
            }
        };
    }

    private ResultFormatter resultFormatter()
    {
        return new ResultFormatter()
        {
            @Override
            public String format( Object result )
            {
                if ( Node.class.isAssignableFrom( result.getClass() ) )
                {
                    return ((Node) result).getProperty( "name" ).toString();
                }
                else
                {
                    return result.toString();
                }
            }
        };
    }

    @Test
    @Ignore
    public void testSingleCypherQuery() throws Exception
    {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "person", "User-309491" );
        params.put( "colleague", "User-558252" );
        params.put( "topic",  "Topic-78" );


        String cypher = "MATCH (person:User {name:{person}}), (colleague:User {name:{colleague}}), " +
                "(topic:Topic {name:{topic}})\n" +
                "MATCH p = person-[:WORKED_ON*2..4]-colleague-[:INTERESTED_IN]->topic\n" +
                "RETURN p, LENGTH(p) AS pathLength ORDER BY pathLength ASC";


        ExecutionResult result = new ExecutionEngine( db ).execute( cypher, params );


        writer.writeln( result.toString() );
    }

    @Test
    @Ignore
    public void testTraversal() throws Exception
    {
        Collection<Node> nodes = queries.friendOfAFriendWithInterestTraversalFramework(
                "User-309491",
                "Topic-78", NUMBER_OF_RESULTS );


        for ( Node node : nodes )
        {

        }
    }
}


================================================
FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/testing/ResultsContainSameElementsUnorderedTest.java
================================================
package org.neo4j.graphdatabases.performance_tests.testing;

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;

public class ResultsContainSameElementsUnorderedTest
{
    @Test
    public void shouldReportDiscrepanciesBetweenTwoQueries() throws Exception
    {
        // given
        ResultsContainSameElementsUnordered handler = new ResultsContainSameElementsUnordered(  );

        // when
        handler.handle( "queryType1", "a" );
        handler.handle( "queryType2", "C" );
        handler.handle( "queryType1", "b" );
        handler.handle( "queryType2", "b" );
        handler.handle( "queryType1", "c" );
        handler.handle( "queryType2", "a" );

        MyTestOutputWriter writer = new MyTestOutputWriter();
        handler.summarize( writer );

        // then
        String expected = "\n" +
                          "   queryType1 v. queryType2: queryType1 contains additional elements: [c]\n" +
                          "   queryType2 v. queryType1: queryType2 contains additional elements: [C]\n";

        assertEquals( expected, writer.toString());

    }

    @Test
    public void shouldReportDiscrepanciesBetweenThreeQueries() throws Exception
    {
        // given
        ResultsContainSameElementsUnordered handler = new ResultsContainSameElementsUnordered(  );

        // when
        handler.handle( "queryType1", "a" );
        handler.handle( "queryType2", "b" );
        handler.handle( "queryType3", "c" );

        MyTestOutputWriter writer = new MyTestOutputWriter();
        handler.summarize( writer );

        // then
        String expected = "\n" +
                          "   queryType1 v. queryType2: queryType1 contains additional elements: [a]\n" +
                          "   queryType2 v. queryType1: queryType2 contains additional elements: [b]\n" +
                          "   queryType1 v. queryType3: queryType1 contains additional elements: [a]\n" +
                          "   queryType3 v. queryType1: queryType3 contains additional elements: [c]\n" +
                          "   queryType2 v. queryType3: queryType2 contains additional elements: [b]\n" +
                          "   queryType3 v. queryType2: queryType3 contains additional elements: [c]\n";

        assertEquals( expected, writer.toString());
    }

    private static class MyTestOutputWriter implements TestOutputWriter
    {
        private final StringBuilder builder = new StringBuilder(  );

        @Override
        public void begin()
        {
        }

        @Override
        public void write( String value )
        {
            builder.append( value );
        }

        @Override
        public void writeln( String value )
        {
            builder.append( value );
            builder.append( "\n" );
        }

        @Override
        public void flush()
        {
        }

        @Override
        public void end()
        {
        }

        @Override
        public String toString()
        {
            return builder.toString();
        }
    }
}


================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>graph-databases-use-cases</groupId>
    <artifactId>graph-databases-use-cases</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <modules>
        <module>queries</module>
        <module>neode</module>
        <module>configuration</module>
        <module>data-generation</module>
        <module>performance-testing</module>
    </modules>

</project>

================================================
FILE: queries/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.neo4j.graphdatabases</groupId>
    <artifactId>queries</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <neo4j.version>2.0.1</neo4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <version>${neo4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-kernel</artifactId>
            <version>${neo4j.version}</version>
            <type>test-jar</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-graphviz</artifactId>
            <version>${neo4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j.app</groupId>
            <artifactId>neo4j-server</artifactId>
            <version>${neo4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.neo4j.app</groupId>
            <artifactId>neo4j-server</artifactId>
            <version>${neo4j.version}</version>
            <type>test-jar</type>
        </dependency>

        <dependency>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.17</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-servlet</artifactId>
            <version>1.17</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.17</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>1.17</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>9.0.5.v20130815</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.1</version>
        </dependency>
    </dependencies>

</project>

================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/AccessControlQueries.java
================================================
package org.neo4j.graphdatabases.queries;

import java.util.HashMap;
import java.util.Map;

import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;

public class AccessControlQueries
{
    private final ExecutionEngineWrapper executionEngine;

    public AccessControlQueries( ExecutionEngineWrapper executionEngineWrapper )
    {
        this.executionEngine = executionEngineWrapper;
    }

    public ExecutionResult findAccessibleResources( String adminName )
    {
        String query = "MATCH (admin:Administrator {name:{adminName}})\n" +
                "MATCH paths=(admin)-[:MEMBER_OF]->()-[:ALLOWED_INHERIT]->()\n" +
                "            <-[:CHILD_OF*0..3]-(company)<-[:WORKS_FOR]-(employee)\n" +
                "            -[:HAS_ACCOUNT]->(account)\n" +
                "WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\n" +
                "RETURN employee.name AS employee, account.name AS account\n" +
                "UNION\n" +
                "MATCH (admin:Administrator {name:{adminName}})\n" +
                "MATCH paths=(admin)-[:MEMBER_OF]->()-[:ALLOWED_DO_NOT_INHERIT]->()\n" +
                "      <-[:WORKS_FOR]-(employee)-[:HAS_ACCOUNT]->(account)\n" +
                "RETURN employee.name AS employee, account.name AS account";

        Map<String, Object> params = new HashMap<>();
        params.put( "adminName", adminName );

        return executionEngine.execute( query, params );
    }

    public ExecutionResult findAccessibleCompanies( String adminName )
    {
        String query = "MATCH (admin:Administrator {name:{adminName}})\n" +
                "MATCH (admin)-[:MEMBER_OF]->()-[:ALLOWED_INHERIT]->()<-[:CHILD_OF*0..3]-(company)\n" +
                "WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\n" +
                "RETURN company.name AS company\n" +
                "UNION\n" +
                "MATCH (admin:Administrator {name:{adminName}})\n" +
                "MATCH (admin)-[:MEMBER_OF]->()-[:ALLOWED_DO_NOT_INHERIT]->(company)\n" +
                "RETURN company.name AS company";

        Map<String, Object> params = new HashMap<>();
        params.put( "adminName", adminName );

        return executionEngine.execute( query, params );
    }

    public ExecutionResult findAccessibleAccountsForCompany( String adminName, String companyName )
    {
        String query =
                "MATCH (admin:Administrator {name:{adminName}}),\n" +
                        "      (company:Company {name:{companyName}})\n" +
                        "MATCH (admin)-[:MEMBER_OF]->(group)-[:ALLOWED_INHERIT]->(company)\n" +
                        "      <-[:CHILD_OF*0..3]-(subcompany)<-[:WORKS_FOR]-(employee)-[:HAS_ACCOUNT]->(account)\n" +
                        "WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(subcompany))\n" +
                        "RETURN account.name AS account\n" +
                        "UNION\n" +
                        "MATCH (admin:Administrator {name:{adminName}}),\n" +
                        "      (company:Company {name:{companyName}})\n" +
                        "MATCH (admin)-[:MEMBER_OF]->(group)-[:ALLOWED_DO_NOT_INHERIT]->(company)\n" +
                        "      <-[:WORKS_FOR]-(employee)-[:HAS_ACCOUNT]->(account)\n" +
                        "RETURN account.name AS account";

        Map<String, Object> params = new HashMap<>();
        params.put( "adminName", adminName );
        params.put( "companyName", companyName );

        return executionEngine.execute( query, params );
    }

    public ExecutionResult findAdminForResource( String resourceName )
    {
        String query = "MATCH (resource:Resource {name:{resourceName}})\n" +
                       "MATCH p=(resource)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(company)\n" +
                       "        -[:CHILD_OF*0..3]->()<-[:ALLOWED_INHERIT]-()<-[:MEMBER_OF]-(admin)\n" +
                       "WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\n" +
                       "RETURN admin.name AS admin\n" +
                       "UNION\n" +
                       "MATCH (resource:Resource {name:{resourceName}})\n" +
                       "MATCH p=(resource)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(company)\n" +
                       "        <-[:ALLOWED_DO_NOT_INHERIT]-()<-[:MEMBER_OF]-(admin)\n" +
                       "RETURN admin.name AS admin";

        Map<String, Object> params = new HashMap<>();
        params.put( "resourceName", resourceName );

        return executionEngine.execute( query, params );
    }

    public ExecutionResult findAdminForCompany( String companyName )
    {
        String query = "MATCH (company:Company {name:{companyName}})\n" +
                "MATCH (company)-[:CHILD_OF*0..3]->()<-[:ALLOWED_INHERIT]-()<-[:MEMBER_OF]-(admin)\n" +
                "WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\n" +
                "RETURN admin.name AS admin\n" +
                "UNION\n" +
                "MATCH (company:Company {name:{companyName}})\n" +
                "MATCH (company)<-[:ALLOWED_DO_NOT_INHERIT]-()<-[:MEMBER_OF]-(admin)\n" +
                "RETURN admin.name AS admin";

        Map<String, Object> params = new HashMap<>();
        params.put( "companyName", companyName );

        return executionEngine.execute( query, params );
    }

    public ExecutionResult hasAccessToResource( String adminName, String resourceName )
    {
        String query =
                "MATCH (admin:Administrator {name:{adminName}}),\n" +
                        "      (resource:Resource {name:{resourceName}})\n" +
                        "MATCH p=(admin)-[:MEMBER_OF]->()-[:ALLOWED_INHERIT]->()<-[:CHILD_OF*0." +
                        ".3]-(company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource)\n" +
                        "WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\n" +
                        "RETURN count(p) AS accessCount\n" +
                        "UNION\n" +
                        "MATCH (admin:Administrator {name:{adminName}}),\n" +
                        "      (resource:Resource {name:{resourceName}})\n" +
                        "MATCH p=(admin)-[:MEMBER_OF]->()-[:ALLOWED_DO_NOT_INHERIT]->(company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource)\n" +
                        "RETURN count(p) AS accessCount";

        Map<String, Object> params = new HashMap<>();
        params.put( "adminName", adminName );
        params.put( "resourceName", resourceName );

        return executionEngine.execute( query, params );
    }


    public ExecutionResult hasAccessToIndexedResource( String adminName, String resourceName )
    {
        String query =
                "MATCH (admin:Administrator {name:{adminName}}),\n" +
                        "      c1=(company)<-[:CHILD_OF*0..3]-(:Company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource:Resource {name:{resourceName}})\n" +
                        "MATCH p=(admin)-[:MEMBER_OF]->()-[:ALLOWED_INHERIT]->(company)\n" +
                        "WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->(company))\n" +
                        "RETURN count(p) AS accessCount\n" +
//                        "RETURN p, company, admin, resource,c1\n" +
                        "UNION\n" +
                        "MATCH (admin:Administrator {name:{adminName}}),\n" +
                        "      c1=(company:Company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource:Resource {name:{resourceName}})\n" +
                        "MATCH p=(admin)-[:MEMBER_OF]->()-[:ALLOWED_DO_NOT_INHERIT]->(company)\n" +
                        "RETURN count(p) AS accessCount\n";
//                        "RETURN p, company, admin, resource,c1\n";

        Map<String, Object> params = new HashMap<>();
        params.put( "adminName", adminName );
        params.put( "resourceName", resourceName );

        return executionEngine.execute( query, params );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/AccessControlWithRelationshipPropertiesQueries.java
================================================
package org.neo4j.graphdatabases.queries;

import java.util.HashMap;
import java.util.Map;

import org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;
import org.neo4j.graphdatabases.queries.helpers.QueryUnionExecutionEngine;
import org.neo4j.graphdatabases.queries.helpers.QueryUnionExecutionResult;

public class AccessControlWithRelationshipPropertiesQueries
{
    private final QueryUnionExecutionEngine executionEngine;

    public AccessControlWithRelationshipPropertiesQueries( ExecutionEngineWrapper executionEngine )
    {
        this.executionEngine = new QueryUnionExecutionEngine( executionEngine );
    }

    public QueryUnionExecutionResult findAccessibleResources( String adminName )
    {
        String inheritedQuery = "MATCH (admin:Administrator {name:{adminName}})\n" +
                "MATCH paths=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->()<-[:CHILD_OF*0..3]-()" +
                "<-[:WORKS_FOR]-(employee)-[:HAS_ACCOUNT]->(account)\n" +
                "WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-()" +
                "<-[:WORKS_FOR]-employee-[:HAS_ACCOUNT]->account)\n" +
                "RETURN paths";
        String notInheritedQuery = "MATCH (admin:Administrator {name:{adminName}})\n" +
                "MATCH paths=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->()" +
                "<-[:WORKS_FOR]-employee-[:HAS_ACCOUNT]->account\n" +
                "WHERE (permission.inherit=false)\n" +
                "RETURN paths";

        Map<String, Object> params = new HashMap<>();
        params.put( "adminName", adminName );

        return executionEngine.execute( params, inheritedQuery, notInheritedQuery );

    }
    // todo no result for query1 ?
    public QueryUnionExecutionResult findAccessibleCompanies( String adminName )
    {
        String inheritedQuery = "MATCH (admin:Administrator {name:{adminName}})\n" +
                "MATCH admin-[:MEMBER_OF]->()-[permission:ALLOWED]->()<-[:CHILD_OF*0..3]-company\n" +
                "WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0." +
                ".3]-company)\n" +
                "RETURN company";

        String notInheritedQuery = "MATCH (admin:Administrator {name:{adminName}})\n" +
                "MATCH admin-[:MEMBER_OF]->()-[permission:ALLOWED]->(company)\n" +
                "WHERE (permission.inherit=false)\n" +
                "RETURN company";

        Map<String, Object> params = new HashMap<>();
        params.put( "adminName", adminName );

        return executionEngine.execute( params, inheritedQuery, notInheritedQuery );
    }

    public QueryUnionExecutionResult findAccessibleAccountsForCompany( String adminName,
                                                                           String companyName )
    {
        String inheritedQuery = "MATCH (admin:Administrator {name:{adminName}}),\n" +
                "                      (company:Company{name:{companyName}})\n" +
                "MATCH admin-[:MEMBER_OF]->group-[permission:ALLOWED]->company<-[:CHILD_OF*0." +
                ".3]-subcompany<-[:WORKS_FOR]-employee-[:HAS_ACCOUNT]->account\n" +
                "WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0." +
                ".3]-subcompany)\n" +
                "RETURN account";

        String notInheritedQuery = "MATCH (admin:Administrator {name:{adminName}}),\n" +
                "                         (company:Company{name:{companyName}})\n" +
                "MATCH admin-[:MEMBER_OF]->group-[permission:ALLOWED]->company<-[:WORKS_FOR]-employee-[:HAS_ACCOUNT" +
                "]->account\n" +
                "WHERE (permission.inherit=false)\n" +
                "RETURN account";

        Map<String, Object> params = new HashMap<>();
        params.put( "adminName", adminName );
        params.put( "companyName", companyName );

        return executionEngine.execute( params, inheritedQuery, notInheritedQuery );
    }

    // todo no result for query2
    public QueryUnionExecutionResult findAdminForResource( String resourceName )
    {
        String inheritedQuery = "MATCH (resource:Resource {name:{resourceName}}) \n" +
                        "MATCH p=resource-[:WORKS_FOR|HAS_ACCOUNT*1..2]-company-[:CHILD_OF*0..3]->()<-[permission:ALLOWED]-()" +
                        "<-[:MEMBER_OF]-admin\n" +
                        "WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-company)\n" +
                        "RETURN DISTINCT admin, p";

                String notInheritedQuery = "MATCH (resource:Resource{name:{resourceName}})\n" +
                        "MATCH p=resource-[:WORKS_FOR|HAS_ACCOUNT*1..2]-company<-[permission:ALLOWED]-()" +
                        "<-[:MEMBER_OF]-admin\n" +
                        "WHERE (permission.inherit=false)\n" +
                        "RETURN DISTINCT admin, p";

                Map<String, Object> params = new HashMap<>();
                params.put( "resourceName", resourceName );

                return executionEngine.execute( params, inheritedQuery, notInheritedQuery );
    }

    public QueryUnionExecutionResult findAdminForCompany( String companyName )
    {
        String inheritedQuery = "MATCH (company:Company{name:{companyName}})\n" +
                        "MATCH p=company-[:CHILD_OF*0..3]->()<-[permission:ALLOWED]-()<-[:MEMBER_OF]-admin\n" +
                        "WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-company)\n" +
                        "RETURN DISTINCT admin, p";

                String notInheritedQuery = "MATCH (company:Company{name:{companyName}})\n" +
                        "MATCH p=company<-[permission:ALLOWED]-()<-[:MEMBER_OF]-admin\n" +
                        "WHERE (permission.inherit=false)\n" +
                        "RETURN DISTINCT admin, p";

                Map<String, Object> params = new HashMap<>();
                params.put( "companyName", companyName );

                return executionEngine.execute( params, inheritedQuery, notInheritedQuery );
    }

    public QueryUnionExecutionResult hasAccessToResource( String adminName, String resourceName )
    {
        String inheritedQuery =
                        "MATCH (admin:Administrator {name:{adminName}}),\n" +
                                "      (resource:Resource{name:{resourceName}})\n" +
                                "MATCH p=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->()<-[:CHILD_OF*0." +
                                ".3]-(company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource)\n" +
                                "WHERE (permission.inherit=true) AND NOT (admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company)\n" +
                                "RETURN COUNT(p) AS accessCount";

                String notInheritedQuery =
                        "MATCH (admin:Administrator {name:{adminName}}),\n" +
                                "      (resource:Resource{name:{resourceName}})\n" +
                                "MATCH p=admin-[:MEMBER_OF]->()-[permission:ALLOWED]->company-[:WORKS_FOR|HAS_ACCOUNT*1..2]-resource\n" +
                                "WHERE (permission.inherit=false)\n" +
                                "RETURN COUNT(p) AS accessCount";

                Map<String, Object> params = new HashMap<>();
                params.put( "adminName", adminName );
                params.put( "resourceName", resourceName );

                return executionEngine.execute( params, inheritedQuery, notInheritedQuery );
    }

    public QueryUnionExecutionResult hasAccessToIndexedResource( String adminName, String resourceName )
    {
        String inheritedQuery =
                        "MATCH (admin:Administrator {name:{adminName}}),\n" +
                                "      (company)<-[:CHILD_OF*0..3]-(:Company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource:Resource {name:{resourceName}})\n" +
                                "MATCH p=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->(company)\n" +
                                "WHERE (permission.inherit=true) AND NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\n" +
                                "RETURN COUNT(p) AS accessCount";

                String notInheritedQuery =
                        "MATCH (admin:Administrator {name:{adminName}}),\n" +
                                "      (company)<-[:CHILD_OF*0..3]-(:Company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource:Resource {name:{resourceName}})\n" +
                                "MATCH p=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->(company)\n" +
                                "WHERE (permission.inherit=false)\n" +
                                "RETURN COUNT(p) AS accessCount";

                Map<String, Object> params = new HashMap<>();
                params.put( "adminName", adminName );
                params.put( "resourceName", resourceName );

                return executionEngine.execute( params, inheritedQuery, notInheritedQuery );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/EmailQueries.java
================================================
package org.neo4j.graphdatabases.queries;

import java.util.HashMap;
import java.util.Map;

import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;
import org.neo4j.graphdb.GraphDatabaseService;

public class EmailQueries
{
    private final GraphDatabaseService db;
    private final ExecutionEngineWrapper executionEngineWrapper;

    public EmailQueries( GraphDatabaseService db, ExecutionEngineWrapper executionEngineWrapper )
    {
        this.db = db;
        this.executionEngineWrapper = executionEngineWrapper;
    }

    public ExecutionResult suspectBehaviour()
    {
        String query =
                "MATCH (bob:User {username:'Bob'})-[:SENT]->(email)-[:CC]->(alias),\n" +
                "      (alias)-[:ALIAS_OF]->(bob)\n" +
                "RETURN email.id";

        Map<String, Object> params = new HashMap<String, Object>();

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult suspectBehaviour2()
    {
        String query =
                "MATCH p=(email:Email {id:'6'})<-[:REPLY_TO*1..4]-()<-[:SENT]-(replier)\n" +
                "RETURN replier.username AS replier, length(p) - 1 AS depth ORDER BY depth";

        Map<String, Object> params = new HashMap<String, Object>();

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult suspectBehaviour3()
    {
        String query =
                "MATCH (email:Email {id:'11'})<-[f:FORWARD_OF*]-() \n" +
                "RETURN count(f)";

        Map<String, Object> params = new HashMap<String, Object>();

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult lossyDb()
    {
        String query =
                "MATCH (bob:User {username:'Bob'})-[e:EMAILED]->(charlie:User {username:'Charlie'})\n" +
                "RETURN e";

        Map<String, Object> params = new HashMap<String, Object>();

        return executionEngineWrapper.execute( query, params );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/LogisticsQueries.java
================================================
package org.neo4j.graphdatabases.queries;

import java.util.HashMap;
import java.util.Map;

import org.joda.time.Interval;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;
import org.neo4j.graphdatabases.queries.traversals.ParcelRouteCalculator;
import org.neo4j.graphdatabases.queries.traversals.SimpleParcelRouteCalculator;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;

public class LogisticsQueries
{
    private final ExecutionEngineWrapper executionEngineWrapper;
    private final ParcelRouteCalculator parcelRouteCalculator;
    private final SimpleParcelRouteCalculator simpleParcelRouteCalculator;

    public LogisticsQueries( GraphDatabaseService db, ExecutionEngineWrapper executionEngineWrapper )
    {
        this.executionEngineWrapper = executionEngineWrapper;
        this.parcelRouteCalculator = new ParcelRouteCalculator( db );
        this.simpleParcelRouteCalculator = new SimpleParcelRouteCalculator( db );
    }

    public Iterable<Node> findShortestPathWithParcelRouteCalculator( String start, String end, Interval interval )
    {
        return parcelRouteCalculator.calculateRoute( start, end, interval );
    }

    public Iterable<Node> findShortestPathWithSimpleParcelRouteCalculator( String start, String end, Interval interval )
    {
        return simpleParcelRouteCalculator.calculateRoute( start, end, interval );
    }


    public ExecutionResult findShortestPathWithCypherReduce( String start, String end, Interval interval )
    {
        String query =
                "MATCH (s:Location {name:{startLocation}}),\n" +
                "      (e:Location {name:{endLocation}})\n" +
                "MATCH upLeg = (s)<-[:DELIVERY_ROUTE*1..2]-(db1)\n" +
                "WHERE all(r in relationships(upLeg)\n" +
                "          WHERE r.start_date <= {intervalStart}\n" +
                "          AND r.end_date >= {intervalEnd})\n" +
                "WITH  e, upLeg, db1\n" +
                "MATCH downLeg = (db2)-[:DELIVERY_ROUTE*1..2]->(e)\n" +
                "WHERE all(r in relationships(downLeg)\n" +
                "          WHERE r.start_date <= {intervalStart}\n" +
                "          AND r.end_date >= {intervalEnd})\n" +
                "WITH  db1, db2, upLeg, downLeg\n" +
                "MATCH topRoute = (db1)<-[:CONNECTED_TO]-()-[:CONNECTED_TO*1..3]-(db2)\n" +
                "WHERE all(r in relationships(topRoute)\n" +
                "          WHERE r.start_date <= {intervalStart}\n" +
                "          AND r.end_date >= {intervalEnd})\n" +
                "WITH  upLeg, downLeg, topRoute,\n" +
                "      reduce(weight=0, r in relationships(topRoute) | weight+r.cost) AS score\n" +
                "      ORDER BY score ASC\n" +
                "      LIMIT 1\n" +
                "RETURN (nodes(upLeg) + tail(nodes(topRoute)) + tail(nodes(downLeg))) AS n";

        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "startLocation", start );
        params.put( "endLocation", end );
        params.put( "intervalStart", interval.getStartMillis() );
        params.put( "intervalEnd", interval.getEndMillis() );


        return executionEngineWrapper.execute( query, params );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/ShakespeareQueries.java
================================================
package org.neo4j.graphdatabases.queries;

import java.util.HashMap;
import java.util.Map;

import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;

public class ShakespeareQueries
{
    private final ExecutionEngineWrapper executionEngineWrapper;

    public ShakespeareQueries( ExecutionEngineWrapper executionEngineWrapper )
    {
        this.executionEngineWrapper = executionEngineWrapper;
    }

    public ExecutionResult theatreCityBard()
    {
        String query =
                "MATCH (theater:Venue {name:'Theatre Royal'}), \n" +
                        "      (newcastle:City {name:'Newcastle'}), \n" +
                        "      (bard:Author {lastname:'Shakespeare'})\n" +
                        "RETURN theater.name AS theater, newcastle.name AS city, bard.lastname AS bard";

        Map<String, Object> params = new HashMap<String, Object>();

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult allPlays()
    {
        String query =
                "MATCH (theater:Venue {name:'Theatre Royal'}), \n" +
                        "      (newcastle:City {name:'Newcastle'}), \n" +
                        "      (bard:Author {lastname:'Shakespeare'})\n" +
                        "MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)\n" +
                        "      <-[:VENUE]-()-[:PERFORMANCE_OF]->()-[:PRODUCTION_OF]->\n" +
                        "      (play)<-[:WROTE_PLAY]-(bard)\n" +
                        "RETURN DISTINCT play.title AS play";

        Map<String, Object> params = new HashMap<String, Object>();

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult latePeriodPlays()
    {
        String query =
                "MATCH (theater:Venue {name:'Theatre Royal'}), \n" +
                        "      (newcastle:City {name:'Newcastle'}), \n" +
                        "      (bard:Author {lastname:'Shakespeare'})\n" +
                        "MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)<-[:VENUE]-()-[:PERFORMANCE_OF]->()\n" +
                        "      -[:PRODUCTION_OF]->(play)<-[w:WROTE_PLAY]-(bard)\n" +
                        "WHERE w.year > 1608\n" +
                        "RETURN DISTINCT play.title AS play";

        Map<String, Object> params = new HashMap<String, Object>();

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult orderedByPerformance()
    {
        String query =
                "MATCH (theater:Venue {name:'Theatre Royal'}), \n" +
                        "      (newcastle:City {name:'Newcastle'}), \n" +
                        "      (bard:Author {lastname:'Shakespeare'})\n" +
                        "MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)<-[:VENUE]-()-[p:PERFORMANCE_OF]->()\n" +
                        "      -[:PRODUCTION_OF]->(play)<-[:WROTE_PLAY]-(bard)\n" +
                        "RETURN   play.title AS play, count(p) AS performance_count \n" +
                        "ORDER BY performance_count DESC";

        Map<String, Object> params = new HashMap<String, Object>();

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult exampleOfWith()
    {
        String query =
                       "MATCH (bard:Author {lastname:'Shakespeare'})\n" +
                               "MATCH (bard)-[w:WROTE_PLAY]->(play)\n" +
                               "WITH play \n" +
                               "ORDER BY w.year DESC \n" +
                               "RETURN collect(play.title) AS plays";

               Map<String, Object> params = new HashMap<String, Object>();

               return executionEngineWrapper.execute( query, params );
    }

}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/ShakespeareQueriesUsingAutoIndexes.java
================================================
package org.neo4j.graphdatabases.queries;

import java.util.HashMap;
import java.util.Map;

import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;

public class ShakespeareQueriesUsingAutoIndexes
{
    private final ExecutionEngineWrapper executionEngineWrapper;
    
        public ShakespeareQueriesUsingAutoIndexes( ExecutionEngineWrapper executionEngineWrapper )
        {
            this.executionEngineWrapper = executionEngineWrapper;
        }
    
        public ExecutionResult theatreCityBard()
        {
            String query =
                    "START theater=node:node_auto_index(name='Theatre Royal'), \n" +
                            "      newcastle=node:node_auto_index(name='Newcastle'), \n" +
                            "      bard=node:node_auto_index(lastname='Shakespeare')\n" +
                            "RETURN theater.name AS theater, newcastle.name AS city, bard.lastname AS bard";
    
            Map<String, Object> params = new HashMap<String, Object>();
    
            return executionEngineWrapper.execute( query, params );
        }
    
        public ExecutionResult allPlays()
        {
            String query =
                    "START theater=node:node_auto_index(name='Theatre Royal'), \n" +
                            "      newcastle=node:node_auto_index(name='Newcastle'), \n" +
                            "      bard=node:node_auto_index(lastname='Shakespeare')\n" +
                            "MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)\n" +
                            "      <-[:VENUE]-()-[:PERFORMANCE_OF]->()-[:PRODUCTION_OF]->\n" +
                            "      (play)<-[:WROTE_PLAY]-(bard)\n" +
                            "RETURN DISTINCT play.title AS play";
    
            Map<String, Object> params = new HashMap<String, Object>();
    
            return executionEngineWrapper.execute( query, params );
        }
    
        public ExecutionResult latePeriodPlays()
        {
            String query =
                    "START theater=node:node_auto_index(name='Theatre Royal'), \n" +
                            "      newcastle=node:node_auto_index(name='Newcastle'), \n" +
                            "      bard=node:node_auto_index(lastname='Shakespeare')\n" +
                            "MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)<-[:VENUE]-()-[:PERFORMANCE_OF]->()\n" +
                            "      -[:PRODUCTION_OF]->(play)<-[w:WROTE_PLAY]-(bard)\n" +
                            "WHERE w.year > 1608\n" +
                            "RETURN DISTINCT play.title AS play";
    
            Map<String, Object> params = new HashMap<String, Object>();
    
            return executionEngineWrapper.execute( query, params );
        }
    
        public ExecutionResult orderedByPerformance()
        {
            String query =
                    "START theater=node:node_auto_index(name='Theatre Royal'), \n" +
                            "      newcastle=node:node_auto_index(name='Newcastle'), \n" +
                            "      bard=node:node_auto_index(lastname='Shakespeare')\n" +
                            "MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)<-[:VENUE]-()-[p:PERFORMANCE_OF]->()\n" +
                            "      -[:PRODUCTION_OF]->(play)<-[:WROTE_PLAY]-(bard)\n" +
                            "RETURN   play.title AS play, count(p) AS performance_count \n" +
                            "ORDER BY performance_count DESC";
    
            Map<String, Object> params = new HashMap<String, Object>();
    
            return executionEngineWrapper.execute( query, params );
        }
    
        public ExecutionResult exampleOfWith()
        {
            String query =
                           "START bard=node:node_auto_index(lastname='Shakespeare')\n" +
                                   "MATCH (bard)-[w:WROTE_PLAY]->(play)\n" +
                                   "WITH play \n" +
                                   "ORDER BY w.year DESC \n" +
                                   "RETURN collect(play.title) AS plays";
    
                   Map<String, Object> params = new HashMap<String, Object>();
    
                   return executionEngineWrapper.execute( query, params );
        }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/SimpleSocialNetworkQueries.java
================================================
package org.neo4j.graphdatabases.queries;

import java.util.HashMap;
import java.util.Map;

import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdb.GraphDatabaseService;

public class SimpleSocialNetworkQueries
{
    private final ExecutionEngine executionEngine;

    public SimpleSocialNetworkQueries( GraphDatabaseService db )
    {
        this.executionEngine = new ExecutionEngine( db );
    }

    public ExecutionResult pathBetweenTwoFriends( String firstUser, String secondUser )
    {
        String query = "MATCH (first:User{name:{firstUser}}),\n" +
                " (second:User{name:{secondUser}})\n" +
                "MATCH p=shortestPath(first-[*..4]-second)\n" +
                "RETURN length(p) AS depth";

        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "firstUser", firstUser );
        params.put( "secondUser", secondUser );

        return executionEngine.execute( query, params );
    }

    public ExecutionResult friendOfAFriendToDepth4(String name)
    {
        String query =
            "MATCH (person:User {name:{name}})-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-(friend)\n" +
            "RETURN friend.name AS name";

        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "name", name );

        return executionEngine.execute( query, params );

    }

}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/SocialNetworkQueries.java
================================================
package org.neo4j.graphdatabases.queries;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.traversal.Evaluation;
import org.neo4j.graphdb.traversal.Evaluator;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.graphdb.traversal.Uniqueness;
import org.neo4j.helpers.collection.IteratorUtil;

import static org.neo4j.graphdb.DynamicRelationshipType.withName;

public class SocialNetworkQueries
{
    public static final Label USER = DynamicLabel.label("User");
    public static final Label TOPIC = DynamicLabel.label("Topic");
    private final GraphDatabaseService db;
    private final ExecutionEngineWrapper executionEngineWrapper;


    public SocialNetworkQueries( GraphDatabaseService db, ExecutionEngineWrapper executionEngineWrapper )
    {
        this.db = db;
        this.executionEngineWrapper = executionEngineWrapper;
    }

    public ExecutionResult sharedInterestsSameCompany( String userName )
    {
        String query =
                "MATCH  (subject:User {name:{name}})\n" +
                        "MATCH  (subject)-[:WORKS_FOR]->(company)<-[:WORKS_FOR]-(person),\n" +
                        "       (subject)-[:INTERESTED_IN]->(interest)<-[:INTERESTED_IN]-(person)\n" +
                        "RETURN person.name AS name,\n" +
                        "       count(interest) AS score,\n" +
                        "       collect(interest.name) AS interests\n" +
                        "ORDER BY score DESC";

        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "name", userName );

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult sharedInterestsAllCompanies( String userName, int limit )
    {
        String query =
                "MATCH  (subject:User {name:{name}})\n" +
                        "MATCH  (subject)-[:INTERESTED_IN]->(interest)<-[:INTERESTED_IN]-(person),\n" +
                        "       (person)-[:WORKS_FOR]->(company)\n" +
                        "RETURN person.name AS name,\n" +
                        "       company.name AS company,\n" +
                        "       count(interest) AS score,\n" +
                        "       collect(interest.name) AS interests\n" +
                        "ORDER BY score DESC";

        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "name", userName );
        params.put( "resultLimit", limit );

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult sharedInterestsAlsoInterestedInTopic( String userName, String topicLabel )
    {
        String query = "MATCH (person:User {name:{name}})\n" +
                "MATCH (person)-[:INTERESTED_IN]->()<-[:INTERESTED_IN]-(colleague)-[:INTERESTED_IN]->(topic)\n" +
                "WHERE topic.name={topic}\n" +
                "WITH  colleague\n" +
                "MATCH (colleague)-[:INTERESTED_IN]->(allTopics)\n" +
                "RETURN colleague.name AS name, collect(distinct(allTopics.name)) AS topics";


        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "name", userName );
        params.put( "topicQuery", "name:" + topicLabel );
        params.put( "topic", topicLabel );

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult friendOfAFriendWithInterest( String userName, String topicLabel, int limit )
    {
        String query =
                "MATCH (subject:User {name:{name}})\n" +
                        "MATCH p=(subject)-[:WORKED_ON]->()-[:WORKED_ON*0..2]-()\n" +
                        "        <-[:WORKED_ON]-(person)-[:INTERESTED_IN]->(interest)\n" +
                        "WHERE person<>subject AND interest.name={topic}\n" +
                        "WITH DISTINCT person.name AS name,\n" +
                        "     min(length(p)) as pathLength\n" +
                        "ORDER BY pathLength ASC\n" +
                        "LIMIT {resultLimit}\n" +
                        "RETURN name, pathLength";

        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "name", userName );
        params.put( "topicQuery", "name:" + topicLabel );
        params.put( "topic", topicLabel );
        params.put( "resultLimit", limit );

        return executionEngineWrapper.execute( query, params );
    }

    public Collection<Node> friendOfAFriendWithInterestTraversalFramework( String userName,
                                                                           final String topicLabel,
                                                                           int limit )
    {
        Node user = IteratorUtil.single(db.findNodesByLabelAndProperty(USER, "name", userName));
        final Node topic = IteratorUtil.single(db.findNodesByLabelAndProperty(TOPIC, "name", topicLabel));

        final RelationshipType interested_in = withName( "INTERESTED_IN" );
        final RelationshipType worked_on = withName( "WORKED_ON" );

        TraversalDescription traversalDescription = db.traversalDescription()
                .breadthFirst()
                .uniqueness( Uniqueness.NODE_GLOBAL )
                .relationships( worked_on )
                .evaluator( new
                            Evaluator()
                            {
                                @Override
                                public Evaluation evaluate( Path path )
                                {
                                    if ( path.length() == 0 )
                                    {
                                        return Evaluation.EXCLUDE_AND_CONTINUE;
                                    }

                                    Node currentNode = path.endNode();


                                    if ( path.length() % 2 == 0 )
                                    {
                                        for ( Relationship rel : currentNode.getRelationships(
                                                interested_in,
                                                Direction.OUTGOING ) )
                                        {
                                            if ( rel.getEndNode().equals( topic ) )
                                            {
                                                if ( path.length() % 4 == 0 )
                                                {
                                                    return Evaluation.INCLUDE_AND_PRUNE;
                                                }
                                                else
                                                {
                                                    return Evaluation.INCLUDE_AND_CONTINUE;
                                                }

                                            }
                                        }
                                    }

                                    if ( path.length() % 4 == 0 )
                                    {
                                        return Evaluation.EXCLUDE_AND_PRUNE;
                                    }
                                    else
                                    {
                                        return Evaluation.EXCLUDE_AND_CONTINUE;
                                    }
                                }
                            } );

        Iterable<Node> nodes = traversalDescription.traverse( user ).nodes();


        Iterator<Node> iterator = nodes.iterator();
        int nodeCount = 0;
        List<Node> results = new ArrayList<Node>();

        while ( iterator.hasNext() && nodeCount++ < limit )
        {
            results.add( iterator.next() );
        }

        return results;
    }

    public ExecutionResult friendOfAFriendWithMultipleInterest( String userName, int limit, String... interestLabels )
    {
        String query =
                "MATCH (subject:User {name:{name}})\n" +
                        "MATCH p=(subject)-[:WORKED_ON]->()-[:WORKED_ON*0..2]-()\n" +
                        "        <-[:WORKED_ON]-(person)-[:INTERESTED_IN]->(interest)\n" +
                        "WHERE person<>subject AND interest.name IN {interests}\n" +
                        "WITH person, interest, min(length(p)) as pathLength\n" +
                        "ORDER BY interest.name\n"+
                        "RETURN person.name AS name,\n" +
                        "       count(interest) AS score,\n" +
                        "       collect(interest.name) AS interests,\n" +
                        "       ((pathLength - 1)/2) AS distance\n" +
                        "ORDER BY score DESC\n" +
                        "LIMIT {resultLimit}";

        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "name", userName );
        params.put( "interests", interestLabels );
        params.put( "resultLimit", limit );

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult friendWorkedWithFriendWithInterests( String userName, int limit, String... interestLabels )
    {
        String query = "MATCH (subject:User {name:{name}})\n" +
                "MATCH p=(subject)-[:WORKED_WITH*0..1]-()-[:WORKED_WITH]-(person)\n" +
                "        -[:INTERESTED_IN]->(interest)\n" +
                "WHERE person<>subject AND interest.name IN {interests}\n" +
                "WITH person, interest, min(length(p)) as pathLength\n" +
                "RETURN person.name AS name,\n" +
                "       count(interest) AS score,\n" +
                "       collect(interest.name) AS interests,\n" +
                "       (pathLength - 1) AS distance\n" +
                "ORDER BY score DESC\n" +
                "LIMIT {resultLimit}";


        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "name", userName );
        params.put( "userQuery", "name:" + userName );
        params.put( "interests", interestLabels );
        params.put( "resultLimit", limit );

        StringBuilder builder = new StringBuilder();
        builder.append( "[" );
        for ( int i = 0; i < interestLabels.length; i++ )
        {
            builder.append( "'" );
            builder.append( interestLabels[i] );
            builder.append( "'" );
            if ( i < interestLabels.length - 1 )
            {
                builder.append( "," );
            }
        }
        builder.append( "]" );
        params.put( "topicQuery", builder.toString() );

        return executionEngineWrapper.execute( query, params );
    }

    // todo no result?
    public ExecutionResult createWorkedWithRelationships( String userName )
    {

        String query = "MATCH (subject:User {name:{name}})\n" +
                "MATCH (subject)-[:WORKED_ON]->()<-[:WORKED_ON]-(person)\n" +
                "WHERE NOT((subject)-[:WORKED_WITH]-(person))\n" +
                "WITH DISTINCT subject, person\n" +
                "CREATE UNIQUE (subject)-[:WORKED_WITH]-(person)\n" +
                "RETURN subject.name AS startName, person.name AS endName";


        Map<String, Object> params = new HashMap<String, Object>();
        params.put( "name", userName );

        return executionEngineWrapper.execute( query, params );
    }

    public ExecutionResult getAllUsers()
    {
        String query = "MATCH (subject:User)\n" +
                "RETURN subject.name AS name";

        return executionEngineWrapper.execute( query, new HashMap<String, Object>() );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/DbUtils.java
================================================
package org.neo4j.graphdatabases.queries.helpers;

import java.util.HashMap;
import java.util.Map;

import org.neo4j.graphdatabases.queries.testing.TestOutputWriter;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.tooling.GlobalGraphOperations;

import static org.neo4j.helpers.collection.IteratorUtil.count;

public class DbUtils
{
    public static GraphDatabaseService existingDB( String dir )
    {
        GraphDatabaseService db = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder( dir )
                .setConfig( DbUtils.dbConfig() )
                .newGraphDatabase();

        if ( countRelTypes(db) == 0 )
        {
            throw new IllegalStateException( "Performance dataset does not exist. See the Readme for instructions on " +
                    "generating a sample dataset." );
        }

        return db;
    }

    public static int countRelTypes(GraphDatabaseService db) {
        try ( Transaction tx = db.beginTx() )
        {
            int count = count(GlobalGraphOperations.at(db).getAllRelationshipTypes());
            tx.success();
            return count;
        }
    }

    public static Map<String, String> dbConfig()
    {
        Map<String, String> params = new HashMap<String, String>();
        params.put( "dump_configuration", "true" );
        params.put( "cache_type", "gcr" );
        params.put( "allow_store_upgrade", "true" );
        params.put( "online_backup_enabled", "false" );
        return params;
    }

    public static void warmCache( GraphDatabaseService db, TestOutputWriter writer )
    {
        writer.writeln( "BEGIN: Warming cache" );

        try ( Transaction tx = db.beginTx() )
        {
            for ( Relationship r : GlobalGraphOperations.at( db ).getAllRelationships() )
            {
                r.getPropertyKeys();
                r.getStartNode();
            }
            for ( Node n : GlobalGraphOperations.at( db ).getAllNodes() )
            {
                n.getPropertyKeys();
                for ( Relationship relationship : n.getRelationships() )
                {
                    relationship.getStartNode();
                }
            }
            tx.success();
        }
        writer.writeln( "\nEND  : Warming cache\n" );
    }

    public static int numberOfItemsWithLabel(GraphDatabaseService db, String labelName)
    {
        try ( Transaction tx = db.beginTx() )
        {
            GlobalGraphOperations ops = GlobalGraphOperations.at(db);
            int count = count(ops.getAllNodesWithLabel(DynamicLabel.label(labelName)));
            tx.success();
            return count;
        }
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionEngineWrapper.java
================================================
package org.neo4j.graphdatabases.queries.helpers;

import java.util.Map;

import org.neo4j.cypher.javacompat.ExecutionResult;


public interface ExecutionEngineWrapper
{
    ExecutionResult execute(String query, Map<String, Object> params);
    ExecutionResult execute(String query, Map<String, Object> params, int index);
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionResultIterator.java
================================================
package org.neo4j.graphdatabases.queries.helpers;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;

import org.neo4j.cypher.javacompat.ExecutionResult;

public class ExecutionResultIterator
{
    public static ExecutionResultIterator newQueryIterators( List<String> queries,
                                                             ExecutionEngineWrapper executionEngine,
                                                             Map<String, Object> params )
    {
        Queue<String> queue = new LinkedList<String>( queries );
        String query = queue.poll();
        ExecutionResult executionResult = executionEngine.execute( query, params, 1 );
        return new ExecutionResultIterator( executionResult, queue, executionEngine, params, 2 );
    }

    private final ExecutionResult currentResult;
    private final Queue<String> queries;
    private final ExecutionEngineWrapper executionEngine;
    private final Map<String, Object> params;
    private final int queryIndex;

    private ExecutionResultIterator( ExecutionResult currentResult,
                                     Queue<String> queries,
                                     ExecutionEngineWrapper executionEngine,
                                     Map<String, Object> params,
                                     int queryIndex )
    {
        this.currentResult = currentResult;
        this.queries = queries;
        this.executionEngine = executionEngine;
        this.params = params;
        this.queryIndex = queryIndex;
    }

    public Iterator<Map<String, Object>> iterator()
    {
        return currentResult.iterator();
    }

    public boolean hasNextIterator()
    {
        return !queries.isEmpty();
    }

    public ExecutionResultIterator getNextIterator()
    {
        String query = queries.poll();
        ExecutionResult executionResult = executionEngine.execute( query, params, queryIndex );
        return new ExecutionResultIterator( executionResult, queries, executionEngine, params, queryIndex + 1 );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionResultsIterator.java
================================================
package org.neo4j.graphdatabases.queries.helpers;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

public class ExecutionResultsIterator implements Iterator<Map<String, Object>>
{
    private ExecutionResultIterator executionResultIterator;

    public ExecutionResultsIterator( List<String> queries,
                                     ExecutionEngineWrapper executionEngine,
                                     Map<String, Object> params )
    {
        executionResultIterator = ExecutionResultIterator.newQueryIterators( queries, executionEngine, params );
    }

    @Override
    public boolean hasNext()
    {
        if ( executionResultIterator.iterator().hasNext() )
        {
            return true;
        }

        if ( !executionResultIterator.hasNextIterator() )
        {
            return false;
        }

        executionResultIterator = executionResultIterator.getNextIterator();

        return hasNext();
    }

    @Override
    public Map<String, Object> next()
    {
        if ( hasNext() )
        {
            return executionResultIterator.iterator().next();
        }

        throw new NoSuchElementException();
    }

    @Override
    public void remove()
    {
        throw new UnsupportedOperationException();
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/IndexNodeByOtherNodeIndexer.java
================================================
package org.neo4j.graphdatabases.queries.helpers;

import org.neo4j.graphdb.*;
import org.neo4j.graphdb.index.Index;

public class IndexNodeByOtherNodeIndexer
{
    private final GraphTraversal findIndexableNodes;
    private final GraphTraversal findOtherNodesForIndexableNode;
    private final String indexName;
    private final String indexKey;
    private final String nodeToIndexByPropertyName;

    public IndexNodeByOtherNodeIndexer( GraphTraversal findIndexableNodes, GraphTraversal
            findOtherNodesForIndexableNode,
                                        String indexName, String indexKey, String nodeToIndexByPropertyName )

    {
        this.findIndexableNodes = findIndexableNodes;
        this.findOtherNodesForIndexableNode = findOtherNodesForIndexableNode;
        this.indexName = indexName;
        this.indexKey = indexKey;
        this.nodeToIndexByPropertyName = nodeToIndexByPropertyName;
    }

    public void execute( GraphDatabaseService db, Node startNode, int batchSize )
    {

        Transaction tx = db.beginTx();

        Label label = DynamicLabel.label(indexName);
        Iterable<Node> indexableNodes = findIndexableNodes.execute( startNode );
        int currentBatchSize = 0;

        try
        {
            for ( Node indexableNode : indexableNodes )
            {
                Iterable<Node> nodesToIndexBy = findOtherNodesForIndexableNode.execute( indexableNode );
                for ( Node node : nodesToIndexBy )
                {
                    indexableNode.addLabel(label);
                    indexableNode.setProperty(indexKey, node.getProperty( nodeToIndexByPropertyName ) );
                    if ( currentBatchSize++ > batchSize )
                    {
                        tx.success();
                        tx.close();
                        tx = db.beginTx();
                        currentBatchSize = 0;
                    }
                }
            }
            tx.success();
        }
        finally
        {
            tx.close();
        }

    }

    public interface GraphTraversal
    {
        Iterable<Node> execute( Node startNode );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionEngine.java
================================================
package org.neo4j.graphdatabases.queries.helpers;

import static java.util.Arrays.asList;

import java.util.HashMap;
import java.util.Map;

public class QueryUnionExecutionEngine
{
    private final ExecutionEngineWrapper executionEngine;

    public QueryUnionExecutionEngine( ExecutionEngineWrapper executionEngine )
    {
        this.executionEngine = executionEngine;
    }

    public QueryUnionExecutionResult execute( final Map<String, Object> params, final String... queries )
    {
        if ( queries.length == 0 )
        {
            throw new IllegalArgumentException( "Must supply one or more queries." );
        }

        return new QueryUnionExecutionResult( asList( queries ), executionEngine, params );
    }

    public Iterable<Map<String, Object>> execute( final String... queries )
    {
        return execute( new HashMap<String, Object>(), queries );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionResult.java
================================================
package org.neo4j.graphdatabases.queries.helpers;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class QueryUnionExecutionResult implements Iterable<Map<String, Object>>
{
    private final List<String> queries;
    private final ExecutionEngineWrapper executionEngine;
    private final Map<String, Object> params;

    public QueryUnionExecutionResult( List<String> queries,
                                      ExecutionEngineWrapper executionEngine,
                                      Map<String, Object> params )
    {
        this.queries = queries;
        this.executionEngine = executionEngine;
        this.params = params;
    }

    @Override
    public Iterator<Map<String, Object>> iterator()
    {
        return new ExecutionResultsIterator( queries, executionEngine, params );
    }

    @Override
    public String toString()
    {
        StringBuilder builder = new StringBuilder(  );
        for ( String query : queries )
        {
            builder.append(  executionEngine.execute( query, params ).dumpToString());
        }
        return builder.toString();
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/server/SimpleSocialNetworkExtension.java
================================================
package org.neo4j.graphdatabases.queries.server;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;

import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdatabases.queries.SimpleSocialNetworkQueries;
import org.neo4j.graphdb.GraphDatabaseService;

@Path("/distance")
public class SimpleSocialNetworkExtension
{
    private final  SimpleSocialNetworkQueries queries;

    public SimpleSocialNetworkExtension( @Context GraphDatabaseService db )
    {
        this.queries = new SimpleSocialNetworkQueries( db );
    }

    @GET
    @Path("/{name1}/{name2}")
    public String getDistance  ( @PathParam("name1") String name1, @PathParam("name2") String name2 )
    {
        ExecutionResult result = queries.pathBetweenTwoFriends( name1, name2 );

        return String.valueOf( result.columnAs( "depth" ).next() );
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/testing/IndexParam.java
================================================
package org.neo4j.graphdatabases.queries.testing;

public class IndexParam
{
    public static IndexParam indexParam( String nodeLabel, String propertyName )
    {
        return new IndexParam( nodeLabel, propertyName);
    }

    private final String nodeLabel;
    private final String propertyName;

    private IndexParam(String nodeLabel, String propertyName)
    {
        this.nodeLabel = nodeLabel;
        this.propertyName = propertyName;
    }

    public String nodeLabel()
    {
        return nodeLabel;
    }

    public String propertyName()
    {
        return propertyName;
    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/testing/IndexParams.java
================================================
package org.neo4j.graphdatabases.queries.testing;

import static java.lang.String.format;
import static java.util.Arrays.asList;

import java.util.List;

import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.graphdb.DynamicLabel;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Transaction;
import org.neo4j.tooling.GlobalGraphOperations;

public class IndexParams
{
    private final List<IndexParam> indexParams;

    public IndexParams( IndexParam... params )
    {
        indexParams = asList( params );
    }

    public void index(GraphDatabaseService db)
    {
        try (Transaction tx = db.beginTx()) {
            for (IndexParam indexParam : indexParams) {
                db.schema().indexFor(DynamicLabel.label(indexParam.nodeLabel())).on(indexParam.propertyName()).create();
//                db.schema().constraintFor(DynamicLabel.label(indexParam.nodeLabel())).assertPropertyIsUnique(indexParam.propertyName()).create();
//                engine.execute(format("CREATE INDEX ON :%s(%s)", indexParam.nodeLabel(), indexParam.propertyName()));
            }
            tx.success();
        }

    }
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/testing/TestOutputWriter.java
================================================
/*
 * Copyright (C) 2012 Neo Technology
 * All rights reserved
 */
package org.neo4j.graphdatabases.queries.testing;

public interface TestOutputWriter
{
    void begin();
    void write(String value);
    void writeln( String value );
    void flush();
    void end();
}


================================================
FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/FriendOfAFriendDepth4.java
================================================
package org.neo4j.graphdatabases.queries.traversals;

import static org.neo4j.graphdb.DynamicRelationshipType.withName;
import static org.neo4j.graphdb.traversal.Uniqueness.*;

import org.neo4j.graphdb.*;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.traversal.Evaluation;
import org.neo4j.graphdb.traversal.Evaluator;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.helpers.collection.IteratorUtil;
import org.neo4j.kernel.Traversal;
import org.neo4j.kernel.Uniqueness;

public class FriendOfAFriendDepth4
{
    public static final Label USER = DynamicLabel.label("User");

    private final TraversalDescription traversalDescription;

    private final GraphDatabaseService db;

    public FriendOfAFriendDepth4( GraphDatabaseService db )
    {
        this.db = db;
        traversalDescription = traversalDescription(db);
    }

    private TraversalDescription traversalDescription(GraphDatabaseService db)
    {
        return db.traversalDescription()
                .breadthFirst()
                .uniqueness( NODE_GLOBAL )
                .relationships( withName( "FRIEND" ) )
                .evaluator( new Evaluator()
                {
                    @Override
                    public Evaluation evaluate( Path path )
                    {
                        if ( path.length() == 4 )
                        {
                            return Evaluation.INCLUDE_AND_PRUNE;
                        }
                        return Evaluation.EXCLUDE_AND_CONTINUE;

                    }
                } );
    }

    public Iterable<Node> getFriends( String name )
    {
        ResourceIterable<Node> users = db.findNodesByLabelAndProperty(USER, "name", name);
        Node startNode = IteratorUtil.sin
Download .txt
gitextract_0j5cs4sk/

├── .gitignore
├── .gitmodules
├── README.md
├── configuration/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── org/
│                   └── neo4j/
│                       └── graphdatabases/
│                           ├── AccessControlConfig.java
│                           ├── AccessControlWithRelationshipPropertiesConfig.java
│                           ├── LogisticsConfig.java
│                           ├── SimpleSocialNetworkConfig.java
│                           └── SocialNetworkConfig.java
├── data-generation/
│   ├── pom.xml
│   └── src/
│       └── test/
│           └── java/
│               └── org/
│                   └── neo4j/
│                       └── graphdatabases/
│                           └── dataset_builders/
│                               ├── AccessControl.java
│                               ├── AccessControlWithRelationshipProperties.java
│                               ├── Logistics.java
│                               ├── SimpleSocialNetwork.java
│                               ├── SocialNetwork.java
│                               ├── helpers/
│                               │   └── SevenDays.java
│                               ├── properties/
│                               │   ├── DurationOnProjectProperty.java
│                               │   ├── ProjectDuration.java
│                               │   ├── ProjectDurationGenerator.java
│                               │   └── ProjectDurationProperty.java
│                               └── traversers/
│                                   ├── FindAllColleagues.java
│                                   ├── FindColleagues.java
│                                   └── IsCompanyProject.java
├── performance-testing/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── org/
│       │           └── neo4j/
│       │               └── graphdatabases/
│       │                   └── performance_tests/
│       │                       └── testing/
│       │                           ├── DefaultExecutionEngineWrapper.java
│       │                           ├── DoNothingWithTestResults.java
│       │                           ├── MultipleTestRuns.java
│       │                           ├── ParamsGenerator.java
│       │                           ├── PrintTestResults.java
│       │                           ├── QueryType.java
│       │                           ├── ResultFormatter.java
│       │                           ├── ResultsContainSameElementsUnordered.java
│       │                           ├── SingleTest.java
│       │                           ├── SingleTestRunResultHandler.java
│       │                           ├── SingleTestRunResultHandlerFactory.java
│       │                           ├── SysOutWriter.java
│       │                           ├── TakeXTestResults.java
│       │                           └── TestResultsHandler.java
│       └── test/
│           └── java/
│               └── org/
│                   └── neo4j/
│                       └── graphdatabases/
│                           └── performance_tests/
│                               ├── AccessControl.java
│                               ├── AccessControlWithRelationshipProperties.java
│                               ├── Logistics.java
│                               ├── SimpleSocialNetwork.java
│                               ├── SocialNetwork.java
│                               └── testing/
│                                   └── ResultsContainSameElementsUnorderedTest.java
├── pom.xml
└── queries/
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── org/
        │   │       └── neo4j/
        │   │           └── graphdatabases/
        │   │               └── queries/
        │   │                   ├── AccessControlQueries.java
        │   │                   ├── AccessControlWithRelationshipPropertiesQueries.java
        │   │                   ├── EmailQueries.java
        │   │                   ├── LogisticsQueries.java
        │   │                   ├── ShakespeareQueries.java
        │   │                   ├── ShakespeareQueriesUsingAutoIndexes.java
        │   │                   ├── SimpleSocialNetworkQueries.java
        │   │                   ├── SocialNetworkQueries.java
        │   │                   ├── helpers/
        │   │                   │   ├── DbUtils.java
        │   │                   │   ├── ExecutionEngineWrapper.java
        │   │                   │   ├── ExecutionResultIterator.java
        │   │                   │   ├── ExecutionResultsIterator.java
        │   │                   │   ├── IndexNodeByOtherNodeIndexer.java
        │   │                   │   ├── QueryUnionExecutionEngine.java
        │   │                   │   └── QueryUnionExecutionResult.java
        │   │                   ├── server/
        │   │                   │   └── SimpleSocialNetworkExtension.java
        │   │                   ├── testing/
        │   │                   │   ├── IndexParam.java
        │   │                   │   ├── IndexParams.java
        │   │                   │   └── TestOutputWriter.java
        │   │                   └── traversals/
        │   │                       ├── FriendOfAFriendDepth4.java
        │   │                       ├── IndexResources.java
        │   │                       ├── ParcelRouteCalculator.java
        │   │                       └── SimpleParcelRouteCalculator.java
        │   └── resources/
        │       └── META_INF/
        │           └── services/
        │               ├── javax.script.ScriptEngineFactory
        │               └── org.neo4j.server.plugins.ServerPlugin
        └── test/
            └── java/
                └── org/
                    └── neo4j/
                        └── graphdatabases/
                            └── queries/
                                ├── AccessControlQueriesTest.java
                                ├── AccessControlWithRelationshipPropertiesQueriesTest.java
                                ├── EmailQueriesTest.java
                                ├── LogisticsQueriesTest.java
                                ├── ShakespeareQueriesTest.java
                                ├── SimpleSocialNetworkQueriesTest.java
                                ├── SocialNetworkQueriesTest.java
                                ├── helpers/
                                │   ├── Db.java
                                │   ├── IndexNodeByOtherNodeIndexerTest.java
                                │   ├── PrintingExecutionEngineWrapper.java
                                │   └── QueryUnionExecutionEngineTest.java
                                └── server/
                                    └── SimpleSocialNetworkExtensionTest.java
Download .txt
SYMBOL INDEX (455 symbols across 73 files)

FILE: configuration/src/main/java/org/neo4j/graphdatabases/AccessControlConfig.java
  class AccessControlConfig (line 3) | public class AccessControlConfig

FILE: configuration/src/main/java/org/neo4j/graphdatabases/AccessControlWithRelationshipPropertiesConfig.java
  class AccessControlWithRelationshipPropertiesConfig (line 3) | public class AccessControlWithRelationshipPropertiesConfig

FILE: configuration/src/main/java/org/neo4j/graphdatabases/LogisticsConfig.java
  class LogisticsConfig (line 6) | public class LogisticsConfig

FILE: configuration/src/main/java/org/neo4j/graphdatabases/SimpleSocialNetworkConfig.java
  class SimpleSocialNetworkConfig (line 3) | public class SimpleSocialNetworkConfig

FILE: configuration/src/main/java/org/neo4j/graphdatabases/SocialNetworkConfig.java
  class SocialNetworkConfig (line 3) | public class SocialNetworkConfig

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/AccessControl.java
  class AccessControl (line 32) | public class AccessControl
    method buildAccessControl (line 40) | @Test
    method percentageOf (line 156) | private int percentageOf( int i, double percentage )

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/AccessControlWithRelationshipProperties.java
  class AccessControlWithRelationshipProperties (line 35) | public class AccessControlWithRelationshipProperties
    method buildAccessControl (line 43) | @Test
    method percentageOf (line 162) | private int percentageOf( int i, double percentage )

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/Logistics.java
  class Logistics (line 33) | public class Logistics
    method buildLogistics (line 35) | @Test
    class IntervalProperty (line 104) | private static class IntervalProperty extends Property
      method IntervalProperty (line 112) | private IntervalProperty( int numberOfIntervals )
      method setProperty (line 118) | @Override
    class CostProperty (line 142) | private static class CostProperty extends Property
      method setProperty (line 146) | @Override

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/SimpleSocialNetwork.java
  class SimpleSocialNetwork (line 27) | public class SimpleSocialNetwork
    method buildSocialNetwork (line 29) | @Test
    method createSampleDataset (line 47) | private void createSampleDataset( GraphDatabaseService db )

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/SocialNetwork.java
  class SocialNetwork (line 42) | public class SocialNetwork
    method buildSocialNetwork (line 44) | @Test
    method createFindCompanyProjectsTraversalDescription (line 120) | private TraversalDescription createFindCompanyProjectsTraversalDescrip...

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/helpers/SevenDays.java
  class SevenDays (line 13) | public class SevenDays
    method SevenDays (line 25) | public SevenDays( DateTime start )
    method calculateIntervals (line 31) | public Iterable<Interval> calculateIntervals( int numberOfIntervals )

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/DurationOnProjectProperty.java
  class DurationOnProjectProperty (line 9) | public class DurationOnProjectProperty extends Property
    method setProperty (line 11) | @Override

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDuration.java
  class ProjectDuration (line 13) | public class ProjectDuration
    method ProjectDuration (line 21) | public ProjectDuration( Long startMs, Long endMs )
    method getStartDateMs (line 27) | public Long getStartDateMs()
    method getEndDateMs (line 32) | public Long getEndDateMs()
    method getSubDuration (line 37) | public ProjectDuration getSubDuration()
    method toString (line 54) | public String toString()

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDurationGenerator.java
  class ProjectDurationGenerator (line 8) | public class ProjectDurationGenerator
    method getNextProjectDuration (line 13) | public ProjectDuration getNextProjectDuration()

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDurationProperty.java
  class ProjectDurationProperty (line 7) | public class ProjectDurationProperty extends Property
    method setProperty (line 11) | @Override

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/FindAllColleagues.java
  class FindAllColleagues (line 22) | public class FindAllColleagues extends GraphQuery
    method evaluate (line 32) | @Override
    method execute (line 50) | @Override
    class WorkOnPathExpander (line 56) | private static class WorkOnPathExpander implements PathExpander<Object>
      method expand (line 58) | @Override
      method reverse (line 71) | @Override

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/FindColleagues.java
  class FindColleagues (line 25) | public class FindColleagues extends GraphQuery
    method execute (line 34) | @Override
    class IsColleague (line 40) | private static class IsColleague implements Evaluator
      method evaluate (line 42) | @Override
    class OverlappingWorkedOnRels (line 54) | private static class OverlappingWorkedOnRels implements PathExpander<I...
      method expand (line 60) | @Override
      method reverse (line 96) | @Override
      method intervalsOverlapByDuration (line 102) | private boolean intervalsOverlapByDuration( Interval myInterval, Int...

FILE: data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/IsCompanyProject.java
  class IsCompanyProject (line 10) | public class IsCompanyProject implements Evaluator
    method evaluate (line 14) | @Override

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/DefaultExecutionEngineWrapper.java
  class DefaultExecutionEngineWrapper (line 10) | public class DefaultExecutionEngineWrapper implements ExecutionEngineWra...
    method DefaultExecutionEngineWrapper (line 14) | public DefaultExecutionEngineWrapper( GraphDatabaseService db )
    method execute (line 19) | @Override
    method execute (line 25) | @Override

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/DoNothingWithTestResults.java
  class DoNothingWithTestResults (line 5) | public class DoNothingWithTestResults implements TestResultsHandler
    method doNothing (line 7) | public static TestResultsHandler doNothing()
    method handle (line 12) | @Override
    method writeTo (line 18) | @Override

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/MultipleTestRuns.java
  class MultipleTestRuns (line 12) | public class MultipleTestRuns
    method MultipleTestRuns (line 17) | public MultipleTestRuns( int numberOfRuns, TestOutputWriter writer )
    method execute (line 23) | public void execute( String title,
    method execute (line 91) | public void execute( String title,
    class NullSingleTestRunResultHandler (line 99) | private static class NullSingleTestRunResultHandler implements SingleT...
      method handle (line 101) | @Override
      method summarize (line 107) | @Override
    class NullSingleTestRunResultHandlerFactory (line 114) | private static class NullSingleTestRunResultHandlerFactory implements ...
      method createSingleTestRunResultHandler (line 118) | @Override

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ParamsGenerator.java
  type ParamsGenerator (line 9) | public interface ParamsGenerator
    method generateParams (line 11) | Map<String, String> generateParams();

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/PrintTestResults.java
  class PrintTestResults (line 7) | public class PrintTestResults implements TestResultsHandler
    method format (line 11) | @Override
    method printResults (line 18) | public static TestResultsHandler printResults( int numberOfResults, Re...
    method printResults (line 24) | public static TestResultsHandler printResults( int numberOfResults, Te...
    method PrintTestResults (line 33) | private PrintTestResults( int numberOfResults, ResultFormatter resultF...
    method handle (line 40) | @Override
    method writeTo (line 74) | @Override

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/QueryType.java
  type QueryType (line 7) | public enum QueryType

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ResultFormatter.java
  type ResultFormatter (line 7) | public interface ResultFormatter
    method format (line 9) | String format(Object result);

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ResultsContainSameElementsUnordered.java
  class ResultsContainSameElementsUnordered (line 14) | public class ResultsContainSameElementsUnordered implements SingleTestRu...
    method newFactory (line 16) | public static SingleTestRunResultHandlerFactory newFactory(final Strin...
    method ResultsContainSameElementsUnordered (line 32) | public ResultsContainSameElementsUnordered( String... cleanResultRegEx...
    method handle (line 38) | @Override
    method summarize (line 54) | @Override
    method compareCollections (line 70) | private void compareCollections( String queryType1, Collection<String>...
    method compare (line 77) | private void compare( String queryType1, Collection<String> results1, ...

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTest.java
  type SingleTest (line 9) | public interface SingleTest
    method queryType (line 11) | String queryType();
    method execute (line 12) | Object execute( Map<String, String> params );

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTestRunResultHandler.java
  type SingleTestRunResultHandler (line 9) | public interface SingleTestRunResultHandler
    method handle (line 11) | void handle( String queryType, String formattedResult );
    method summarize (line 12) | void summarize( TestOutputWriter writer );

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTestRunResultHandlerFactory.java
  type SingleTestRunResultHandlerFactory (line 7) | public interface SingleTestRunResultHandlerFactory
    method createSingleTestRunResultHandler (line 9) | SingleTestRunResultHandler createSingleTestRunResultHandler();

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SysOutWriter.java
  class SysOutWriter (line 5) | public class SysOutWriter implements TestOutputWriter
    method SysOutWriter (line 9) | private SysOutWriter(){}
    method begin (line 11) | @Override
    method write (line 16) | @Override
    method writeln (line 22) | @Override
    method flush (line 28) | @Override
    method end (line 33) | @Override

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/TakeXTestResults.java
  class TakeXTestResults (line 8) | public class TakeXTestResults implements TestResultsHandler
    method take (line 10) | public static TestResultsHandler take( int quantity )
    method TakeXTestResults (line 17) | public TakeXTestResults( int quantity )
    method handle (line 22) | @Override
    method writeTo (line 36) | @Override

FILE: performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/TestResultsHandler.java
  type TestResultsHandler (line 9) | public interface TestResultsHandler
    method handle (line 11) | void handle( String queryType, Object results, SingleTestRunResultHand...
    method writeTo (line 12) | void writeTo(TestOutputWriter writer);

FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/AccessControl.java
  class AccessControl (line 27) | public class AccessControl
    method init (line 41) | @BeforeClass
    method teardown (line 61) | @AfterClass
    method findAccessibleResources (line 67) | @Test
    method findAccessibleCompanies (line 90) | @Test
    method findAccessibleAccountsForCompany (line 113) | @Test
    method findAdminForCompany (line 138) | @Test
    method findAdminForResource (line 161) | @Test
    method hasAccessToResource (line 185) | @Test
    method hasAccessToResourceBakeoff (line 209) | @Test
    method createParams (line 246) | private ParamsGenerator createParams()

FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/AccessControlWithRelationshipProperties.java
  class AccessControlWithRelationshipProperties (line 27) | public class AccessControlWithRelationshipProperties
    method init (line 41) | @BeforeClass
    method teardown (line 56) | @AfterClass
    method findAccessibleResources (line 62) | @Test
    method findAccessibleCompanies (line 85) | @Test
    method findAccessibleAccountsForCompany (line 108) | @Test
    method findAdminForCompany (line 133) | @Test
    method findAdminForResource (line 156) | @Test
    method hasAccessToResource (line 180) | @Test
    method hasAccessToResourceBakeoff (line 205) | @Test
    method createParams (line 243) | private ParamsGenerator createParams()

FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/Logistics.java
  class Logistics (line 36) | public class Logistics
    method init (line 47) | @BeforeClass
    method teardown (line 59) | @AfterClass
    method queryTest (line 69) | @Test
    method getPath (line 81) | private void getPath( List<Integer> ids, Interval interval )
    method flush (line 121) | @After
    method shortestRoute (line 127) | @Test
    method testSingleCypherQuery (line 176) | @Test
    class TestRunParams (line 196) | private class TestRunParams
      method TestRunParams (line 201) | public TestRunParams( GraphDatabaseService db, TestOutputWriter writ...
      method createParams (line 215) | public ParamsGenerator createParams()

FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/SimpleSocialNetwork.java
  class SimpleSocialNetwork (line 27) | public class SimpleSocialNetwork
    method init (line 37) | @BeforeClass
    method teardown (line 48) | @AfterClass
    method foafToDepthFour (line 54) | @Test
    method friendOfAFriendToDepth4 (line 78) | @Test
    method onlyFriendsAtDepth4UsingTraversalFramework (line 103) | @Test
    method createParams (line 131) | private ParamsGenerator createParams()

FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/SocialNetwork.java
  class SocialNetwork (line 35) | public class SocialNetwork
    method init (line 49) | @Before
    method teardown (line 60) | @After
    method sharedInterestsSameCompany (line 67) | @Test
    method sharedInterestsAllCompanies (line 89) | @Test
    method sharedInterestsAlsoInterestedInTopic (line 110) | @Test
    method friendOfAFriendWithInterest (line 131) | @Test
    method friendOfAFriendWithInterestTraversalFramework (line 158) | @Test
    method queryBakeoff (line 214) | @Test
    method friendWorkedWithFriendWithInterests (line 295) | @Test
    method friendOfAFriendWithMultipleInterestsBakeoff (line 319) | @Test
    method createParams (line 371) | private ParamsGenerator createParams( final String... keys )
    method resultFormatter (line 417) | private ResultFormatter resultFormatter()
    method testSingleCypherQuery (line 436) | @Test
    method testTraversal (line 458) | @Test

FILE: performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/testing/ResultsContainSameElementsUnorderedTest.java
  class ResultsContainSameElementsUnorderedTest (line 8) | public class ResultsContainSameElementsUnorderedTest
    method shouldReportDiscrepanciesBetweenTwoQueries (line 10) | @Test
    method shouldReportDiscrepanciesBetweenThreeQueries (line 36) | @Test
    class MyTestOutputWriter (line 62) | private static class MyTestOutputWriter implements TestOutputWriter
      method begin (line 66) | @Override
      method write (line 71) | @Override
      method writeln (line 77) | @Override
      method flush (line 84) | @Override
      method end (line 89) | @Override
      method toString (line 94) | @Override

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/AccessControlQueries.java
  class AccessControlQueries (line 9) | public class AccessControlQueries
    method AccessControlQueries (line 13) | public AccessControlQueries( ExecutionEngineWrapper executionEngineWra...
    method findAccessibleResources (line 18) | public ExecutionResult findAccessibleResources( String adminName )
    method findAccessibleCompanies (line 38) | public ExecutionResult findAccessibleCompanies( String adminName )
    method findAccessibleAccountsForCompany (line 55) | public ExecutionResult findAccessibleAccountsForCompany( String adminN...
    method findAdminForResource (line 78) | public ExecutionResult findAdminForResource( String resourceName )
    method findAdminForCompany (line 97) | public ExecutionResult findAdminForCompany( String companyName )
    method hasAccessToResource (line 114) | public ExecutionResult hasAccessToResource( String adminName, String r...
    method hasAccessToIndexedResource (line 137) | public ExecutionResult hasAccessToIndexedResource( String adminName, S...

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/AccessControlWithRelationshipPropertiesQueries.java
  class AccessControlWithRelationshipPropertiesQueries (line 10) | public class AccessControlWithRelationshipPropertiesQueries
    method AccessControlWithRelationshipPropertiesQueries (line 14) | public AccessControlWithRelationshipPropertiesQueries( ExecutionEngine...
    method findAccessibleResources (line 19) | public QueryUnionExecutionResult findAccessibleResources( String admin...
    method findAccessibleCompanies (line 40) | public QueryUnionExecutionResult findAccessibleCompanies( String admin...
    method findAccessibleAccountsForCompany (line 59) | public QueryUnionExecutionResult findAccessibleAccountsForCompany( Str...
    method findAdminForResource (line 85) | public QueryUnionExecutionResult findAdminForResource( String resource...
    method findAdminForCompany (line 105) | public QueryUnionExecutionResult findAdminForCompany( String companyNa...
    method hasAccessToResource (line 123) | public QueryUnionExecutionResult hasAccessToResource( String adminName...
    method hasAccessToIndexedResource (line 147) | public QueryUnionExecutionResult hasAccessToIndexedResource( String ad...

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/EmailQueries.java
  class EmailQueries (line 10) | public class EmailQueries
    method EmailQueries (line 15) | public EmailQueries( GraphDatabaseService db, ExecutionEngineWrapper e...
    method suspectBehaviour (line 21) | public ExecutionResult suspectBehaviour()
    method suspectBehaviour2 (line 33) | public ExecutionResult suspectBehaviour2()
    method suspectBehaviour3 (line 44) | public ExecutionResult suspectBehaviour3()
    method lossyDb (line 55) | public ExecutionResult lossyDb()

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/LogisticsQueries.java
  class LogisticsQueries (line 14) | public class LogisticsQueries
    method LogisticsQueries (line 20) | public LogisticsQueries( GraphDatabaseService db, ExecutionEngineWrapp...
    method findShortestPathWithParcelRouteCalculator (line 27) | public Iterable<Node> findShortestPathWithParcelRouteCalculator( Strin...
    method findShortestPathWithSimpleParcelRouteCalculator (line 32) | public Iterable<Node> findShortestPathWithSimpleParcelRouteCalculator(...
    method findShortestPathWithCypherReduce (line 38) | public ExecutionResult findShortestPathWithCypherReduce( String start,...

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/ShakespeareQueries.java
  class ShakespeareQueries (line 9) | public class ShakespeareQueries
    method ShakespeareQueries (line 13) | public ShakespeareQueries( ExecutionEngineWrapper executionEngineWrapp...
    method theatreCityBard (line 18) | public ExecutionResult theatreCityBard()
    method allPlays (line 31) | public ExecutionResult allPlays()
    method latePeriodPlays (line 47) | public ExecutionResult latePeriodPlays()
    method orderedByPerformance (line 63) | public ExecutionResult orderedByPerformance()
    method exampleOfWith (line 79) | public ExecutionResult exampleOfWith()

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/ShakespeareQueriesUsingAutoIndexes.java
  class ShakespeareQueriesUsingAutoIndexes (line 9) | public class ShakespeareQueriesUsingAutoIndexes
    method ShakespeareQueriesUsingAutoIndexes (line 13) | public ShakespeareQueriesUsingAutoIndexes( ExecutionEngineWrapper exec...
    method theatreCityBard (line 18) | public ExecutionResult theatreCityBard()
    method allPlays (line 31) | public ExecutionResult allPlays()
    method latePeriodPlays (line 47) | public ExecutionResult latePeriodPlays()
    method orderedByPerformance (line 63) | public ExecutionResult orderedByPerformance()
    method exampleOfWith (line 79) | public ExecutionResult exampleOfWith()

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/SimpleSocialNetworkQueries.java
  class SimpleSocialNetworkQueries (line 10) | public class SimpleSocialNetworkQueries
    method SimpleSocialNetworkQueries (line 14) | public SimpleSocialNetworkQueries( GraphDatabaseService db )
    method pathBetweenTwoFriends (line 19) | public ExecutionResult pathBetweenTwoFriends( String firstUser, String...
    method friendOfAFriendToDepth4 (line 33) | public ExecutionResult friendOfAFriendToDepth4(String name)

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/SocialNetworkQueries.java
  class SocialNetworkQueries (line 21) | public class SocialNetworkQueries
    method SocialNetworkQueries (line 29) | public SocialNetworkQueries( GraphDatabaseService db, ExecutionEngineW...
    method sharedInterestsSameCompany (line 35) | public ExecutionResult sharedInterestsSameCompany( String userName )
    method sharedInterestsAllCompanies (line 52) | public ExecutionResult sharedInterestsAllCompanies( String userName, i...
    method sharedInterestsAlsoInterestedInTopic (line 71) | public ExecutionResult sharedInterestsAlsoInterestedInTopic( String us...
    method friendOfAFriendWithInterest (line 89) | public ExecutionResult friendOfAFriendWithInterest( String userName, S...
    method friendOfAFriendWithInterestTraversalFramework (line 111) | public Collection<Node> friendOfAFriendWithInterestTraversalFramework(...
    method friendOfAFriendWithMultipleInterest (line 186) | public ExecutionResult friendOfAFriendWithMultipleInterest( String use...
    method friendWorkedWithFriendWithInterests (line 210) | public ExecutionResult friendWorkedWithFriendWithInterests( String use...
    method createWorkedWithRelationships (line 250) | public ExecutionResult createWorkedWithRelationships( String userName )
    method getAllUsers (line 267) | public ExecutionResult getAllUsers()

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/DbUtils.java
  class DbUtils (line 13) | public class DbUtils
    method existingDB (line 15) | public static GraphDatabaseService existingDB( String dir )
    method countRelTypes (line 31) | public static int countRelTypes(GraphDatabaseService db) {
    method dbConfig (line 40) | public static Map<String, String> dbConfig()
    method warmCache (line 50) | public static void warmCache( GraphDatabaseService db, TestOutputWrite...
    method numberOfItemsWithLabel (line 74) | public static int numberOfItemsWithLabel(GraphDatabaseService db, Stri...

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionEngineWrapper.java
  type ExecutionEngineWrapper (line 8) | public interface ExecutionEngineWrapper
    method execute (line 10) | ExecutionResult execute(String query, Map<String, Object> params);
    method execute (line 11) | ExecutionResult execute(String query, Map<String, Object> params, int ...

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionResultIterator.java
  class ExecutionResultIterator (line 11) | public class ExecutionResultIterator
    method newQueryIterators (line 13) | public static ExecutionResultIterator newQueryIterators( List<String> ...
    method ExecutionResultIterator (line 29) | private ExecutionResultIterator( ExecutionResult currentResult,
    method iterator (line 42) | public Iterator<Map<String, Object>> iterator()
    method hasNextIterator (line 47) | public boolean hasNextIterator()
    method getNextIterator (line 52) | public ExecutionResultIterator getNextIterator()

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionResultsIterator.java
  class ExecutionResultsIterator (line 8) | public class ExecutionResultsIterator implements Iterator<Map<String, Ob...
    method ExecutionResultsIterator (line 12) | public ExecutionResultsIterator( List<String> queries,
    method hasNext (line 19) | @Override
    method next (line 37) | @Override
    method remove (line 48) | @Override

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/IndexNodeByOtherNodeIndexer.java
  class IndexNodeByOtherNodeIndexer (line 6) | public class IndexNodeByOtherNodeIndexer
    method IndexNodeByOtherNodeIndexer (line 14) | public IndexNodeByOtherNodeIndexer( GraphTraversal findIndexableNodes,...
    method execute (line 26) | public void execute( GraphDatabaseService db, Node startNode, int batc...
    type GraphTraversal (line 62) | public interface GraphTraversal
      method execute (line 64) | Iterable<Node> execute( Node startNode );

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionEngine.java
  class QueryUnionExecutionEngine (line 8) | public class QueryUnionExecutionEngine
    method QueryUnionExecutionEngine (line 12) | public QueryUnionExecutionEngine( ExecutionEngineWrapper executionEngi...
    method execute (line 17) | public QueryUnionExecutionResult execute( final Map<String, Object> pa...
    method execute (line 27) | public Iterable<Map<String, Object>> execute( final String... queries )

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionResult.java
  class QueryUnionExecutionResult (line 7) | public class QueryUnionExecutionResult implements Iterable<Map<String, O...
    method QueryUnionExecutionResult (line 13) | public QueryUnionExecutionResult( List<String> queries,
    method iterator (line 22) | @Override
    method toString (line 28) | @Override

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/server/SimpleSocialNetworkExtension.java
  class SimpleSocialNetworkExtension (line 12) | @Path("/distance")
    method SimpleSocialNetworkExtension (line 17) | public SimpleSocialNetworkExtension( @Context GraphDatabaseService db )
    method getDistance (line 22) | @GET

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/testing/IndexParam.java
  class IndexParam (line 3) | public class IndexParam
    method indexParam (line 5) | public static IndexParam indexParam( String nodeLabel, String property...
    method IndexParam (line 13) | private IndexParam(String nodeLabel, String propertyName)
    method nodeLabel (line 19) | public String nodeLabel()
    method propertyName (line 24) | public String propertyName()

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/testing/IndexParams.java
  class IndexParams (line 15) | public class IndexParams
    method IndexParams (line 19) | public IndexParams( IndexParam... params )
    method index (line 24) | public void index(GraphDatabaseService db)

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/testing/TestOutputWriter.java
  type TestOutputWriter (line 7) | public interface TestOutputWriter
    method begin (line 9) | void begin();
    method write (line 10) | void write(String value);
    method writeln (line 11) | void writeln( String value );
    method flush (line 12) | void flush();
    method end (line 13) | void end();

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/FriendOfAFriendDepth4.java
  class FriendOfAFriendDepth4 (line 15) | public class FriendOfAFriendDepth4
    method FriendOfAFriendDepth4 (line 23) | public FriendOfAFriendDepth4( GraphDatabaseService db )
    method traversalDescription (line 29) | private TraversalDescription traversalDescription(GraphDatabaseService...
    method getFriends (line 50) | public Iterable<Node> getFriends( String name )

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/IndexResources.java
  class IndexResources (line 13) | public class IndexResources
    method evaluate (line 22) | @Override
    method IndexResources (line 33) | public IndexResources( GraphDatabaseService db )
    method execute (line 38) | public void execute()

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/ParcelRouteCalculator.java
  class ParcelRouteCalculator (line 26) | public class ParcelRouteCalculator
    method evaluate (line 44) | @Override
    method isDeliveryBase (line 55) | private boolean isDeliveryBase( Path path )
    method ParcelRouteCalculator (line 65) | public ParcelRouteCalculator( GraphDatabaseService db )
    method calculateRoute (line 70) | public Iterable<Node> calculateRoute( String start, String end, Interv...
    method createDeliveryBaseFinder (line 90) | private TraversalDescription createDeliveryBaseFinder( Interval interv...
    method combineRoutes (line 96) | private Set<Node> combineRoutes( Path upLeg, Path downLeg, Path topRou...
    method findRouteBetweenDeliveryBases (line 105) | private Path findRouteBetweenDeliveryBases( Node deliveryBase1, Node d...
    method findRouteToDeliveryBase (line 114) | private Path findRouteToDeliveryBase( String startPosition, TraversalD...
    class IntervalPathExpander (line 120) | private static class IntervalPathExpander implements PathExpander<Inte...
      method IntervalPathExpander (line 126) | private IntervalPathExpander( RelationshipType relationshipType, Dir...
      method expand (line 132) | @Override
      method reverse (line 150) | @Override

FILE: queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/SimpleParcelRouteCalculator.java
  class SimpleParcelRouteCalculator (line 20) | public class SimpleParcelRouteCalculator
    method SimpleParcelRouteCalculator (line 27) | public SimpleParcelRouteCalculator( GraphDatabaseService db )
    method calculateRoute (line 32) | public Iterable<Node> calculateRoute( String start, String end, Interv...
    method findByLocation (line 45) | private Node findByLocation(String location)
    class ValidPathExpander (line 50) | private static class ValidPathExpander implements PathExpander<Interval>
      method expand (line 52) | @Override
      method reverse (line 71) | @Override

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/AccessControlQueriesTest.java
  class AccessControlQueriesTest (line 20) | public class AccessControlQueriesTest
    method init (line 28) | @Before
    method shutdown (line 36) | @After
    method allowedWithInheritTrueGivesAccessToSubcompaniesAndAccounts (line 42) | @Test
    method deniedExcludesCompanyFromPermissionsTree (line 68) | @Test
    method deniedExcludesCompanyFromPermissionsTree2 (line 93) | @Test
    method shouldGetAccessibleCompaniesForAdmin (line 116) | @Test
    method shouldGetAccessibleCompaniesForAdminWhereNoAllowedInheritFalse (line 136) | @Test
    method moreComplexShouldGetAccessibleCompaniesForAdmin (line 157) | @Test
    method shouldFindAccessibleAccountsForAdminAndCompany (line 177) | @Test
    method moreComplexShouldFindAccessibleAccountsForAdminAndCompany (line 195) | @Test
    method shouldFindAccessibleAccountsForAdminAndCompanyWhenNoAllowedWithInheritFalse (line 212) | @Test
    method shouldFindAdminForAccountResourceWhereAllowedInheritAndAllowedNotInherit (line 230) | @Test
    method shouldFindAdminForEmployeeResourceWhereAllowedInheritAndDenied (line 260) | @Test
    method shouldFindAdminForCompanyWithAllowedInherit (line 289) | @Test
    method shouldFindAdminForCompanyWithDenied (line 317) | @Test
    method shouldFindAdminForCompanyWithAllowedInheritAndAllowedDoNotInheritTooLowInTree (line 341) | @Test
    method shouldFindAdminForCompanyWithAllowedInheritAndAllowedAllowedDoNotInherit (line 369) | @Test
    method shouldDetermineWhetherAdminHasAccessToResource (line 398) | @Test
    method shouldDetermineWhetherAdminHasAccessToIndexedResource (line 435) | @Test
    method isAuthorized (line 462) | private boolean isAuthorized( ExecutionResult result )
    method createDatabase (line 474) | private static GraphDatabaseService createDatabase()

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/AccessControlWithRelationshipPropertiesQueriesTest.java
  class AccessControlWithRelationshipPropertiesQueriesTest (line 22) | public class AccessControlWithRelationshipPropertiesQueriesTest
    method init (line 31) | @Before
    method shutdown (line 39) | @After
    method allowedWithInheritTrueGivesAccessToSubcompaniesAndAccounts (line 50) | @Test
    method deniedExcludesCompanyFromPermissionsTree (line 76) | @Test
    method shouldGetAccessibleCompaniesForAdmin (line 101) | @Test
    method shouldGetAccessibleCompaniesForAdminWhereNoAllowedInheritFalse (line 121) | @Test
    method moreComplexShouldGetAccessibleCompaniesForAdmin (line 142) | @Test
    method shouldFindAccessibleAccountsForAdminAndCompany (line 162) | @Test
    method moreComplexShouldFindAccessibleAccountsForAdminAndCompany (line 180) | @Test
    method shouldFindAccessibleAccountsForAdminAndCompanyWhenNoAllowedWithInheritFalse (line 197) | @Test
    method shouldFindAdminForAccountResourceWhereAllowedInheritAndAllowedNotInherit (line 215) | @Test
    method shouldFindAdminForEmployeeResourceWhereAllowedInheritAndDenied (line 245) | @Test
    method shouldFindAdminForCompanyWithAllowedInherit (line 274) | @Test
    method shouldFindAdminForCompanyWithDenied (line 302) | @Test
    method shouldFindAdminForCompanyWithAllowedInheritAndAllowedDoNotInheritTooLowInTree (line 326) | @Test
    method shouldFindAdminForCompanyWithAllowedInheritAndAllowedAllowedDoNotInherit (line 354) | @Test
    method shouldDetermineWhetherAdminHasAccessToResource (line 383) | @Test
    method shouldDetermineWhetherAdminHasAccessToIndexedResource (line 422) | @Test
    method createDatabase (line 463) | private static GraphDatabaseService createDatabase()

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/EmailQueriesTest.java
  class EmailQueriesTest (line 22) | public class EmailQueriesTest
    method suspectBehaviour (line 27) | @Test
    method suspectBehaviour2 (line 42) | @Test
    method suspectBehaviour3 (line 73) | @Test
    method lossyDb (line 89) | @Test
    method createDatabase (line 102) | private static GraphDatabaseService createDatabase()
    method createDatabase2 (line 149) | private static GraphDatabaseService createDatabase2()
    method createDatabase3 (line 197) | private static GraphDatabaseService createDatabase3()
    method createDatabase4 (line 226) | private static GraphDatabaseService createDatabase4()

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/LogisticsQueriesTest.java
  class LogisticsQueriesTest (line 20) | public class LogisticsQueriesTest
    method init (line 34) | @Before
    method shutdown (line 51) | @After
    method parcelRoutingUsingParcelRouteCalculator (line 62) | @Test
    method parcelRoutingUsingParcelRouteCalculatorChoosesShortestRouteBetweenDeliveryBases (line 91) | @Test
    method parcelRoutingUsingParcelRouteCalculatorRespectsIntervals (line 118) | @Test
    method parcelRoutingUsingSimpleParcelRouteCalculatorRespectsIntervals (line 145) | @Test
    method withinScopeOfSingleParcelCentreParcelRouteCalculator (line 172) | @Test
    method parcelRoutingUsingCypherReduce (line 199) | @Test
    method parcelRoutingUsingCypherReduceChoosesShortestRouteBetweenDeliveryBases (line 228) | @Test
    method parcelRoutingUsingCypherReduceRespectsIntervals (line 254) | @Test
    method withinScopeOfSingleParcelCentreCypher (line 280) | @Test
    method createDatabase (line 307) | private static GraphDatabaseService createDatabase()
    method intervalProperties (line 402) | private static String intervalProperties( Interval interval )

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/ShakespeareQueriesTest.java
  class ShakespeareQueriesTest (line 25) | public class ShakespeareQueriesTest
    method init (line 36) | @Before
    method shutdown (line 47) | @After
    method theatreCityBard (line 54) | @Test
    method assertTheatreCityBard (line 66) | private void assertTheatreCityBard( ExecutionResult results )
    method exampleOfWith (line 78) | @Test
    method assertExampleOfWith (line 90) | private void assertExampleOfWith( ExecutionResult results )
    method shouldReturnAllPlays (line 99) | @Test
    method assertAllPlays (line 110) | private void assertAllPlays( ExecutionResult result )
    method shouldReturnLatePeriodPlays (line 123) | @Test
    method assertLatePeriodPlays (line 135) | private void assertLatePeriodPlays( ExecutionResult result )
    method orderedByPerformance (line 147) | @Test
    method assertOrderedByPerformance (line 159) | private void assertOrderedByPerformance( ExecutionResult result )
    method createDatabase (line 178) | private static GraphDatabaseService createDatabase()
    method createDatabaseUsingCoreApi (line 227) | private static GraphDatabaseService createDatabaseUsingCoreApi()

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/SimpleSocialNetworkQueriesTest.java
  class SimpleSocialNetworkQueriesTest (line 15) | public class SimpleSocialNetworkQueriesTest
    method init (line 20) | @BeforeClass
    method shutdown (line 27) | @AfterClass
    method shouldReturnShortestPathBetweenTwoFriends (line 33) | @Test
    method friendOfAFriendToDepth4 (line 44) | @Test
    method shouldReturnNoResultsWhenThereIsNotAPathBetweenTwoFriends (line 56) | @Test
    method createDatabase (line 66) | private static GraphDatabaseService createDatabase()

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/SocialNetworkQueriesTest.java
  class SocialNetworkQueriesTest (line 25) | public class SocialNetworkQueriesTest
    method init (line 33) | @Before
    method shutdown (line 40) | @After
    method sharedInterestsSameCompany (line 46) | @Test
    method sharedInterestsAllCompanies (line 68) | @Test
    method sharedInterestsAlsoInterestedInTopic (line 106) | @Test
    method friendOfAFriendWithInterest (line 122) | @Test
    method friendOfAFriendWithInterestTraversalFramework (line 136) | @Test
    method friendWorkedWithFriendWithInterests (line 152) | @Test
    method friendOfAFriendWithMultipleInterest (line 169) | @Test
    method friendOfAFriendWithMultipleInterestShouldOrderByScore (line 188) | @Test
    method shouldCreateNewWorkedWithRelationships (line 213) | @Test
    method createAllWorkedWithRelationships (line 243) | private void createAllWorkedWithRelationships()
    method createDatabase (line 271) | private static GraphDatabaseService createDatabase()

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/Db.java
  class Db (line 21) | public final class Db
    method Db (line 23) | private Db()
    method impermanentDb (line 27) | public static GraphDatabaseService impermanentDb()
    method tempDb (line 35) | public static GraphDatabaseService tempDb()
    method createFromCypher (line 40) | public static GraphDatabaseService createFromCypher( String name, Stri...
    method createFromCypherWithAutoIndexing (line 47) | public static GraphDatabaseService createFromCypherWithAutoIndexing( S...
    method createFromCypher (line 62) | public static GraphDatabaseService createFromCypher( GraphDatabaseServ...
    method printGraph (line 75) | private static void printGraph( String name, GraphDatabaseService db )
    method printFile (line 87) | private static void printFile( String fileName, String contents )
    method createTempDatabaseDir (line 100) | private static File createTempDatabaseDir()

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/IndexNodeByOtherNodeIndexerTest.java
  class IndexNodeByOtherNodeIndexerTest (line 22) | public class IndexNodeByOtherNodeIndexerTest
    method shouldIndexNodesByOtherNodes (line 24) | @Test

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/PrintingExecutionEngineWrapper.java
  class PrintingExecutionEngineWrapper (line 12) | public class PrintingExecutionEngineWrapper implements ExecutionEngineWr...
    method PrintingExecutionEngineWrapper (line 18) | public PrintingExecutionEngineWrapper( GraphDatabaseService db, String...
    method execute (line 25) | @Override
    method execute (line 31) | @Override
    method printResult (line 42) | private void printResult( org.neo4j.cypher.javacompat.ExecutionResult ...
    method printQuery (line 49) | private void printQuery( String query, int index )
    method printFile (line 55) | private static void printFile( String fileName, String contents )

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionEngineTest.java
  class QueryUnionExecutionEngineTest (line 25) | public class QueryUnionExecutionEngineTest
    method init (line 31) | @BeforeClass
    method end (line 61) | @AfterClass
    method shouldAllowIteratingSingleResult (line 67) | @Test
    method shouldAllowIteratingMultipleResults (line 85) | @Test
    method shouldReturnCorrectResultsWhenFirstQueryReturnsEmptyResults (line 108) | @Test
    method shouldReturnCorrectResultsWhenLastQueryReturnsEmptyResults (line 129) | @Test
    method shouldReturnCorrectResultsWhenMiddleQueryReturnsEmptyResults (line 150) | @Test
    method shouldReturnCorrectResultsWhenAllQueriesReturnEmptyResults (line 176) | @Test
    method shouldAllowSameParametersToBePassedToAllQueries (line 195) | @Test
    method shouldAllowDifferentParametersToBePassedToDifferentQueries (line 221) | @Test
    method shouldThrowExceptionIfNoQueriesSupplied (line 248) | @Test
    method shouldReturnAllResultsAsString (line 266) | @Test
    method createDatabase (line 303) | private static GraphDatabaseService createDatabase()

FILE: queries/src/test/java/org/neo4j/graphdatabases/queries/server/SimpleSocialNetworkExtensionTest.java
  class SimpleSocialNetworkExtensionTest (line 23) | public class SimpleSocialNetworkExtensionTest
    method init (line 28) | @BeforeClass
    method teardown (line 42) | @AfterClass
    method serverShouldReturnDistance (line 48) | @Test
    method extensionShouldReturnDistance (line 66) | @Test
    method populateDatabase (line 79) | private static GraphDatabaseService populateDatabase( GraphDatabaseSer...
Condensed preview — 83 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (350K chars).
[
  {
    "path": ".gitignore",
    "chars": 99,
    "preview": "datasets/\nexamples/\ndatasets-old/\n.DS_Store\nbuild\ntarget\n.settings\n.project\n.idea\n.classpath\n*.iml\n"
  },
  {
    "path": ".gitmodules",
    "chars": 74,
    "preview": "[submodule \"neode\"]\n\tpath = neode\n\turl = https://github.com/jexp/neode.git"
  },
  {
    "path": "README.md",
    "chars": 2239,
    "preview": "Graph Databases Use Cases\n=========================\n\nExample use case implementations from the O'Reilly book [Graph Data"
  },
  {
    "path": "configuration/pom.xml",
    "chars": 906,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/AccessControlConfig.java",
    "chars": 420,
    "preview": "package org.neo4j.graphdatabases;\n\npublic class AccessControlConfig\n{\n    public static final String STORE_DIR = \"../dat"
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/AccessControlWithRelationshipPropertiesConfig.java",
    "chars": 392,
    "preview": "package org.neo4j.graphdatabases;\n\npublic class AccessControlWithRelationshipPropertiesConfig\n{\n    public static final "
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/LogisticsConfig.java",
    "chars": 914,
    "preview": "package org.neo4j.graphdatabases;\n\nimport org.joda.time.DateTime;\nimport org.joda.time.DateTimeZone;\n\npublic class Logis"
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/SimpleSocialNetworkConfig.java",
    "chars": 386,
    "preview": "package org.neo4j.graphdatabases;\n\npublic class SimpleSocialNetworkConfig\n{\n    public static final String STORE_DIR = \""
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/SocialNetworkConfig.java",
    "chars": 357,
    "preview": "package org.neo4j.graphdatabases;\n\npublic class SocialNetworkConfig\n{\n    public static final String STORE_DIR = \"../dat"
  },
  {
    "path": "data-generation/pom.xml",
    "chars": 2052,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/AccessControl.java",
    "chars": 8343,
    "preview": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\n\nimport org.junit.Test;\n\nimport org.neo4j.graph"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/AccessControlWithRelationshipProperties.java",
    "chars": 8178,
    "preview": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\nimport java.util.Random;\n\nimport org.junit.Test"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/Logistics.java",
    "chars": 6644,
    "preview": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\nimport java.util.Iterator;\nimport java.util.NoS"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/SimpleSocialNetwork.java",
    "chars": 2888,
    "preview": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\n\nimport org.junit.Test;\n\nimport org.neo4j.graph"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/SocialNetwork.java",
    "chars": 6113,
    "preview": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\n\nimport org.junit.Test;\n\nimport org.neo4j.graph"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/helpers/SevenDays.java",
    "chars": 1995,
    "preview": "package org.neo4j.graphdatabases.dataset_builders.helpers;\n\nimport static java.util.Arrays.asList;\n\nimport java.util.Arr"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/DurationOnProjectProperty.java",
    "chars": 1159,
    "preview": "package org.neo4j.graphdatabases.dataset_builders.properties;\n\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDuration.java",
    "chars": 2158,
    "preview": "package org.neo4j.graphdatabases.dataset_builders.properties;\n\nimport static org.neo4j.neode.Range.minMax;\nimport static"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDurationGenerator.java",
    "chars": 677,
    "preview": "package org.neo4j.graphdatabases.dataset_builders.properties;\n\nimport java.util.Random;\n\nimport org.joda.time.DateTime;\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDurationProperty.java",
    "chars": 860,
    "preview": "package org.neo4j.graphdatabases.dataset_builders.properties;\n\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/FindAllColleagues.java",
    "chars": 2727,
    "preview": "package org.neo4j.graphdatabases.dataset_builders.traversers;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.w"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/FindColleagues.java",
    "chars": 3668,
    "preview": "package org.neo4j.graphdatabases.dataset_builders.traversers;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.w"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/IsCompanyProject.java",
    "chars": 785,
    "preview": "package org.neo4j.graphdatabases.dataset_builders.traversers;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.w"
  },
  {
    "path": "performance-testing/pom.xml",
    "chars": 1708,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/DefaultExecutionEngineWrapper.java",
    "chars": 900,
    "preview": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.E"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/DoNothingWithTestResults.java",
    "chars": 571,
    "preview": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputW"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/MultipleTestRuns.java",
    "chars": 4524,
    "preview": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport static org.neo4j.neode.Range.minMax;\nimport static o"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ParamsGenerator.java",
    "chars": 230,
    "preview": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.te"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/PrintTestResults.java",
    "chars": 2701,
    "preview": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport java.util.Iterator;\n\nimport org.neo4j.graphdatabases"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/QueryType.java",
    "chars": 236,
    "preview": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.te"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ResultFormatter.java",
    "chars": 199,
    "preview": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.te"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ResultsContainSameElementsUnordered.java",
    "chars": 3242,
    "preview": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport static java.util.Arrays.asList;\n\nimport java.util.Ar"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTest.java",
    "chars": 257,
    "preview": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.te"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTestRunResultHandler.java",
    "chars": 351,
    "preview": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.te"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTestRunResultHandlerFactory.java",
    "chars": 250,
    "preview": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.te"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SysOutWriter.java",
    "chars": 641,
    "preview": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputW"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/TakeXTestResults.java",
    "chars": 1055,
    "preview": "package org.neo4j.graphdatabases.performance_tests.testing;\n\n\nimport java.util.Iterator;\n\nimport org.neo4j.graphdatabase"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/TestResultsHandler.java",
    "chars": 386,
    "preview": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.te"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/AccessControl.java",
    "chars": 9510,
    "preview": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.ut"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/AccessControlWithRelationshipProperties.java",
    "chars": 9670,
    "preview": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.ut"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/Logistics.java",
    "chars": 8512,
    "preview": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.M"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/SimpleSocialNetwork.java",
    "chars": 5091,
    "preview": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Ra"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/SocialNetwork.java",
    "chars": 16581,
    "preview": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java."
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/testing/ResultsContainSameElementsUnorderedTest.java",
    "chars": 3119,
    "preview": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.ju"
  },
  {
    "path": "pom.xml",
    "chars": 932,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "queries/pom.xml",
    "chars": 3043,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/AccessControlQueries.java",
    "chars": 8070,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.java"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/AccessControlWithRelationshipPropertiesQueries.java",
    "chars": 9173,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.graphdataba"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/EmailQueries.java",
    "chars": 2060,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.java"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/LogisticsQueries.java",
    "chars": 3333,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.joda.time.Interva"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/ShakespeareQueries.java",
    "chars": 3815,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.java"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/ShakespeareQueriesUsingAutoIndexes.java",
    "chars": 4321,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.java"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/SimpleSocialNetworkQueries.java",
    "chars": 1446,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.java"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/SocialNetworkQueries.java",
    "chars": 11843,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Has"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/DbUtils.java",
    "chars": 2705,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.gra"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionEngineWrapper.java",
    "chars": 325,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionRe"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionResultIterator.java",
    "chars": 2107,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.Iterator;\nimport java.util.LinkedList;\nimport java.u"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionResultsIterator.java",
    "chars": 1328,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Ma"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/IndexNodeByOtherNodeIndexer.java",
    "chars": 2152,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.index.Index;\n\npu"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionEngine.java",
    "chars": 889,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport static java.util.Arrays.asList;\n\nimport java.util.HashMap;\nimp"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionResult.java",
    "chars": 1132,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Ma"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/server/SimpleSocialNetworkExtension.java",
    "chars": 904,
    "preview": "package org.neo4j.graphdatabases.queries.server;\n\nimport javax.ws.rs.GET;\nimport javax.ws.rs.Path;\nimport javax.ws.rs.Pa"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/testing/IndexParam.java",
    "chars": 602,
    "preview": "package org.neo4j.graphdatabases.queries.testing;\n\npublic class IndexParam\n{\n    public static IndexParam indexParam( St"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/testing/IndexParams.java",
    "chars": 1189,
    "preview": "package org.neo4j.graphdatabases.queries.testing;\n\nimport static java.lang.String.format;\nimport static java.util.Arrays"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/testing/TestOutputWriter.java",
    "chars": 272,
    "preview": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.queries.testing;\n\npu"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/FriendOfAFriendDepth4.java",
    "chars": 1863,
    "preview": "package org.neo4j.graphdatabases.queries.traversals;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/IndexResources.java",
    "chars": 2205,
    "preview": "package org.neo4j.graphdatabases.queries.traversals;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/ParcelRouteCalculator.java",
    "chars": 5744,
    "preview": "package org.neo4j.graphdatabases.queries.traversals;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/SimpleParcelRouteCalculator.java",
    "chars": 2805,
    "preview": "package org.neo4j.graphdatabases.queries.traversals;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n"
  },
  {
    "path": "queries/src/main/resources/META_INF/services/javax.script.ScriptEngineFactory",
    "chars": 61,
    "preview": "com.tinkerpop.gremlin.jsr223.GremlinGroovyScriptEngineFactory"
  },
  {
    "path": "queries/src/main/resources/META_INF/services/org.neo4j.server.plugins.ServerPlugin",
    "chars": 68,
    "preview": "org.neo4j.graphdatabases.queries.server.SimpleSocialNetworkExtension"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/AccessControlQueriesTest.java",
    "chars": 22147,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport static java.util.Arrays.asList;\nimport static org.junit.Assert.assertE"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/AccessControlWithRelationshipPropertiesQueriesTest.java",
    "chars": 23262,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport static java.util.Arrays.asList;\nimport static org.junit.Assert.assertE"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/EmailQueriesTest.java",
    "chars": 9344,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.Iterator;\nimport java.util.Map;\n\nimport org.junit.Rule;\nimpo"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/LogisticsQueriesTest.java",
    "chars": 19009,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.a"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/ShakespeareQueriesTest.java",
    "chars": 13408,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.Iterator;\nimport java.util.Map;\n\nimport org.junit.*;\nimport "
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/SimpleSocialNetworkQueriesTest.java",
    "chars": 3002,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.a"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/SocialNetworkQueriesTest.java",
    "chars": 12546,
    "preview": "package org.neo4j.graphdatabases.queries;\n\nimport static java.util.Arrays.asList;\nimport static org.junit.Assert.assertE"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/Db.java",
    "chars": 3870,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Print"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/IndexNodeByOtherNodeIndexerTest.java",
    "chars": 4262,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.neo4j."
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/PrintingExecutionEngineWrapper.java",
    "chars": 2120,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.io.PrintWriter;\nimport java.util.Map;\n\nimport org.junit.r"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionEngineTest.java",
    "chars": 12153,
    "preview": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/server/SimpleSocialNetworkExtensionTest.java",
    "chars": 3581,
    "preview": "package org.neo4j.graphdatabases.queries.server;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.neo4j.g"
  }
]

About this extraction

This page contains the full source code of the iansrobinson/graph-databases-use-cases GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 83 files (319.2 KB), approximately 76.9k tokens, and a symbol index with 455 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!