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
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
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.