/*
* Copyright (c) 2002-2017 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.neo4j.driver.v1.integration;
import org.junit.Rule;
import org.junit.Test;
import java.io.IOException;
import org.neo4j.driver.v1.Driver;
import org.neo4j.driver.v1.GraphDatabase;
import org.neo4j.driver.v1.Session;
import org.neo4j.driver.v1.StatementResult;
import org.neo4j.driver.v1.util.Neo4jSettings;
import org.neo4j.driver.v1.util.TestNeo4j;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertFalse;
import static org.neo4j.driver.v1.Values.parameters;
public class LoadCSVIT
{
@Rule
public TestNeo4j neo4j = new TestNeo4j( Neo4jSettings.TEST_SETTINGS.without( Neo4jSettings.IMPORT_DIR ) );
@Test
public void shouldLoadCSV() throws Throwable
{
try( Driver driver = GraphDatabase.driver( neo4j.uri(), neo4j.authToken() );
Session session = driver.session() )
{
String csvFileUrl = createLocalIrisData( session );
// When
StatementResult result = session.run(
"USING PERIODIC COMMIT 40\n" +
"LOAD CSV WITH HEADERS FROM {csvFileUrl} AS l\n" +
"MATCH (c:Class {name: l.class_name})\n" +
"CREATE (s:Sample {sepal_length: l.sepal_length, sepal_width: l.sepal_width, petal_length: l.petal_length, petal_width: l.petal_width})\n" +
"CREATE (c)<-[:HAS_CLASS]-(s) " +
"RETURN count(*) AS c",
parameters( "csvFileUrl", csvFileUrl ) );
// Then
assertThat( result.next().get( "c" ).asInt(), equalTo( 150 ) );
assertFalse( result.hasNext() );
}
}
private String createLocalIrisData( Session session ) throws IOException
{
for ( String className : IRIS_CLASS_NAMES )
{
session.run( "CREATE (c:Class {name: {className}}) RETURN c", parameters( "className", className ) );
}
return neo4j.putTmpFile( "iris", ".csv", IRIS_DATA ).toExternalForm();
}
@SuppressWarnings("StatementWithEmptyBody")
private static void consume( StatementResult result )
{
while ( result.hasNext() )
{
// be happy
}
}
public static String[] IRIS_CLASS_NAMES =
new String[] {
"Iris-setosa",
"Iris-versicolor",
"Iris-virginica"
};
public static String IRIS_DATA =
"sepal_length,sepal_width,petal_length,petal_width,class_name\n" +
"5.1,3.5,1.4,0.2,Iris-setosa\n" +
"4.9,3.0,1.4,0.2,Iris-setosa\n" +
"4.7,3.2,1.3,0.2,Iris-setosa\n" +
"4.6,3.1,1.5,0.2,Iris-setosa\n" +
"5.0,3.6,1.4,0.2,Iris-setosa\n" +
"5.4,3.9,1.7,0.4,Iris-setosa\n" +
"4.6,3.4,1.4,0.3,Iris-setosa\n" +
"5.0,3.4,1.5,0.2,Iris-setosa\n" +
"4.4,2.9,1.4,0.2,Iris-setosa\n" +
"4.9,3.1,1.5,0.1,Iris-setosa\n" +
"5.4,3.7,1.5,0.2,Iris-setosa\n" +
"4.8,3.4,1.6,0.2,Iris-setosa\n" +
"4.8,3.0,1.4,0.1,Iris-setosa\n" +
"4.3,3.0,1.1,0.1,Iris-setosa\n" +
"5.8,4.0,1.2,0.2,Iris-setosa\n" +
"5.7,4.4,1.5,0.4,Iris-setosa\n" +
"5.4,3.9,1.3,0.4,Iris-setosa\n" +
"5.1,3.5,1.4,0.3,Iris-setosa\n" +
"5.7,3.8,1.7,0.3,Iris-setosa\n" +
"5.1,3.8,1.5,0.3,Iris-setosa\n" +
"5.4,3.4,1.7,0.2,Iris-setosa\n" +
"5.1,3.7,1.5,0.4,Iris-setosa\n" +
"4.6,3.6,1.0,0.2,Iris-setosa\n" +
"5.1,3.3,1.7,0.5,Iris-setosa\n" +
"4.8,3.4,1.9,0.2,Iris-setosa\n" +
"5.0,3.0,1.6,0.2,Iris-setosa\n" +
"5.0,3.4,1.6,0.4,Iris-setosa\n" +
"5.2,3.5,1.5,0.2,Iris-setosa\n" +
"5.2,3.4,1.4,0.2,Iris-setosa\n" +
"4.7,3.2,1.6,0.2,Iris-setosa\n" +
"4.8,3.1,1.6,0.2,Iris-setosa\n" +
"5.4,3.4,1.5,0.4,Iris-setosa\n" +
"5.2,4.1,1.5,0.1,Iris-setosa\n" +
"5.5,4.2,1.4,0.2,Iris-setosa\n" +
"4.9,3.1,1.5,0.2,Iris-setosa\n" +
"5.0,3.2,1.2,0.2,Iris-setosa\n" +
"5.5,3.5,1.3,0.2,Iris-setosa\n" +
"4.9,3.6,1.4,0.1,Iris-setosa\n" +
"4.4,3.0,1.3,0.2,Iris-setosa\n" +
"5.1,3.4,1.5,0.2,Iris-setosa\n" +
"5.0,3.5,1.3,0.3,Iris-setosa\n" +
"4.5,2.3,1.3,0.3,Iris-setosa\n" +
"4.4,3.2,1.3,0.2,Iris-setosa\n" +
"5.0,3.5,1.6,0.6,Iris-setosa\n" +
"5.1,3.8,1.9,0.4,Iris-setosa\n" +
"4.8,3.0,1.4,0.3,Iris-setosa\n" +
"5.1,3.8,1.6,0.2,Iris-setosa\n" +
"4.6,3.2,1.4,0.2,Iris-setosa\n" +
"5.3,3.7,1.5,0.2,Iris-setosa\n" +
"5.0,3.3,1.4,0.2,Iris-setosa\n" +
"7.0,3.2,4.7,1.4,Iris-versicolor\n" +
"6.4,3.2,4.5,1.5,Iris-versicolor\n" +
"6.9,3.1,4.9,1.5,Iris-versicolor\n" +
"5.5,2.3,4.0,1.3,Iris-versicolor\n" +
"6.5,2.8,4.6,1.5,Iris-versicolor\n" +
"5.7,2.8,4.5,1.3,Iris-versicolor\n" +
"6.3,3.3,4.7,1.6,Iris-versicolor\n" +
"4.9,2.4,3.3,1.0,Iris-versicolor\n" +
"6.6,2.9,4.6,1.3,Iris-versicolor\n" +
"5.2,2.7,3.9,1.4,Iris-versicolor\n" +
"5.0,2.0,3.5,1.0,Iris-versicolor\n" +
"5.9,3.0,4.2,1.5,Iris-versicolor\n" +
"6.0,2.2,4.0,1.0,Iris-versicolor\n" +
"6.1,2.9,4.7,1.4,Iris-versicolor\n" +
"5.6,2.9,3.6,1.3,Iris-versicolor\n" +
"6.7,3.1,4.4,1.4,Iris-versicolor\n" +
"5.6,3.0,4.5,1.5,Iris-versicolor\n" +
"5.8,2.7,4.1,1.0,Iris-versicolor\n" +
"6.2,2.2,4.5,1.5,Iris-versicolor\n" +
"5.6,2.5,3.9,1.1,Iris-versicolor\n" +
"5.9,3.2,4.8,1.8,Iris-versicolor\n" +
"6.1,2.8,4.0,1.3,Iris-versicolor\n" +
"6.3,2.5,4.9,1.5,Iris-versicolor\n" +
"6.1,2.8,4.7,1.2,Iris-versicolor\n" +
"6.4,2.9,4.3,1.3,Iris-versicolor\n" +
"6.6,3.0,4.4,1.4,Iris-versicolor\n" +
"6.8,2.8,4.8,1.4,Iris-versicolor\n" +
"6.7,3.0,5.0,1.7,Iris-versicolor\n" +
"6.0,2.9,4.5,1.5,Iris-versicolor\n" +
"5.7,2.6,3.5,1.0,Iris-versicolor\n" +
"5.5,2.4,3.8,1.1,Iris-versicolor\n" +
"5.5,2.4,3.7,1.0,Iris-versicolor\n" +
"5.8,2.7,3.9,1.2,Iris-versicolor\n" +
"6.0,2.7,5.1,1.6,Iris-versicolor\n" +
"5.4,3.0,4.5,1.5,Iris-versicolor\n" +
"6.0,3.4,4.5,1.6,Iris-versicolor\n" +
"6.7,3.1,4.7,1.5,Iris-versicolor\n" +
"6.3,2.3,4.4,1.3,Iris-versicolor\n" +
"5.6,3.0,4.1,1.3,Iris-versicolor\n" +
"5.5,2.5,4.0,1.3,Iris-versicolor\n" +
"5.5,2.6,4.4,1.2,Iris-versicolor\n" +
"6.1,3.0,4.6,1.4,Iris-versicolor\n" +
"5.8,2.6,4.0,1.2,Iris-versicolor\n" +
"5.0,2.3,3.3,1.0,Iris-versicolor\n" +
"5.6,2.7,4.2,1.3,Iris-versicolor\n" +
"5.7,3.0,4.2,1.2,Iris-versicolor\n" +
"5.7,2.9,4.2,1.3,Iris-versicolor\n" +
"6.2,2.9,4.3,1.3,Iris-versicolor\n" +
"5.1,2.5,3.0,1.1,Iris-versicolor\n" +
"5.7,2.8,4.1,1.3,Iris-versicolor\n" +
"6.3,3.3,6.0,2.5,Iris-virginica\n" +
"5.8,2.7,5.1,1.9,Iris-virginica\n" +
"7.1,3.0,5.9,2.1,Iris-virginica\n" +
"6.3,2.9,5.6,1.8,Iris-virginica\n" +
"6.5,3.0,5.8,2.2,Iris-virginica\n" +
"7.6,3.0,6.6,2.1,Iris-virginica\n" +
"4.9,2.5,4.5,1.7,Iris-virginica\n" +
"7.3,2.9,6.3,1.8,Iris-virginica\n" +
"6.7,2.5,5.8,1.8,Iris-virginica\n" +
"7.2,3.6,6.1,2.5,Iris-virginica\n" +
"6.5,3.2,5.1,2.0,Iris-virginica\n" +
"6.4,2.7,5.3,1.9,Iris-virginica\n" +
"6.8,3.0,5.5,2.1,Iris-virginica\n" +
"5.7,2.5,5.0,2.0,Iris-virginica\n" +
"5.8,2.8,5.1,2.4,Iris-virginica\n" +
"6.4,3.2,5.3,2.3,Iris-virginica\n" +
"6.5,3.0,5.5,1.8,Iris-virginica\n" +
"7.7,3.8,6.7,2.2,Iris-virginica\n" +
"7.7,2.6,6.9,2.3,Iris-virginica\n" +
"6.0,2.2,5.0,1.5,Iris-virginica\n" +
"6.9,3.2,5.7,2.3,Iris-virginica\n" +
"5.6,2.8,4.9,2.0,Iris-virginica\n" +
"7.7,2.8,6.7,2.0,Iris-virginica\n" +
"6.3,2.7,4.9,1.8,Iris-virginica\n" +
"6.7,3.3,5.7,2.1,Iris-virginica\n" +
"7.2,3.2,6.0,1.8,Iris-virginica\n" +
"6.2,2.8,4.8,1.8,Iris-virginica\n" +
"6.1,3.0,4.9,1.8,Iris-virginica\n" +
"6.4,2.8,5.6,2.1,Iris-virginica\n" +
"7.2,3.0,5.8,1.6,Iris-virginica\n" +
"7.4,2.8,6.1,1.9,Iris-virginica\n" +
"7.9,3.8,6.4,2.0,Iris-virginica\n" +
"6.4,2.8,5.6,2.2,Iris-virginica\n" +
"6.3,2.8,5.1,1.5,Iris-virginica\n" +
"6.1,2.6,5.6,1.4,Iris-virginica\n" +
"7.7,3.0,6.1,2.3,Iris-virginica\n" +
"6.3,3.4,5.6,2.4,Iris-virginica\n" +
"6.4,3.1,5.5,1.8,Iris-virginica\n" +
"6.0,3.0,4.8,1.8,Iris-virginica\n" +
"6.9,3.1,5.4,2.1,Iris-virginica\n" +
"6.7,3.1,5.6,2.4,Iris-virginica\n" +
"6.9,3.1,5.1,2.3,Iris-virginica\n" +
"5.8,2.7,5.1,1.9,Iris-virginica\n" +
"6.8,3.2,5.9,2.3,Iris-virginica\n" +
"6.7,3.3,5.7,2.5,Iris-virginica\n" +
"6.7,3.0,5.2,2.3,Iris-virginica\n" +
"6.3,2.5,5.0,1.9,Iris-virginica\n" +
"6.5,3.0,5.2,2.0,Iris-virginica\n" +
"6.2,3.4,5.4,2.3,Iris-virginica\n" +
"5.9,3.0,5.1,1.8,Iris-virginica\n" +
"\n";
}