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
================================================
4.0.0
org.neo4j.graphdatabases
configuration
2.0-SNAPSHOT
jar
1.7
1.7
UTF-8
joda-time
joda-time
2.1
================================================
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
================================================
4.0.0
org.neo4j.graphdatabases
data-generation
2.0-SNAPSHOT
jar
1.7
1.7
UTF-8
2.0.1
org.neo4j
neo4j-kernel
${neo4j.version}
org.neo4j
neo4j-enterprise
${neo4j.version}
org.neo4j.graphdatabases
configuration
2.0-SNAPSHOT
org.neo4j.graphdatabases
queries
2.0-SNAPSHOT
neode
neode
2.0
joda-time
joda-time
2.1
junit
junit
4.11
test
================================================
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 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> 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 calculateIntervals( int numberOfIntervals )
{
if ( numberOfIntervals < 1 || numberOfIntervals > 3 )
{
throw new IllegalArgumentException( "numberOfIntervals must be 1 or 3" );
}
List intervals = new ArrayList();
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 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 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 execute( Node node )
{
return traversal.traverse( node ).nodes();
}
private static class WorkOnPathExpander implements PathExpander