How do you delimit mulitiple Neo4j cypher queries in a script file? - neo4j

I have programmatically generated a bunch of cypher queries to populate a Neo4j database. I wanted to use the drag and drop feature of the Database access page at port 7474 to load the statements. I can execute the individual statements just fine. But the statements in aggregate (delimited with ';') produce a syntax error.

You can use the neo4j-shell (Neo4jShell.bat) to run multiple statements separated by ;
The shell lives in the bin directory of your neo4j-server, but is also available under localhost:7474/webadmin/#/console/.
By default it connects to a running server but you can also specify a database directory:
bin/neo4j-shell -path test.db [-config conf/neo4j.properties] [-file import.cql]
And you can pass along a file to be read and executed (e.g. for import).
On Unix Systems you can also pipe to the shell:
cat import.cql | bin/neo4j-shell -path test.db
See Rik's Blog for more fun with the shell, there is also http://www.neo4j.org/develop/shell

Related

Running CQL file in Neo4j

I have a CQL file called Novis.cql. Its somewhere random on my harddrive, but I want to run it in Neo4J to create my graph (it contains 500+ lines of code).
Where do I have to place it? And what command do I have to run nowadays to get it working? I've read and searched for answers, but some of the commands like Neo4jshell dont seem to work any longer...
Any help would be very appreciated!
The cypher-shell tool has been available for a while (starting with version 3.0, if not earlier), and you can use it to execute a Cypher query from a file that can be anywhere in your file system.
For example (on a linux/unix system), a command line like this will work (if you are in the neo4j home directory):
cat /my/full/path/my_code.cql | bin/cypher-shell -u neo4j -p secret
In neo4j 4.0 a new -f option was added to make it simpler:
bin/cypher-shell -u neo4j -p secret -f /my/full/path/my_code.cql

How to Load Cypher File into Neo4j

I have generated a cypher file and want to load it into neo4j.
The only relevant documentation I could find was about loading csv's.
I also tried the shell but it seems to have no effect
cypher-shell.bat -uneo4j -pne04j < db.cql
Copy paste into localhost:7474/browser makes the browser unresponsive.
In the current Neo4j version you can use Cypher Shell to achieve your goal.
From the docs, Invoke Cypher Shell with a Cypher script from the command line:
$ cat db.cql | bin/cypher-shell -u yourneo4juser -p yourpassword
Note that this example is based in a Linux instalation. If you are using Neo4j with Windows, you will need to adjust this command to your needs.
Not sure when this has been added but in the current version (4.4) an alternative way to load a cypher file to NEO4J (GUI) is by dragging and dropping the cypher file over the web browser, which then offers two options, either to add it to the favorites or to paste it in the editor.

neo4j-shell example of running a Cypher script

I need to run a Cypher query against a Neo4J database, from a command line (for batch scheduling purposes).
When I run this:
./neo4j-shell -file /usr/share/neo4j/scripts/query.cypher -path /usr/share/neo4j/neo4j-community-3.1.1/data/databases/graph.db
I get this error:
ERROR (-v for expanded information):
Error starting org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory, /usr/share/neo4j/neo4j-community-3.1.1/data/databases/graph.db
There is a running Neo4J instance on that database (localhost:7474). I need the script to perform queries against it.
NOTE: this is a split of the original question, for the sake of tidiness.
To execute (one or more) Cypher statements from a file while the neo4j server is running, you can use the APOC procedure apoc.cypher.runFile(file or url).
Since you mention "batch scheduling", the Job management and periodic execution APOC procedures may be helpful. Those procedures could, in turn, execute calls to apoc.cypher.runFile.
Okay I just spun up a fresh instance of Neo4j-community-3.1.1 today and ran into the exact same problem. Note that I had already created a database using the bulk import tool, so one might need to make a directory for a database (mkdir data/databases/graph.db) before using a shell.
I believe your problem might be that you have an instance of Neo4j process running against the database you are trying to access.
For me, shutting down Neo4j, and then starting the shell with an explicit path worked:
cd /path/to/neo4j-community-3.1.1/
bin/neo4j stop ## assuming it is already running (may need a port specifier)
bin/neo4j-shell -path data/databases/graph.db
For some reason I thought you could have both the shell and the server running, but apparently that is not the case. Hopefully someone will correct me if I am wrong.

Possible to specify a file of cypher commands with neo4j-shell-tools?

I want to use the neo4j-shell-tools https://github.com/jexp/neo4j-shell-tools because my desired output is a CSV file. With a single Cypher command, this works great, e.g.,
neo4j restart
neo4j-shell
import-cypher -o out.csv match (p) return count(p) as count
However, I actually have a large number of cypher commands saved in a .cql file that I'd like to run. So long as I don't want to export as a CSV file, I can do so via
neo4j-shell -file neatStuff.cql
However, I haven't been able to find a way to combine these, that is, using import-cypher to export the results of a file's worth of Cypher commands.
Does anyone know if this is possible and, if so, how it would be best done? Thank you.
If using multiple commands is not an issue, you can use a pipe. This works on both Unix-based and Windows systems.
echo 'import-cypher -o out.csv match (p) return count(p) as count' | bin/neo4j-shell
neo4j-shell -file neatStuff.cql
Note: the openCypher style guide recommends the .cypher extensions. If you would like to keep is short, use .cyp as .cql is the extensions for the Cassandra Query Language.
Update: as pointed out by the OP in the comments, the latest version of APOC provides apoc.export.csv.* methods.

Batch execute CREATE statements in Cypher / Neo4j

In Neo4j / Cypher: I have a file that contains about 80,000 statements like this one:
create (n:contract {numctr:"35129",CDETYPCTR:"GENERAL",DATDBTCTR:"455407200000",DATTFINCTR:"455407200000"});
I want to import them in my local neo4j server; when I drag the file to the "Drop a file to import Cypher or Grass" area in the neo4j admin, I get a silent failure (nothing is imported, I can't find an error message).
Is there a better way to execute all the statements in my file, like one would do in mysql:
mysql -u username -p database_name < file-to-import.sql
Thanks
Yann
It's almost the same in Neo4j, if you have semicolon separated statements.
It also helps if you put a BEGIN at the beginning and a COMMIT at the end of your 80k statements so that they are all executed in one transaction.
bin/neo4j-shell -file file-to-import.cql
The shell connects to a running server, if you want to create a new datastore you can provide -path path/to/graph.db

Resources