Neo4j::Driver::Transaction - Logical container for an atomic unit of work
version 0.14
use Neo4j::Driver; my $session = Neo4j::Driver->new->basic_auth(...)->session; # Commit my $tx = $session->begin_transaction; my $node_id = $tx->run( 'CREATE (p:Person) RETURN id(p)' )->single->get; $tx->run( 'MATCH (p) WHERE id(p) = {id} SET p.name = {name}', {id => $node_id, name => 'Douglas'} ); $tx->commit; # Rollback my $tx = $session->begin_transaction; my $tx->run('CREATE (a:Universal:Answer {value:42})'); $tx->rollback;
Logical container for an atomic unit of work that is either committed in its entirety or is rolled back on failure. A driver Transaction object corresponds to a server transaction.
Statements may be run lazily. Most of the time, you will not notice this, because the driver automatically waits for statements to complete at specific points to fulfill its contracts. If you require execution of a statement to have completed, you need to use the result, for example by calling one of the methods fetch(), list() or summary().
fetch()
list()
summary()
Transactions are often wrapped in a try (or eval) block to ensure that commit and rollback occur correctly. Note that the server will automatically roll back the transaction if any database errors occur while executing statements.
try
eval
commit
rollback
use Try::Tiny; try { $result = $tx->run($query, \%parameters); $tx->commit; } catch { say "Database error: $_"; say "Transaction closed by server." if ! $tx->is_open; };
After commit or rollback, the transaction is automatically closed by the server and can no longer be used. The is_open method can be used to determine the server-side transaction status.
is_open
Neo4j::Driver::Transaction implements the following methods.
$transaction->commit;
Commits the transaction and returns the result.
After committing the transaction is closed and can no longer be used.
my $bool = $transaction->is_open;
Detect whether this transaction is still open, which means commit or rollback did not happen.
Note that this method does not request the transaction status from the Neo4j server. Instead, it uses the status information the server provided along with its previous response, which may be outdated. In particular, a transaction can timeout on the server due to inactivity, in which case it may in fact be closed even though this method returns a true value. The Neo4j server default dbms.transaction_timeout is 60 seconds.
dbms.transaction_timeout
$transaction->rollback;
Rollbacks the transaction.
After rolling back the transaction is closed and can no longer be used.
my $result = $transaction->run($query, %params);
Run a statement and return the StatementResult. This method takes an optional set of parameters that will be injected into the Cypher statement by Neo4j. Using parameters is highly encouraged: It helps avoid dangerous Cypher injection attacks and improves database performance as Neo4j can re-use query plans more often.
Parameters are given as Perl hashref. Alternatively, they may be given as a hash / balanced list.
# all of these are semantically equal my $result = $transaction->run('...', {key => 'value'}); my $result = $transaction->run('...', key => 'value' ); my %hash = (key => 'value'); my $result = $transaction->run('...', \%hash); my $result = $transaction->run('...', %hash);
When used as parameters, Perl values are converted to Neo4j types as shown in the following example:
my $parameters = { number => 0 + $scalar, string => '' . $scalar, true => \1, false => \0, null => undef, list => [ ], map => { }, };
A Perl scalar may internally be represented as a number or a string (see "Scalar values" in perldata). Perl usually auto-converts one into the other based on the context in which the scalar is used. However, Perl cannot know the context of a Neo4j query parameter, because queries are just opaque strings to Perl. Most often your scalars will already have the correct internal flavour. A typical example for a situation in which this is not the case are numbers parsed out of strings using regular expressions. If necessary, you can force conversion of such values into the correct type using unary coercions as shown in the example above.
Running empty queries is supported. Such queries establish a connection with the Neo4j server, which returns a result with zero records. This feature may be used to reset the transaction timeout or test the connection to the server.
my $result = $transaction->run;
Queries are usually strings, but may also be REST::Neo4p::Query or Neo4j::Cypher::Abstract objects. Such objects are automatically converted to strings before they are sent to the Neo4j server.
$transaction->run( REST::Neo4p::Query->new('RETURN 42') ); $transaction->run( Neo4j::Cypher::Abstract->new->return(42) );
Neo4j::Driver::Transaction implements the following experimental features. These are subject to unannounced modification or removal in future versions. Expect your code to break if you depend upon these features.
my @records = $transaction->run('...'); my @results = $transaction->run([...]);
The run method tries to Do What You Mean if called in list context.
run
my $statements = [ [ 'RETURN 42' ], [ 'RETURN {value}', value => 'forty-two' ], ]; my $results = $transaction->run($statements); foreach my $result ( @$results ) { say $result->single->get; }
The Neo4j HTTP API supports executing multiple statements within a single HTTP request. This driver exposes this feature to the client.
This feature is likely to be removed from this driver in favour of lazy execution, similar to the official Neo4j drivers.
my $transaction = $session->begin_transaction; $transaction->{return_stats} = 0; my $result = $transaction->run('...');
Since version 0.13, this driver requests query statistics from the Neo4j server by default. When using HTTP, this behaviour can be disabled. Doing so might provide a very minor performance increase.
The ability to disable the statistics may be removed in future.
my $transaction = $session->begin_transaction; $transaction->{return_graph} = 1; my $records = $transaction->run('...')->list; for $record ( @$records ) { my $graph_data = $record->{graph}; ... }
The Neo4j HTTP API supports a "graph" results data format. This driver exposes this feature to the client and will continue to do so, but the interface is not yet finalised.
Neo4j::Driver, Neo4j::Driver::StatementResult, Neo4j Java Driver, Neo4j JavaScript Driver, Neo4j .NET Driver, Neo4j Python Driver, Neo4j Transactional Cypher HTTP API
Arne Johannessen <ajnn@cpan.org>
This software is Copyright (c) 2016-2019 by Arne Johannessen.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)
To install Neo4j::Driver, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Neo4j::Driver
CPAN shell
perl -MCPAN -e shell install Neo4j::Driver
For more information on module installation, please visit the detailed CPAN module installation guide.