using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Neo4j.Driver; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Neo4jQueryConsoleBasic { class Program { private static IConfiguration Configuration; private static IDriver _driver; private static Microsoft.Extensions.Logging.ILogger _logger; private static int? QueryTimeout = 30; private const string Endpoint = "bolt://localhost:7687"; private const string User = "neo4j"; private const string Password = "*****"; private const int FetchSize = 500; static async Task Main(string[] args) { Console.WriteLine("Hello Neo4j!"); var queryText = "match (v:tvarea{vertexId:\"GBR:1:London\"})-[:MAP_TO_ADMIN]->(con)-[:IS_ADMIN_PARENT_OF]->(twn)-[:ADMIN_TO_POSTALSECTOR]->(psector)-[:MAP_FROM_POSTALSECTOR]->(oarea) where (con.name <> \"No conurbation\") with {town: twn.name, postalSector: psector.name, outputArea: oarea.name} as result order by result.town, result.postalSector, result.outputArea return distinct (result)"; SetupConfigurationSources(); var sp = SetupDI(); _logger = sp.GetService>(); _driver = GraphDatabase.Driver(Endpoint, AuthTokens.Basic(User, Password), o => { o.WithLogger(new Neo4jLogger(_logger)); }); var session = _driver.AsyncSession(configBuilder => { configBuilder.WithFetchSize(FetchSize); //Config.Infinite to pull all records in one go, aparently defaults to 1000 }); try { await session.ReadTransactionAsync(async tx => { var reader = await tx.RunAsync(queryText); var records = new List(); while (await reader.FetchAsync()) { records.Add(reader.Current); if (records.Count % 1000 == 0) { _logger.LogInformation($"Fetched {records.Count} records from current results cursor."); } } }, txConfigBuilder => { txConfigBuilder.WithMetadata(new Dictionary { { "client", "TestProjectDLL" } }); if (QueryTimeout.HasValue) { txConfigBuilder.WithTimeout(TimeSpan.FromSeconds(QueryTimeout.Value)); } }); } catch (Exception ex) { _logger.LogError(ex, "Execution aborted"); } finally { _logger.LogInformation("Releasing graph resources..."); _logger.LogInformation($"Preparing for sess1on.CloseAsync..."); await session.CloseAsync(); } _logger.LogInformation("Disposing Neo4J driver..."); await _driver?.CloseAsync(); Console.WriteLine("Done."); Console.ReadKey(); } static void SetupConfigurationSources() { Configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build(); } static ServiceProvider SetupDI() { // generic services configuration(dotnet core, 3rd party) var services = new ServiceCollection() .AddOptions() //.AddLocalization() .AddLogging(builder => builder .AddConfiguration(Configuration.GetSection("Logging")) .AddConsole(options => { options.IncludeScopes = true; }) .AddDebug() ); return services.BuildServiceProvider(); } } }