Neo4j 3.x introduced the concept of user-defined procedures and functions. Those are custom implementations of certain functionality, that can’t be (easily) expressed in Cypher itself. They are implemented in Java and can be easily deployed into your Neo4j instance, and then be called from Cypher directly.
The APOC library consists of many (about 450) procedures and functions to help with many different tasks in areas like data integration, graph algorithms or data conversion.
Apoc was the technician and driver on board of the Nebuchadnezzar in the Matrix movie. He was killed by Cypher.
APOC was also the first bundled A Package Of Component for Neo4j in 2009.
APOC also stands for "Awesome Procedures On Cypher"
APOC is easily installed with Neo4j Desktop, after creating your database just go to the "Manage" screen and the "Plugins" tab. Then click "Install" in the APOC box and you’re done.
Please provide feedback and report bugs as GitHub issues or join the neo4j-users Slack and ask on the #apoc channel.
You might also ask on StackOverflow, please tag your question there with neo4j
and apoc
.
User defined Functions can be used in any expression or predicate, just like built-in functions.
Procedures can be called stand-alone with CALL procedure.name();
But you can also integrate them into your Cypher statements which makes them so much more powerful.
WITH 'https://raw.githubusercontent.com/neo4j-contrib/neo4j-apoc-procedures/{branch}/src/test/resources/person.json' AS url
CALL apoc.load.json(url) YIELD value as person
MERGE (p:Person {name:person.name})
ON CREATE SET p.age = person.age, p.children = size(person.children)
All included procedures are listed in the overview in the documentation and detailed in subsequent sections.
See the APOC User Guide for documentation of each of the major features of the library, including data import/export, graph refactoring, data conversion, and more.
To call procedures correctly, you need to know their parameter names, types and positions. And for YIELDing their results, you have to know the output column names and types.
INFO: The signatures are shown in error messages, if you use a procedure incorrectly.
You can see the procedures signature in the output of CALL apoc.help("name")
(which itself uses dbms.procedures()
and dbms.functions()
)
CALL apoc.help("dijkstra")
The signature is always name : : TYPE
, so in this case:
apoc.algo.dijkstra (startNode :: NODE?, endNode :: NODE?, relationshipTypesAndDirections :: STRING?, weightPropertyName :: STRING?) :: (path :: PATH?, weight :: FLOAT?)
Name | Type |
---|---|
Procedure Parameters |
|
|
|
|
|
|
|
|
|
Output Return Columns |
|
|
|
|
|
Go to http://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/3.4.0.4
to find the latest release and download the binary jar to place into your $NEO4J_HOME/plugins
folder.
Warning
|
Neo4j 3.2 has increased security for procedures and functions (aka sandboxing).
Procedures that use internal APIs have to be allowed in If you want to use this via docker, you need to amend |
Note
|
You can also whitelist procedures and functions in general to be loaded using: Neo4j 3.2 introduces user defined aggregation functions, we will use that feature in APOC in the future, e.g. for export, graph-algorithms and more, instead of passing in Cypher statements to procedures. Please note that about 70 procedures have been turned from procedures into user defined functions.
This includes, |
Since APOC relies in some places on Neo4j’s internal APIs you need to use the right APOC version for your Neo4j installaton.
APOC uses a consistent versioning scheme: <neo4j-version>.<apoc>
version.
The trailing <apoc>
part of the version number will be incremented with every apoc release.
apoc version | neo4j version |
---|---|
3.5.0 (3.5.x) |
|
3.4.10 (3.4.x) |
|
3.3.6 (3.3.x) |
|
3.2.9 (3.2.x) |
|
3.1.7 (3.1.x) |
|
3.0.5-3.0.9 (3.0.x) |
|
3.5.0-beta01 |
|
3.4.5 |
|
3.3.5 |
|
3.2.3 |
|
3.1.5 |
The Neo4j Docker image allows to supply a volume for the /plugins
folder. Download the APOC release fitting your Neo4j version to local folder plugins
and provide it as a data volume:
mkdir plugins
pushd plugins
wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/3.4.0.4/apoc-3.4.0.4-all.jar
popd
docker run --rm -e NEO4J_AUTH=none -p 7474:7474 -v $PWD/plugins:/plugins -p 7687:7687 neo4j:3.4.10
If you want to pass custom apoc config to your Docker instance, you can use environment variables, like here:
docker run \ -p 7474:7474 -p 7687:7687 \ -v $PWD/data:/data -v $PWD/plugins:/plugins \ --name neo4j-apoc \ -e NEO4J_apoc_export_file_enabled=true \ -e NEO4J_apoc_import_file_enabled=true \ -e NEO4J_apoc_import_file_use__neo4j__config=true \ neo4j
git clone http://github.com/neo4j-contrib/neo4j-apoc-procedures ./gradlew shadow cp build/libs/apoc-<version>-SNAPSHOT-all.jar $NEO4J_HOME/plugins/ $NEO4J_HOME/bin/neo4j restart
A full build including running the tests can be run by ./gradlew build
.