From aa3d05c7b51bb220136e34e234c91d67dc224ff0 Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Wed, 13 Jul 2022 12:45:14 +0200 Subject: [PATCH 1/9] Remove deprecated procedures --- core/src/main/java/apoc/ApocConfig.java | 8 - core/src/main/java/apoc/ApocSettings.java | 3 - core/src/main/java/apoc/algo/PathFinding.java | 20 - core/src/main/java/apoc/coll/Coll.java | 16 - core/src/main/java/apoc/create/Create.java | 29 -- .../java/apoc/cypher/CypherFunctions.java | 5 +- .../java/apoc/cypher/CypherInitializer.java | 10 +- core/src/main/java/apoc/data/Extract.java | 36 -- core/src/main/java/apoc/date/Date.java | 8 - core/src/main/java/apoc/export/Export.java | 50 --- .../formatter/AbstractCypherFormatter.java | 5 +- .../formatter/CreateCypherFormatter.java | 3 +- .../formatter/CypherFormatterUtils.java | 22 +- core/src/main/java/apoc/load/Xml.java | 7 - core/src/main/java/apoc/math/Maths.java | 12 - core/src/main/java/apoc/meta/Meta.java | 60 --- .../java/apoc/refactor/GraphRefactoring.java | 10 - core/src/main/java/apoc/text/Phonetic.java | 27 -- core/src/main/java/apoc/warmup/Warmup.java | 217 ---------- .../test/java/apoc/algo/PathFindingTest.java | 14 - core/src/test/java/apoc/coll/CollTest.java | 13 - .../src/test/java/apoc/create/CreateTest.java | 33 -- .../apoc/cypher/CypherInitializerTest.java | 13 +- .../src/test/java/apoc/cypher/CypherTest.java | 15 - core/src/test/java/apoc/data/ExtractTest.java | 74 ---- core/src/test/java/apoc/date/DateTest.java | 36 -- core/src/test/java/apoc/load/XmlTest.java | 46 --- core/src/test/java/apoc/math/MathsTest.java | 47 --- core/src/test/java/apoc/meta/MetaTest.java | 89 ----- .../src/test/java/apoc/text/PhoneticTest.java | 90 ----- .../src/test/java/apoc/warmup/WarmupTest.java | 71 ---- full/src/main/java/apoc/cache/Static.java | 7 - full/src/main/java/apoc/cluster/Cluster.java | 137 ------- .../java/apoc/custom/CypherProcedures.java | 39 -- .../apoc/custom/CypherProceduresHandler.java | 17 - full/src/main/java/apoc/date/DateExpiry.java | 35 -- full/src/main/java/apoc/load/Jdbc.java | 8 - full/src/main/java/apoc/mongodb/MongoDB.java | 96 ----- .../java/apoc/periodic/PeriodicExtended.java | 145 ------- full/src/test/java/apoc/cache/StaticTest.java | 9 +- .../custom/CypherProceduresClusterTest.java | 16 +- .../custom/CypherProceduresStorageTest.java | 85 ++-- .../apoc/custom/CypherProceduresTest.java | 369 +++--------------- full/src/test/java/apoc/date/TTLTest.java | 68 ---- .../test/java/apoc/mongodb/MongoDBTest.java | 150 ------- .../apoc/periodic/PeriodicExtendedTest.java | 223 ----------- .../test/java/apoc/systemdb/SystemDbTest.java | 13 +- 47 files changed, 131 insertions(+), 2375 deletions(-) delete mode 100644 core/src/main/java/apoc/data/Extract.java delete mode 100644 core/src/main/java/apoc/export/Export.java delete mode 100644 core/src/main/java/apoc/warmup/Warmup.java delete mode 100644 core/src/test/java/apoc/data/ExtractTest.java delete mode 100644 core/src/test/java/apoc/warmup/WarmupTest.java delete mode 100644 full/src/main/java/apoc/cluster/Cluster.java delete mode 100644 full/src/main/java/apoc/date/DateExpiry.java delete mode 100644 full/src/main/java/apoc/periodic/PeriodicExtended.java delete mode 100644 full/src/test/java/apoc/date/TTLTest.java delete mode 100644 full/src/test/java/apoc/periodic/PeriodicExtendedTest.java diff --git a/core/src/main/java/apoc/ApocConfig.java b/core/src/main/java/apoc/ApocConfig.java index 4e80a4a870..391c570df8 100644 --- a/core/src/main/java/apoc/ApocConfig.java +++ b/core/src/main/java/apoc/ApocConfig.java @@ -70,14 +70,6 @@ public enum UuidFormatType { hex, base64 } public static final String APOC_CONFIG_INITIALIZER = "apoc.initializer"; public static final String LOAD_FROM_FILE_ERROR = "Import from files not enabled, please set apoc.import.file.enabled=true in your apoc.conf"; - /** - * @deprecated - * This has been replaced by database-specific initialisers. - * Use apoc.initializer. instead. - */ - @Deprecated - public static final String APOC_CONFIG_INITIALIZER_CYPHER = APOC_CONFIG_INITIALIZER + ".cypher"; - private static final List NEO4J_DIRECTORY_CONFIGURATION_SETTING_NAMES = new ArrayList<>(Arrays.asList( data_directory, load_csv_file_url_root, diff --git a/core/src/main/java/apoc/ApocSettings.java b/core/src/main/java/apoc/ApocSettings.java index e8903064c1..c5b653c6ea 100644 --- a/core/src/main/java/apoc/ApocSettings.java +++ b/core/src/main/java/apoc/ApocSettings.java @@ -39,9 +39,6 @@ public class ApocSettings implements SettingsDeclaration { public static final Setting apoc_uuid_enabled = newBuilder(APOC_UUID_ENABLED, BOOL, false ).build(); - @Deprecated - public static final Setting apoc_initializer_cypher = newBuilder(APOC_CONFIG_INITIALIZER_CYPHER, STRING, null).build(); - public static final Setting apoc_jobs_queue_size = newBuilder(APOC_CONFIG_JOBS_QUEUE_SIZE, LONG, null).build(); public static final Setting apoc_jobs_pool_num_threads = newBuilder(APOC_CONFIG_JOBS_POOL_NUM_THREADS, LONG, null).build(); diff --git a/core/src/main/java/apoc/algo/PathFinding.java b/core/src/main/java/apoc/algo/PathFinding.java index 21adf48b1c..8fa85d2e70 100644 --- a/core/src/main/java/apoc/algo/PathFinding.java +++ b/core/src/main/java/apoc/algo/PathFinding.java @@ -160,26 +160,6 @@ public Stream allSimplePaths( .map(PathResult::new); } - @Procedure(deprecatedBy = "apoc.algo.dijkstra") - @Description("apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS|', " + - "'distance', 10) YIELD path, weight - run dijkstra with relationship property name as cost function" + - " and a default weight if the property does not exist") - @Deprecated - public Stream dijkstraWithDefaultWeight( - @Name("startNode") Node startNode, - @Name("endNode") Node endNode, - @Name("relationshipTypesAndDirections") String relTypesAndDirs, - @Name("weightPropertyName") String weightPropertyName, - @Name("defaultWeight") double defaultWeight) { - - PathFinder algo = GraphAlgoFactory.dijkstra( - new BasicEvaluationContext(tx, db), - buildPathExpander(relTypesAndDirs), - (relationship, direction) -> Util.toDouble(relationship.getProperty(weightPropertyName, defaultWeight)) - ); - return WeightedPathResult.streamWeightedPathResult(startNode, endNode, algo); - } - public static PathExpander buildPathExpander(String relationshipsAndDirections) { PathExpanderBuilder builder = PathExpanderBuilder.empty(); for (Pair pair : RelationshipTypeAndDirections diff --git a/core/src/main/java/apoc/coll/Coll.java b/core/src/main/java/apoc/coll/Coll.java index 3bc9467fdc..4ee8c7858d 100644 --- a/core/src/main/java/apoc/coll/Coll.java +++ b/core/src/main/java/apoc/coll/Coll.java @@ -834,22 +834,6 @@ private static List flattenRecursive(Object aObject, int aDepth) { return flattenRecursive(aObject, aDepth, -1); // we only stop when all lists are flattened } - @Deprecated - @UserFunction - @Description("apoc.coll.reverse(coll) - returns reversed list") - public List reverse(@Name("coll") List coll) { - if (coll == null || coll.isEmpty()) { - return Collections.emptyList(); - } else if (coll.size() == 1) { - return coll; - } - - List reversed = new ArrayList(coll); - Collections.reverse(reversed); - - return reversed; - } - @UserFunction("apoc.coll.sortMulti") @Description("apoc.coll.sortMulti(coll, ['^name','age'],[limit],[skip]) - sort list of maps by several sort fields (ascending with ^ prefix) and optionally applies limit and skip") public List> sortMulti(@Name("coll") java.util.List> coll, diff --git a/core/src/main/java/apoc/create/Create.java b/core/src/main/java/apoc/create/Create.java index a4aa87e531..c7a6207491 100644 --- a/core/src/main/java/apoc/create/Create.java +++ b/core/src/main/java/apoc/create/Create.java @@ -8,7 +8,6 @@ import org.neo4j.internal.helpers.collection.Iterables; import org.neo4j.procedure.*; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; @@ -182,34 +181,6 @@ public Relationship vRelationshipFunction(@Name("from") Node from, @Name("relTyp return new VirtualRelationship(from, to, withName(relType)).withProperties(props); } - @Procedure(deprecatedBy = "apoc.create.virtualPath") - @Deprecated - @Description("apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,...}, {_labels:['LabelB'],key:value}) returns a virtual pattern") - public Stream vPattern(@Name("from") Map n, - @Name("relType") String relType, @Name("props") Map props, - @Name("to") Map m) { - n = new LinkedHashMap<>(n); - m = new LinkedHashMap<>(m); - RelationshipType type = withName(relType); - VirtualNode from = new VirtualNode(Util.labels(n.remove("_labels")), n); - VirtualNode to = new VirtualNode(Util.labels(m.remove("_labels")), m); - Relationship rel = new VirtualRelationship(from, to, withName(relType)).withProperties(props); - return Stream.of(new VirtualPathResult(from, rel, to)); - } - - @Procedure(deprecatedBy = "apoc.create.virtualPath") - @Deprecated - @Description("apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual pattern") - public Stream vPatternFull(@Name("labelsN") List labelsN, @Name("n") Map n, - @Name("relType") String relType, @Name("props") Map props, - @Name("labelsM") List labelsM, @Name("m") Map m) { - RelationshipType type = withName(relType); - VirtualNode from = new VirtualNode(Util.labels(labelsN), n); - VirtualNode to = new VirtualNode(Util.labels(labelsM), m); - Relationship rel = new VirtualRelationship(from, to, type).withProperties(props); - return Stream.of(new VirtualPathResult(from, rel, to)); - } - @Procedure @Description("apoc.create.virtualPath(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual path of nodes joined by a relationship and the associated properties") public Stream virtualPath(@Name("labelsN") List labelsN, @Name("n") Map n, diff --git a/core/src/main/java/apoc/cypher/CypherFunctions.java b/core/src/main/java/apoc/cypher/CypherFunctions.java index 3c57b057e2..4371ca2780 100644 --- a/core/src/main/java/apoc/cypher/CypherFunctions.java +++ b/core/src/main/java/apoc/cypher/CypherFunctions.java @@ -22,10 +22,7 @@ public class CypherFunctions { @Context public Transaction tx; - @UserFunction - @Deprecated - @Description("use either apoc.cypher.runFirstColumnMany for a list return or apoc.cypher.runFirstColumnSingle for returning the first row of the first column") - public Object runFirstColumn(@Name("cypher") String statement, @Name("params") Map params, @Name(value = "expectMultipleValues",defaultValue = "true") boolean expectMultipleValues) { + public Object runFirstColumn(String statement, Map params, boolean expectMultipleValues) { if (params == null) params = Collections.emptyMap(); String resolvedStatement = withParamMapping(statement, params.keySet()); if (!resolvedStatement.contains(" runtime")) resolvedStatement = "cypher runtime=slotted " + resolvedStatement; diff --git a/core/src/main/java/apoc/cypher/CypherInitializer.java b/core/src/main/java/apoc/cypher/CypherInitializer.java index bb3c5f4499..b20ba0365d 100644 --- a/core/src/main/java/apoc/cypher/CypherInitializer.java +++ b/core/src/main/java/apoc/cypher/CypherInitializer.java @@ -76,7 +76,7 @@ public void available() { } Configuration config = dependencyResolver.resolveDependency(ApocConfig.class).getConfig(); - for (String query : collectInitializers(isSystemDatabase, config)) { + for (String query : collectInitializers(config)) { try { // we need to apply a retry strategy here since in systemdb we potentially conflict with // creating constraints which could cause our query to fail with a transient error. @@ -111,18 +111,12 @@ private static String[] splitVersion(String completeVersion) { return completeVersion.split("[^\\d]"); } - private Collection collectInitializers(boolean isSystemDatabase, Configuration config) { + private Collection collectInitializers(Configuration config) { Map initializers = new TreeMap<>(); config.getKeys(ApocConfig.APOC_CONFIG_INITIALIZER + "." + db.databaseName()) .forEachRemaining(key -> putIfNotBlank(initializers, key, config.getString(key))); - // add legacy style initializers - if (!isSystemDatabase) { - config.getKeys(ApocConfig.APOC_CONFIG_INITIALIZER_CYPHER) - .forEachRemaining(key -> initializers.put(key, config.getString(key))); - } - return initializers.values(); } diff --git a/core/src/main/java/apoc/data/Extract.java b/core/src/main/java/apoc/data/Extract.java deleted file mode 100644 index 9de5a107d6..0000000000 --- a/core/src/main/java/apoc/data/Extract.java +++ /dev/null @@ -1,36 +0,0 @@ -package apoc.data; - -import org.neo4j.procedure.Description; -import org.neo4j.procedure.Name; -import org.neo4j.procedure.UserFunction; - -import java.util.regex.Pattern; - -/** - * Extracts domains from URLs and email addresses - * @deprecated use ExtractEmail or ExtractURI - */ -@Deprecated -public class Extract { - - public static final Pattern DOMAIN = Pattern.compile("([\\w-]+\\.[\\w-]+)+(\\w+)"); - - @UserFunction - @Description("apoc.data.domain('url_or_email_address') YIELD domain - extract the domain name from a url or an email address. If nothing was found, yield null.") - public String domain(final @Name("url_or_email_address") String value) { - if (value != null) { - if (value.contains("@")) { - String[] tokens = value.split("[@/<>]"); - for (int i = tokens.length - 1; i >= 0; i--) { - String token = tokens[i]; - if (DOMAIN.matcher(token).matches()) return token; - } - } else { - for (String part : value.split("[@/<>]")) { - if (DOMAIN.matcher(part).matches()) return part; - } - } - } - return null; - } -} diff --git a/core/src/main/java/apoc/date/Date.java b/core/src/main/java/apoc/date/Date.java index e4ccd7acc1..fd29bbb7fa 100644 --- a/core/src/main/java/apoc/date/Date.java +++ b/core/src/main/java/apoc/date/Date.java @@ -165,14 +165,6 @@ public Long parse(@Name("time") String time, @Name(value = "unit", defaultValue return value == null ? null : unit(unit).convert(value, TimeUnit.MILLISECONDS); } - @UserFunction(deprecatedBy = "apoc.temporal.toZonedTemporal") - @Description("apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') - parse date string using the specified format to specified timezone") - @Deprecated - public ZonedDateTime parseAsZonedDateTime(@Name("time") String time, @Name(value = "format", defaultValue = DEFAULT_FORMAT) String format, final @Name(value = "timezone", defaultValue = "UTC") String timezone) { - Long value = parseOrThrow(time, getFormat(format, timezone)); - return value == null ? null : Instant.ofEpochMilli(value).atZone(ZoneId.of(timezone)); - } - @UserFunction @Description("apoc.date.systemTimezone() - returns the system timezone display name") public String systemTimezone() { diff --git a/core/src/main/java/apoc/export/Export.java b/core/src/main/java/apoc/export/Export.java deleted file mode 100644 index e3c16100eb..0000000000 --- a/core/src/main/java/apoc/export/Export.java +++ /dev/null @@ -1,50 +0,0 @@ -package apoc.export; - -import org.neo4j.procedure.Description; -import apoc.export.cypher.ExportCypher; -import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.Relationship; -import org.neo4j.procedure.Context; -import org.neo4j.procedure.Name; -import org.neo4j.procedure.Procedure; - -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; - -/** - * @author mh - * @since 22.05.16 - */ -public class Export { - @Context - public GraphDatabaseService db; - - @Procedure - @Deprecated - @Description("apoc.export.cypherAll(file,config) - exports whole database incl. indexes as cypher statements to the provided file") - public Stream cypherAll(@Name("file") String fileName, @Name("config") Map config) throws Exception { - return new ExportCypher(db).all(fileName,config); - } - - @Procedure - @Deprecated - @Description("apoc.export.cypherData(nodes,rels,file,config) - exports given nodes and relationships incl. indexes as cypher statements to the provided file") - public Stream cypherData(@Name("nodes") List nodes, @Name("rels") List rels, @Name("file") String fileName, @Name("config") Map config) throws Exception { - return new ExportCypher(db).data(nodes,rels,fileName,config); - } - @Procedure - @Deprecated - @Description("apoc.export.cypherGraph(graph,file,config) - exports given graph object incl. indexes as cypher statements to the provided file") - public Stream cypherGraph(@Name("graph") Map graph, @Name("file") String fileName, @Name("config") Map config) throws Exception { - return new ExportCypher(db).graph(graph,fileName,config); - } - - @Procedure - @Deprecated - @Description("apoc.export.cypherQuery(query,file,config) - exports nodes and relationships from the cypher kernelTransaction incl. indexes as cypher statements to the provided file") - public Stream cypherQuery(@Name("query") String query, @Name("file") String fileName, @Name("config") Map config) throws Exception { - return new ExportCypher(db).query(query,fileName,config); - } -} diff --git a/core/src/main/java/apoc/export/cypher/formatter/AbstractCypherFormatter.java b/core/src/main/java/apoc/export/cypher/formatter/AbstractCypherFormatter.java index 21e6281bee..bc066d0b45 100644 --- a/core/src/main/java/apoc/export/cypher/formatter/AbstractCypherFormatter.java +++ b/core/src/main/java/apoc/export/cypher/formatter/AbstractCypherFormatter.java @@ -24,7 +24,6 @@ import static apoc.export.cypher.formatter.CypherFormatterUtils.Q_UNIQUE_ID_LABEL; import static apoc.export.cypher.formatter.CypherFormatterUtils.Q_UNIQUE_ID_REL; import static apoc.export.cypher.formatter.CypherFormatterUtils.UNIQUE_ID_PROP; -import static apoc.export.cypher.formatter.CypherFormatterUtils.quote; import static apoc.export.cypher.formatter.CypherFormatterUtils.simpleKeyValue; /** @@ -46,7 +45,7 @@ abstract class AbstractCypherFormatter implements CypherFormatter { public String statementForCleanUp(int batchSize) { return "MATCH (n:" + Q_UNIQUE_ID_LABEL + ") " + " WITH n LIMIT " + batchSize + - " REMOVE n:" + Q_UNIQUE_ID_LABEL + " REMOVE n." + quote(UNIQUE_ID_PROP) + ";"; + " REMOVE n:" + Q_UNIQUE_ID_LABEL + " REMOVE n." + Util.quote(UNIQUE_ID_PROP) + ";"; } @Override @@ -103,7 +102,7 @@ private String getIfNotExists(boolean ifNotExists) { private String getPropertiesQuoted(Iterable keys, String prefix) { String keysString = StreamSupport.stream(keys.spliterator(), false) - .map(key -> prefix + CypherFormatterUtils.quote(key)) + .map(key -> prefix + Util.quote(key)) .collect(Collectors.joining(", ")); return keysString; } diff --git a/core/src/main/java/apoc/export/cypher/formatter/CreateCypherFormatter.java b/core/src/main/java/apoc/export/cypher/formatter/CreateCypherFormatter.java index 55aa6bb50b..fdb6738761 100644 --- a/core/src/main/java/apoc/export/cypher/formatter/CreateCypherFormatter.java +++ b/core/src/main/java/apoc/export/cypher/formatter/CreateCypherFormatter.java @@ -2,6 +2,7 @@ import apoc.export.util.ExportConfig; import apoc.export.util.Reporter; +import apoc.util.Util; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; @@ -42,7 +43,7 @@ public String statementForRelationship(Relationship relationship, Map prop } public static String formatPropertyName(String id, String prop, Object value, boolean jsonStyle) { - return (id != null && !"".equals(id) ? id + "." : "") + quote(prop) + (jsonStyle ? ":" : "=" ) + toString(value); + return (id != null && !"".equals(id) ? id + "." : "") + Util.quote(prop) + (jsonStyle ? ":" : "=" ) + toString(value); } // ---- to string ---- @@ -207,7 +207,7 @@ public static String quote(Iterable ids) { StringBuilder builder = new StringBuilder(); for (Iterator iterator = ids.iterator(); iterator.hasNext(); ) { String id = iterator.next(); - builder.append(quote(id)); + builder.append(Util.quote(id)); if (iterator.hasNext()) { builder.append(","); } @@ -215,16 +215,8 @@ public static String quote(Iterable ids) { return builder.toString(); } - @Deprecated - /** - * use {@link Util#quote()} - */ - public static String quote(String id) { - return Util.quote(id); - } - public static String label(String id) { - return ":" + quote(id); + return ":" + Util.quote(id); } public static String toString(Object value) { @@ -280,7 +272,7 @@ public static String arrayToString(Object value) { public static String cypherNode(Label label) { return String.format("(%s)", label == null ? "" : ":" + Util.quote(label.name())); } - + public static String simpleKeyValue(String key, Object value) { return String.format("{%s:%s}", key, value); } diff --git a/core/src/main/java/apoc/load/Xml.java b/core/src/main/java/apoc/load/Xml.java index 7fa42a3be0..9ec0bf6634 100644 --- a/core/src/main/java/apoc/load/Xml.java +++ b/core/src/main/java/apoc/load/Xml.java @@ -478,13 +478,6 @@ public void addCurrentCharacterIndex(int length) { } } - @Procedure(mode = Mode.WRITE, value = "apoc.xml.import") - @Deprecated - @Description("Deprecated by apoc.import.xml") - public Stream importToGraphDeprecated(@Name("url") String url, @Name(value = "config", defaultValue = "{}") Map config) throws IOException, XMLStreamException { - return importToGraph(url, config); - } - @Procedure(mode = Mode.WRITE, value = "apoc.import.xml") @Description("apoc.import.xml(file,config) - imports graph from provided file") public Stream importToGraph(@Name("urlOrBinary") Object urlOrBinary, @Name(value = "config", defaultValue = "{}") Map config) throws IOException, XMLStreamException { diff --git a/core/src/main/java/apoc/math/Maths.java b/core/src/main/java/apoc/math/Maths.java index afcc9f9a27..23102800b0 100644 --- a/core/src/main/java/apoc/math/Maths.java +++ b/core/src/main/java/apoc/math/Maths.java @@ -4,23 +4,11 @@ import org.neo4j.procedure.Name; import org.neo4j.procedure.UserFunction; -import java.math.BigDecimal; -import java.math.RoundingMode; - /** * @author mh * @since 12.12.16 */ public class Maths { - @UserFunction(deprecatedBy = "Neo4j round() function. This function will be removed in version 5.0") - @Deprecated - @Description("apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY])") - public Double round(@Name("value") Double value, - @Name(value = "precision",defaultValue = "0") long precision, - @Name(value = "mode",defaultValue = "HALF_UP") String mode) { - if (value == null) return null; - return BigDecimal.valueOf(value).setScale((int)precision, RoundingMode.valueOf(mode)).doubleValue(); - } @UserFunction @Description("apoc.math.maxLong() | return the maximum value a long can have") diff --git a/core/src/main/java/apoc/meta/Meta.java b/core/src/main/java/apoc/meta/Meta.java index 7ed0a4f8bd..e8ec99e7b2 100644 --- a/core/src/main/java/apoc/meta/Meta.java +++ b/core/src/main/java/apoc/meta/Meta.java @@ -242,66 +242,6 @@ public MetaResult elementType(String elementType) { } } - @Deprecated - @UserFunction - @Description("apoc.meta.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST)") - public String type(@Name("value") Object value) { - return typeName(value); - } - @Deprecated - @UserFunction - @Description("apoc.meta.typeName(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST)") - public String typeName(@Name("value") Object value) { - Types type = Types.of(value); - - String typeName; - - // In order to keep the backwards compatibility - switch (type) { - case POINT: case DATE: case DATE_TIME: case LOCAL_TIME: case LOCAL_DATE_TIME: case TIME: case DURATION: case ANY: - typeName = value.getClass().getSimpleName(); - break; - case LIST: - Class clazz = value.getClass(); - if (value != null && clazz.isArray()) { - typeName = clazz.getComponentType().getSimpleName() + "[]"; - break; - } - default: - typeName = type.name(); - } - - return typeName; - - } - - @Deprecated - @UserFunction - @Description("apoc.meta.types(node-relationship-map) - returns a map of keys to types") - public Map types(@Name("properties") Object target) { - Map properties = Collections.emptyMap(); - if (target instanceof Node) properties = ((Node)target).getAllProperties(); - if (target instanceof Relationship) properties = ((Relationship)target).getAllProperties(); - if (target instanceof Map) { - //noinspection unchecked - properties = (Map) target; - } - - Map result = new LinkedHashMap<>(properties.size()); - properties.forEach((key,value) -> { - result.put(key, typeName(value)); - }); - - return result; - } - - @Deprecated - @UserFunction - @Description("apoc.meta.isType(value,type) - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST)") - public boolean isType(@Name("value") Object value, @Name("type") String type) { - return type.equalsIgnoreCase(typeName(value)); - } - @UserFunction("apoc.meta.cypher.isType") @Description("apoc.meta.cypher.isType(value,type) - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,MAP,LIST OF ,POINT,DATE,DATE_TIME,LOCAL_TIME,LOCAL_DATE_TIME,TIME,DURATION)") public boolean isTypeCypher(@Name("value") Object value, @Name("type") String type) { diff --git a/core/src/main/java/apoc/refactor/GraphRefactoring.java b/core/src/main/java/apoc/refactor/GraphRefactoring.java index 91c8e30e5a..6bdec64632 100644 --- a/core/src/main/java/apoc/refactor/GraphRefactoring.java +++ b/core/src/main/java/apoc/refactor/GraphRefactoring.java @@ -126,16 +126,6 @@ public Stream cloneNodes(@Name("nodes") List nodes, return doCloneNodes(nodes, withRelationships, skipProperties); } - /** - * this procedure takes a list of nodes and clones them with their labels, properties and relationships - */ - @Procedure(mode = Mode.WRITE) - @Deprecated - @Description("apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) clone nodes with their labels, properties and relationships") - public Stream cloneNodesWithRelationships(@Name("nodes") List nodes) { - return doCloneNodes(nodes, true, Collections.emptyList()); - } - /** * this procedure clones a subgraph defined by a list of nodes and relationships. The resulting clone is a disconnected subgraph, * with no relationships connecting with the original nodes, nor with any other node outside the subgraph clone. diff --git a/core/src/main/java/apoc/text/Phonetic.java b/core/src/main/java/apoc/text/Phonetic.java index ae14e80b26..b5a95b7ab2 100644 --- a/core/src/main/java/apoc/text/Phonetic.java +++ b/core/src/main/java/apoc/text/Phonetic.java @@ -2,7 +2,6 @@ import org.apache.commons.codec.language.DoubleMetaphone; import org.neo4j.procedure.Description; -import apoc.result.StringResult; import org.apache.commons.codec.EncoderException; import org.neo4j.procedure.Name; import org.neo4j.procedure.Procedure; @@ -10,7 +9,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import java.util.stream.StreamSupport; import static org.apache.commons.codec.language.Soundex.US_ENGLISH; @@ -18,16 +16,6 @@ public class Phonetic { private static final DoubleMetaphone DOUBLE_METAPHONE = new DoubleMetaphone(); - @Procedure - @Deprecated - @Description("apoc.text.phonetic(value) yield value - Compute the US_ENGLISH phonetic soundex encoding of all words of the text value which can be a single string or a list of strings") - public Stream phonetic(final @Name("value") Object value) { - Stream stream = value instanceof Iterable ? StreamSupport.stream(((Iterable) value).spliterator(), false) : Stream.of(value); - - return stream.map(str -> str == null ? StringResult.EMPTY : - new StringResult(Stream.of(str.toString().split("\\W+")) - .map(US_ENGLISH::soundex).reduce("", (a, s)->a+s))); - } @UserFunction @Description("apoc.text.phonetic(text) yield value - Compute the US_ENGLISH phonetic soundex encoding of all words of the text") public String phonetic(final @Name("value") String value) { @@ -45,21 +33,6 @@ public Stream phoneticDelta(final @Name("text1") String text1, f } } - @Procedure - @Deprecated - @Description("apoc.text.doubleMetaphone(value) yield value - Compute the Double Metaphone phonetic encoding of all words of the text value which can be a single string or a list of strings") - public Stream doubleMetaphone(final @Name("value") Object value) - { - Stream stream = value instanceof Iterable ? StreamSupport.stream(((Iterable) value).spliterator(), false) : Stream.of(value); - - return stream.map(str -> - (str == null) ? StringResult.EMPTY : - str.toString().trim().isEmpty() ? - new StringResult("") : - new StringResult(Stream.of(str.toString().trim().split("\\W+")).map(DOUBLE_METAPHONE::doubleMetaphone).collect(Collectors.joining("")) - )); - } - @UserFunction @Description("apoc.text.doubleMetaphone(value) yield value - Compute the Double Metaphone phonetic encoding of all words of the text value") public String doubleMetaphone(final @Name("value") String value) diff --git a/core/src/main/java/apoc/warmup/Warmup.java b/core/src/main/java/apoc/warmup/Warmup.java deleted file mode 100644 index 10eb4408d4..0000000000 --- a/core/src/main/java/apoc/warmup/Warmup.java +++ /dev/null @@ -1,217 +0,0 @@ -package apoc.warmup; - -import apoc.util.Util; -import org.neo4j.graphdb.Transaction; -import org.neo4j.io.pagecache.PageCache; -import org.neo4j.io.pagecache.PageCursor; -import org.neo4j.io.pagecache.PagedFile; -import org.neo4j.kernel.api.KernelTransaction; -import org.neo4j.kernel.impl.coreapi.InternalTransaction; -import org.neo4j.kernel.internal.GraphDatabaseAPI; -import org.neo4j.logging.Log; -import org.neo4j.procedure.*; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * @author Sascha Peukert - * @since 06.05.16 - */ -public class Warmup { - - @Context - public Transaction tx; - @Context - public GraphDatabaseAPI db; - @Context - public TerminationGuard guard; - @Context - public Log log; - - static class PageResult { - public final String file; - public final boolean index; - public final long fileSize; - public final long pages; - public final String error; - public final long time; - - public PageResult(String file, boolean index, long fileSize, long pages, String error, long start) { - this.file = file; - this.index = index; - this.fileSize = fileSize; - this.pages = pages; - this.error = error; - this.time = System.currentTimeMillis() - start; - } - } - - private String subPath(File file, String fromParent) { - StringBuilder sb = new StringBuilder(file.getAbsolutePath().length()); - while (true) { - sb.insert(0,file.getName()); - file = file.getParentFile(); - if (file == null || file.getName().equals(fromParent)) break; - sb.insert(0, File.separator); - } - return sb.toString(); - } - - @Deprecated - @Procedure( deprecatedBy = "Firstly, the procedure duplicates functionality of page cache warm up which is a part of the DBMS. " + - "Secondly, the API of this procedure is very specific to Record storage engine." ) - @Description("apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time") - public Stream run(@Name(value = "loadProperties", defaultValue = "false") boolean loadProperties, @Name(value = "loadDynamicProperties", defaultValue = "false") boolean loadDynamicProperties, @Name(value = "loadIndexes", defaultValue = "false") boolean loadIndexes) throws IOException { - PageCache pageCache = db.getDependencyResolver().resolveDependency(PageCache.class); - KernelTransaction ktx = ((InternalTransaction)tx).kernelTransaction(); - - List pagedFiles = pageCache.listExistingMappings(); - - Map records = pagedFiles.parallelStream() - .filter(pF -> { - String name = pF.path().toFile().getName(); - if (isSchema(pF.path().toFile()) && !loadIndexes) return false; - if ((name.endsWith("propertystore.db.strings") || name.endsWith("propertystore.db.arrays")) && !loadDynamicProperties) return false; - if ((name.startsWith("propertystore.db")) && !loadProperties) return false; - return true; - }) - .map((pagedFile -> { - File file = pagedFile.path().toFile(); - boolean index = isSchema(file); - String fileName = index ? subPath(file, "schema") : file.getName(); - long pages = 0; - long start = System.currentTimeMillis(); - try { - if (pagedFile.fileSize() > 0) { - PageCursor cursor = pagedFile.io(0L, PagedFile.PF_READ_AHEAD | PagedFile.PF_SHARED_READ_LOCK, ktx.cursorContext()); - while (cursor.next()) { - cursor.getByte(); - pages++; - if (pages % 1000 == 0 && Util.transactionIsTerminated(guard)) { - break; - } - } - } - return new PageResult(fileName, index, pagedFile.fileSize(), pages, null, start); - } catch (IOException e) { - return new PageResult(fileName, index, -1L, pages, e.getMessage(), start); - } - })).collect(Collectors.toMap(r -> r.file, r -> r)); - - WarmupResult result = new WarmupResult( - pageCache.pageSize(), - Util.nodeCount(tx), - records.get("neostore.nodestore.db"), - Util.relCount(tx), - records.get("neostore.relationshipstore.db"), - records.get("neostore.relationshipgroupstore.db"), - loadProperties, - records.get("neostore.propertystore.db"), - records.values().stream().mapToLong((r)->r.time).sum(), - Util.transactionIsTerminated(guard), - loadDynamicProperties, - records.get("neostore.propertystore.db.strings"), - records.get("neostore.propertystore.db.arrays"), - loadIndexes, - records.values().stream().filter(r -> r.index).collect(Collectors.toList()) - ); - return Stream.of(result); - } - - public boolean isSchema(File file) { - return file.getAbsolutePath().contains(File.separator+"schema"+File.separator); - } - - public static class WarmupResult { - public final long pageSize; - public final long totalTime; - public final boolean transactionWasTerminated; - - public long nodesPerPage; - public final long nodesTotal; - public final long nodePages; - public final long nodesTime; - - public long relsPerPage; - public final long relsTotal; - public final long relPages; - public final long relsTime; - public long relGroupsPerPage; - public long relGroupsTotal; - public final long relGroupPages; - public final long relGroupsTime; - public final boolean propertiesLoaded; - public final boolean dynamicPropertiesLoaded; - public long propsPerPage; - public long propRecordsTotal; - public long propPages; - public long propsTime; - public long stringPropsPerPage; - public long stringPropRecordsTotal; - public long stringPropPages; - public long stringPropsTime; - public long arrayPropsPerPage; - public long arrayPropRecordsTotal; - public long arrayPropPages; - public long arrayPropsTime; - public final boolean indexesLoaded; - public long indexPages; - public long indexTime; - - public WarmupResult(long pageSize, - long nodesTotal, - PageResult nodes, - long relsTotal, - PageResult rels, - PageResult relGroups, - boolean propertiesLoaded, - PageResult props, - long totalTime, boolean transactionWasTerminated, - boolean dynamicPropertiesLoaded, - PageResult stringProps, - PageResult arrayProps, - boolean loadIndexes, - List indexes - ) { - this.pageSize = pageSize; - this.transactionWasTerminated = transactionWasTerminated; - this.totalTime = totalTime; - this.propertiesLoaded = propertiesLoaded; - this.dynamicPropertiesLoaded = dynamicPropertiesLoaded; - - this.nodesTotal = nodesTotal; - this.nodePages = nodes.pages; - this.nodesTime = nodes.time; - - this.relsTotal = relsTotal; - this.relPages = rels.pages; - this.relsTime = rels.time; - - this.relGroupPages = relGroups.pages; - this.relGroupsTime = relGroups.time; - - if (props!=null) { - this.propPages = props.pages; - this.propsTime = props.time; - } - if (stringProps != null) { - this.stringPropPages = stringProps.pages; - this.stringPropsTime = stringProps.time; - } - if (arrayProps != null) { - this.arrayPropPages = arrayProps.pages; - this.arrayPropsTime = arrayProps.time; - } - this.indexesLoaded = loadIndexes; - if (!indexes.isEmpty()) { - this.indexPages = indexes.stream().mapToLong(pr -> pr.pages).sum(); - this.indexTime = indexes.stream().mapToLong(pr -> pr.time).sum(); - } - } - } -} diff --git a/core/src/test/java/apoc/algo/PathFindingTest.java b/core/src/test/java/apoc/algo/PathFindingTest.java index 96f68de7fb..b558e27760 100644 --- a/core/src/test/java/apoc/algo/PathFindingTest.java +++ b/core/src/test/java/apoc/algo/PathFindingTest.java @@ -111,20 +111,6 @@ public void testDijkstra() { ); } - @Test - public void testDijkstraWithDefaultWeight() { - db.executeTransactionally(SETUP_MISSING_PROPERTY); - testCall(db, - "MATCH (from:Loc{name:'A'}), (to:Loc{name:'D'}) " + - "CALL apoc.algo.dijkstraWithDefaultWeight(from, to, 'ROAD>', 'd', 10.5) yield path, weight " + - "RETURN path, weight", - row -> { - assertEquals(30.5, row.get("weight")); - assertEquals(2, ((Path) (row.get("path"))).length()); // 3nodes, 2 rels - } - ); - } - @Test public void testDijkstraMultipleShortest() { db.executeTransactionally(SETUP_SIMPLE); diff --git a/core/src/test/java/apoc/coll/CollTest.java b/core/src/test/java/apoc/coll/CollTest.java index 9093fe0195..5382ffe80c 100644 --- a/core/src/test/java/apoc/coll/CollTest.java +++ b/core/src/test/java/apoc/coll/CollTest.java @@ -745,19 +745,6 @@ public void testOccurrences() throws Exception { (row) -> assertEquals(0l, row.get("value"))); } - @Test - public void testReverseOnNullAndEmptyList() throws Exception { - testCall(db, "RETURN apoc.coll.reverse([]) as value", - (row) -> assertEquals(Collections.EMPTY_LIST, row.get("value"))); - testCall(db, "RETURN apoc.coll.reverse(null) as value", - (row) -> assertEquals(Collections.EMPTY_LIST, row.get("value"))); - } - - @Test - public void testReverse() throws Exception { - testCall(db, "RETURN apoc.coll.reverse([1,2,1,3,2,5,2,3,1,2]) as value", - (row) -> assertEquals(asList(2l, 1l, 3l, 2l, 5l, 2l, 3l, 1l, 2l, 1l), row.get("value"))); - } @Test public void testFlatten() throws Exception { testCall(db, "RETURN apoc.coll.flatten([[1,2],[3,4],[4],[5,6,7]]) as value", diff --git a/core/src/test/java/apoc/create/CreateTest.java b/core/src/test/java/apoc/create/CreateTest.java index 4fda6e2ee2..bbb7be3d23 100644 --- a/core/src/test/java/apoc/create/CreateTest.java +++ b/core/src/test/java/apoc/create/CreateTest.java @@ -196,39 +196,6 @@ public void testCreateVirtualRelationshipFunction() throws Exception { }); } - @Test - public void testCreatePattern() throws Exception { - testCall(db, "CALL apoc.create.vPattern({_labels:['Person'],name:'John'},'KNOWS',{since:2010},{_labels:['Person'],name:'Jane'})", - (row) -> { - Node john = (Node) row.get("from"); - assertEquals(true, john.hasLabel(PERSON)); - assertEquals("John", john.getProperty("name")); - Relationship rel = (Relationship) row.get("rel"); - assertEquals(true, rel.isType(RelationshipType.withName("KNOWS"))); - assertEquals(2010L, rel.getProperty("since")); - Node jane = (Node) row.get("to"); - assertEquals(true, jane.hasLabel(PERSON)); - assertEquals("Jane", jane.getProperty("name")); - }); - } - - @Test - public void testCreatePatternFull() throws Exception { - testCall(db, "CALL apoc.create.vPatternFull(['Person'],{name:'John'},'KNOWS',{since:2010},['Person'],{name:'Jane'})", - (row) -> { - Node john = (Node) row.get("from"); - assertEquals(true, john.hasLabel(PERSON)); - assertEquals("John", john.getProperty("name")); - Relationship rel = (Relationship) row.get("rel"); - assertEquals(true, rel.isType(RelationshipType.withName("KNOWS"))); - assertEquals(2010L, rel.getProperty("since")); - Node jane = (Node) row.get("to"); - assertEquals(true, jane.hasLabel(PERSON)); - assertEquals("Jane", jane.getProperty("name")); - }); - } - - @Test public void testVirtualFromNodeFunction() throws Exception { testCall(db, "CREATE (n:Person{name:'Vincent', born: 1974} ) RETURN apoc.create.virtual.fromNode(n, ['name']) as node", diff --git a/core/src/test/java/apoc/cypher/CypherInitializerTest.java b/core/src/test/java/apoc/cypher/CypherInitializerTest.java index 98f0addebf..d45ec2ee38 100644 --- a/core/src/test/java/apoc/cypher/CypherInitializerTest.java +++ b/core/src/test/java/apoc/cypher/CypherInitializerTest.java @@ -21,7 +21,6 @@ import org.neo4j.test.rule.ImpermanentDbmsRule; import static apoc.ApocConfig.APOC_CONFIG_INITIALIZER; -import static apoc.ApocConfig.APOC_CONFIG_INITIALIZER_CYPHER; import static org.junit.Assert.assertEquals; import static org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME; import static org.neo4j.configuration.GraphDatabaseSettings.SYSTEM_DATABASE_NAME; @@ -80,7 +79,7 @@ public void noInitializerWorks() { @Test @Env({ - @EnvSetting(key= APOC_CONFIG_INITIALIZER_CYPHER, value="") + @EnvSetting(key= APOC_CONFIG_INITIALIZER + "." + DEFAULT_DATABASE_NAME, value="") }) public void emptyInitializerWorks() { expectNodeCount(0); @@ -88,7 +87,7 @@ public void emptyInitializerWorks() { @Test @Env({ - @EnvSetting(key= APOC_CONFIG_INITIALIZER_CYPHER, value="create()") + @EnvSetting(key= APOC_CONFIG_INITIALIZER + "." + DEFAULT_DATABASE_NAME, value="create()") }) public void singleInitializerWorks() { expectNodeCount(1); @@ -96,8 +95,8 @@ public void singleInitializerWorks() { @Test @Env({ // this only creates 2 nodes if the statements run in same order - @EnvSetting(key= APOC_CONFIG_INITIALIZER_CYPHER + ".0", value="create()"), - @EnvSetting(key= APOC_CONFIG_INITIALIZER_CYPHER + ".1", value="match (n) create ()") + @EnvSetting(key= APOC_CONFIG_INITIALIZER + "." + DEFAULT_DATABASE_NAME + ".0", value="create()"), + @EnvSetting(key= APOC_CONFIG_INITIALIZER + "." + DEFAULT_DATABASE_NAME + ".1", value="match (n) create ()") }) public void multipleInitializersWorks() { expectNodeCount(2); @@ -105,8 +104,8 @@ public void multipleInitializersWorks() { @Test @Env({ // this only creates 1 node since the first statement doesn't do anything - @EnvSetting(key= APOC_CONFIG_INITIALIZER_CYPHER + ".0", value="match (n) create ()"), - @EnvSetting(key= APOC_CONFIG_INITIALIZER_CYPHER + ".1", value="create()") + @EnvSetting(key= APOC_CONFIG_INITIALIZER + "." + DEFAULT_DATABASE_NAME + ".0", value="match (n) create ()"), + @EnvSetting(key= APOC_CONFIG_INITIALIZER + "." + DEFAULT_DATABASE_NAME + ".1", value="create()") }) public void multipleInitializersWorks2() { expectNodeCount(1); diff --git a/core/src/test/java/apoc/cypher/CypherTest.java b/core/src/test/java/apoc/cypher/CypherTest.java index b0da58d8e0..a4657699d9 100644 --- a/core/src/test/java/apoc/cypher/CypherTest.java +++ b/core/src/test/java/apoc/cypher/CypherTest.java @@ -139,21 +139,6 @@ public void testRunFirstColumnBugCompiled() { assertEquals(1, recs.size()); } - @Test - public void testRunFirstColumnBugDirection() { - db.executeTransactionally("CREATE (m:Movie {title:'MovieA'})<-[:ACTED_IN]-(p:Person {name:'PersonA'})-[:ACTED_IN]->(m2:Movie {title:'MovieB'})"); - String query = "MATCH (m:Movie {title:'MovieA'}) RETURN apoc.cypher.runFirstColumn('WITH $m AS m MATCH (m)<-[:ACTED_IN]-(:Person)-[:ACTED_IN]->(rec:Movie) RETURN rec LIMIT 10', {m:m}, true) as rec"; - testCall(db, query, - r -> assertEquals("MovieB", ((Node)((List)r.get("rec")).get(0)).getProperty("title"))); - } - - @Test - public void testRunFirstColumnMultipleValues() { - List expected = Arrays.asList(1L, 2L, 3L); - testCall(db, "RETURN apoc.cypher.runFirstColumn('UNWIND [1, 2, 3] AS e RETURN e', {}, true) AS arr", - r -> assertEquals(expected, r.get("arr"))); - } - @Test public void testSingular() { int size = 10_000; diff --git a/core/src/test/java/apoc/data/ExtractTest.java b/core/src/test/java/apoc/data/ExtractTest.java deleted file mode 100644 index 703a0e072e..0000000000 --- a/core/src/test/java/apoc/data/ExtractTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package apoc.data; - -import apoc.util.TestUtil; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.neo4j.test.rule.DbmsRule; -import org.neo4j.test.rule.ImpermanentDbmsRule; - -import static apoc.util.MapUtil.map; -import static apoc.util.TestUtil.testCall; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertEquals; - -public class ExtractTest { - - @Rule - public DbmsRule db = new ImpermanentDbmsRule(); - - @Before - public void setUp() throws Exception { - TestUtil.registerProcedure(db, Extract.class); - } - - @Test - public void testQuotedEmail() { - testCall(db, "RETURN apoc.data.domain('') AS value", - row -> Assert.assertThat(row.get("value"), equalTo("bar.baz"))); - } - - @Test - public void testEmail() { - testCall(db, "RETURN apoc.data.domain('foo@bar.baz') AS value", - row -> Assert.assertThat(row.get("value"), equalTo("bar.baz"))); - } - - @Test - public void testNull() { - testCall(db, "RETURN apoc.data.domain(null) AS value", - row -> assertEquals(null, row.get("value"))); - } - - @Test - public void testBadString() { - testCall(db, "RETURN apoc.data.domain('asdsgawe4ge') AS value", - row -> assertEquals(null, row.get("value"))); - } - - @Test - public void testEmptyString() { - testCall(db, "RETURN apoc.data.domain('') AS value", - row -> assertEquals(null, row.get("value"))); - } - - @Test - public void testUrl() { - testCall(db, "RETURN apoc.data.domain('http://www.example.com/lots-of-stuff') AS value", - row -> assertEquals("www.example.com", row.get("value"))); - } - - @Test - public void testQueryParameter() { - testCall(db, "RETURN apoc.data.domain($param) AS value", - map("param", "www.foo.bar/baz"), - row -> assertEquals("www.foo.bar", row.get("value"))); - } - - @Test - public void testEmailWithDotsBeforeAt() { - testCall(db, "RETURN apoc.data.domain('foo.foo@bar.baz') AS value", - row -> Assert.assertThat(row.get("value"), equalTo("bar.baz"))); - } -} diff --git a/core/src/test/java/apoc/date/DateTest.java b/core/src/test/java/apoc/date/DateTest.java index acb80aebda..c15359d8f2 100644 --- a/core/src/test/java/apoc/date/DateTest.java +++ b/core/src/test/java/apoc/date/DateTest.java @@ -18,7 +18,6 @@ import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; -import java.time.ZonedDateTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.HashMap; @@ -135,41 +134,6 @@ public void testToUnixtimeWithEmptyInput() throws Exception { row -> assertEquals(null, row.get("value"))); } - @Test public void testParseAsZonedDateTimeWithCorrectFormat() throws Exception { - testCall(db, - "RETURN apoc.date.parseAsZonedDateTime('03/23/1965 00:00:00','MM/dd/yyyy HH:mm:ss','America/New_York') AS value", - row -> assertEquals(ZonedDateTime.of(LocalDateTime.of(1965, 3, 23, 0, 0), ZoneId.of("America/New_York")), - row.get("value"))); - } - - @Test public void testParseAsZonedDateTimeWithDefaultTimezone() throws Exception { - testCall(db, - "RETURN apoc.date.parseAsZonedDateTime('03/23/1965 00:00:00','MM/dd/yyyy HH:mm:ss') AS value", - row -> assertEquals(ZonedDateTime.of(LocalDateTime.of(1965, 3, 23, 0, 0), ZoneId.of("UTC")), - row.get("value"))); - } - - @Test public void testParseAsZonedDateTimeWithDefaultFormatAndTimezone() throws Exception { - testCall(db, - "RETURN apoc.date.parseAsZonedDateTime('1965-03-23 00:00:00') AS value", - row -> assertEquals(ZonedDateTime.of(LocalDateTime.of(1965, 3, 23, 0, 0), ZoneId.of("UTC")), - row.get("value"))); - } - - @Test public void testParseAsZonedDateTimeWithIncorrectPatternFormat() throws Exception { - expected.expect(instanceOf(QueryExecutionException.class)); - testCall(db, - "RETURN apoc.date.parseAsZonedDateTime('03/23/1965 00:00:00','MM/dd/yyyy HH:mm:ss/neo4j','America/New_York') AS value", - row -> assertEquals(ZonedDateTime.of(LocalDateTime.of(1965, 3, 23, 0, 0), ZoneId.of("America/New_York")), - row.get("value"))); - } - - @Test public void testToZonedDateTimeWithNullInput() throws Exception { - testCall(db, - "RETURN apoc.date.parseAsZonedDateTime(NULL) AS value", - row -> assertNull(row.get("value"))); - } - @Test public void testToISO8601() throws Exception { testCall(db, "RETURN apoc.date.toISO8601(0) AS value", diff --git a/core/src/test/java/apoc/load/XmlTest.java b/core/src/test/java/apoc/load/XmlTest.java index d9db827af9..e4f09a69fa 100644 --- a/core/src/test/java/apoc/load/XmlTest.java +++ b/core/src/test/java/apoc/load/XmlTest.java @@ -251,15 +251,6 @@ public void testLoadXmlNoFailOnError () { }); } - @Test - public void testLoadXmlWithNextWordRels() { - thrown.expect(QueryExecutionException.class); - thrown.expectMessage("usage of `createNextWordRelationships` is no longer allowed. Use `{relType:'NEXT_WORD', label:'XmlWord'}` instead."); - - db.executeTransactionally("call apoc.xml.import('file:" + FILE_SHORTENED + "', " + - "{createNextWordRelationships: true, filterLeadingWhitespace: true}) yield node"); - } - @Test public void testLoadXmlWithNextWordRelsWithBinaryFile() { final String query = "CALL apoc.import.xml($data, $config) YIELD node"; @@ -271,13 +262,6 @@ public void testLoadXmlWithNextWordRelsWithBinaryFile() { commonAssertionsWithNextWordRels(query, config); } - @Test - public void testLoadXmlWithNextWordRelsWithNewConfigOptions() { - final String query = "call apoc.xml.import('file:" + FILE_SHORTENED + "', " + - "{relType: 'NEXT_WORD', label: 'XmlWord', filterLeadingWhitespace: true}) yield node"; - commonAssertionsWithNextWordRels(query, Collections.emptyMap()); - } - private void commonAssertionsWithNextWordRels(String query, Map config) { testCall(db, query, config, row -> assertNotNull(row.get("node"))); testResult(db, "match (n) return labels(n)[0] as label, count(*) as count", result -> { @@ -304,36 +288,6 @@ private void commonAssertionsWithNextWordRels(String query, Map }); } - - @Test - public void testLoadXmlWithNextEntityRels() { - testCall(db, "call apoc.xml.import('file:" + FILE_SHORTENED + "', " + - "{connectCharacters: true, filterLeadingWhitespace: true}) yield node", - row -> assertNotNull(row.get("node"))); - testResult(db, "match (n) return labels(n)[0] as label, count(*) as count", result -> { - final Map resultMap = result.stream().collect(Collectors.toMap(o -> (String)o.get("label"), o -> (Long)o.get("count"))); - assertEquals(2L, (long)resultMap.get("XmlProcessingInstruction")); - assertEquals(1L, (long)resultMap.get("XmlDocument")); - assertEquals(369L, (long)resultMap.get("XmlCharacters")); - assertEquals(158L, (long)resultMap.get("XmlTag")); - }); - - // no node more than one NEXT/NEXT_SIBLING - testCallEmpty(db, "match (n) where size([p = (n)-[:NEXT]->() | p ]) > 1 return n", null); - testCallEmpty(db, "match (n) where size([p = (n)-[:NEXT_SIBLING]->() | p ]) > 1 return n", null); - - // no node more than one IS_FIRST_CHILD / IS_LAST_CHILD - testCallEmpty(db, "match (n) where size([p = (n)<-[:FIRST_CHILD_OF]-() | p ]) > 1 return n", null); - testCallEmpty(db, "match (n) where size([p = (n)<-[:LAST_CHILD_OF]-() | p ]) > 1 return n", null); - - // NEXT_WORD relationship do connect all word nodes - testResult(db, "match p=(:XmlDocument)-[:NE*]->(e:XmlCharacters) where not (e)-[:NE]->() return length(p) as len", - result -> { - Map r = Iterators.single(result); - assertEquals(369L, r.get("len")); - }); - } - @Test public void testLoadXmlFromZip() { testResult(db, "call apoc.load.xml('file:src/test/resources/testload.zip!xml/books.xml') yield value as catalog\n" + diff --git a/core/src/test/java/apoc/math/MathsTest.java b/core/src/test/java/apoc/math/MathsTest.java index dd0c77de68..4746e6dbdc 100644 --- a/core/src/test/java/apoc/math/MathsTest.java +++ b/core/src/test/java/apoc/math/MathsTest.java @@ -7,10 +7,8 @@ import org.neo4j.test.rule.DbmsRule; import org.neo4j.test.rule.ImpermanentDbmsRule; -import java.math.RoundingMode; import static apoc.util.TestUtil.testCall; -import static apoc.util.Util.map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -23,51 +21,6 @@ public class MathsTest { TestUtil.registerProcedure(db,Maths.class); } - @Test public void testRoundMode() throws Exception { - testRound(0.5, 1.0, RoundingMode.UP); - testRound(0.5, 1.0, RoundingMode.CEILING); - testRound(0.5, 1.0, RoundingMode.HALF_UP); - testRound(0.5, 0.0, RoundingMode.HALF_DOWN); - testRound(0.5, 0.0, RoundingMode.DOWN); - testRound(0.5, 0.0, RoundingMode.HALF_EVEN); - testRound(0.5, 0.0, RoundingMode.FLOOR); - - testRound(-0.5, -1.0, RoundingMode.UP); - testRound(-0.5, 0.0, RoundingMode.CEILING); - testRound(-0.5, -1.0, RoundingMode.HALF_UP); - testRound(-0.5, 0.0, RoundingMode.HALF_DOWN); - testRound(-0.5, 0.0, RoundingMode.DOWN); - testRound(-0.5, 0.0, RoundingMode.HALF_EVEN); - testRound(-0.5, -1.0, RoundingMode.FLOOR); - } - @Test public void testRoundPrecision() throws Exception { - testRound(Math.PI,3.0,0); - testRound(Math.PI,3.1,1); - testRound(Math.PI,3.14,2); - testRound(Math.PI,3.142,3); - testRound(Math.PI,3.1416,4); - } - @Test public void testRoundSimple() throws Exception { - testRound(1.49, 1.0); - testRound(1.2, 1.0); - testRound(1.0, 1.0); - testRound(0.5, 1.0); - testRound(-0.5, -1.0); - testRound(0.3, 0); - testRound(-0.3, 0); - testRound(0.0, 0); - } - - public void testRound(double value, double expected) { - testCall(db, "RETURN apoc.math.round($value) as value",map("value",value), (row) -> assertEquals(expected,row.get("value"))); - } - public void testRound(double value, double expected, int precision) { - testCall(db, "RETURN apoc.math.round($value,$prec) as value",map("value",value,"prec",precision), (row) -> assertEquals(expected,row.get("value"))); - } - public void testRound(double value, double expected, RoundingMode mode) { - testCall(db, "RETURN apoc.math.round($value,$prec,$mode) as value",map("value",value,"prec",0,"mode",mode.name()), (row) -> assertEquals(expected,row.get("value"))); - } - @Test public void testMaxLong(){ testCall(db, "RETURN apoc.math.maxLong() as max",(row) -> assertEquals(Long.MAX_VALUE,row.get("max"))); } diff --git a/core/src/test/java/apoc/meta/MetaTest.java b/core/src/test/java/apoc/meta/MetaTest.java index f523e301ac..ccde8ec1cb 100644 --- a/core/src/test/java/apoc/meta/MetaTest.java +++ b/core/src/test/java/apoc/meta/MetaTest.java @@ -5,7 +5,6 @@ import apoc.util.TestUtil; import apoc.util.Util; import org.assertj.core.api.Assertions; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -13,11 +12,9 @@ import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Label; import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.Path; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Result; -import org.neo4j.graphdb.Transaction; import org.neo4j.internal.helpers.collection.Iterables; import org.neo4j.test.rule.DbmsRule; import org.neo4j.test.rule.ImpermanentDbmsRule; @@ -57,7 +54,6 @@ import static org.neo4j.configuration.SettingImpl.newBuilder; import static org.neo4j.configuration.SettingValueParsers.BOOL; import static org.neo4j.driver.Values.isoDuration; -import static org.neo4j.graphdb.traversal.Evaluators.toDepth; public class MetaTest { @@ -171,91 +167,6 @@ public void testMetaGraphExtraRels() throws Exception { }); } - @Test - public void testMetaType() throws Exception { - try (Transaction tx = db.beginTx()) { - Node node = tx.createNode(); - Relationship rel = node.createRelationshipTo(node, RelationshipType.withName("FOO")); - testTypeName(node, "NODE"); - testTypeName(rel, "RELATIONSHIP"); - Path path = tx.traversalDescription().evaluator(toDepth(1)).traverse(node).iterator().next(); -// TODO PATH FAILS testTypeName(path, "PATH"); - tx.rollback(); - } - testTypeName(singletonMap("a", 10), "MAP"); - testTypeName(asList(1, 2), "LIST"); - testTypeName(1L, "INTEGER"); - testTypeName(1, "INTEGER"); - testTypeName(1.0D, "FLOAT"); - testTypeName(1.0, "FLOAT"); - testTypeName("a", "STRING"); - testTypeName(false, "BOOLEAN"); - testTypeName(true, "BOOLEAN"); - testTypeName(null, "NULL"); - } - - @Test - public void testMetaTypeArray() throws Exception { - testTypeName(asList(1,2), "LIST"); - testTypeName(asList(LocalDate.of(2018, 1, 1),2), "LIST"); - testTypeName(new Integer[] {1, 2}, "int[]"); - testTypeName(new Float[] {1f, 2f}, "float[]"); - testTypeName(new Double[] {1d, 2d}, "double[]"); - testTypeName(new String[] {"a", "b"}, "String[]"); - testTypeName(new Long[] {1l, 2l}, "long[]"); - testTypeName(new LocalDate[] {LocalDate.of(2018, 1, 1), LocalDate.of(2018, 1, 1)}, "LIST"); - testTypeName(new Object[] {1d, ""}, "LIST"); - } - - @Test - public void testMetaIsType() throws Exception { - try (Transaction tx = db.beginTx()) { - Node node = tx.createNode(); - Relationship rel = node.createRelationshipTo(node, RelationshipType.withName("FOO")); - testIsTypeName(node, "NODE"); - testIsTypeName(rel, "RELATIONSHIP"); - Path path = tx.traversalDescription().evaluator(toDepth(1)).traverse(node).iterator().next(); -// TODO PATH FAILS testIsTypeName(path, "PATH"); - tx.rollback(); - } - testIsTypeName(singletonMap("a", 10), "MAP"); - testIsTypeName(asList(1, 2), "LIST"); - testIsTypeName(1L, "INTEGER"); - testIsTypeName(1, "INTEGER"); - testIsTypeName(1.0D, "FLOAT"); - testIsTypeName(1.0, "FLOAT"); - testIsTypeName("a", "STRING"); - testIsTypeName(false, "BOOLEAN"); - testIsTypeName(true, "BOOLEAN"); - testIsTypeName(null, "NULL"); - } - @Test - public void testMetaTypes() throws Exception { - - Map param = map("MAP", singletonMap("a", 10), - "LIST", asList(1, 2), - "INTEGER", 1L, - "FLOAT", 1.0D, - "STRING", "a", - "BOOLEAN", true, - "NULL", null); - TestUtil.testCall(db, "RETURN apoc.meta.types($param) AS value", singletonMap("param",param), row -> { - Map res = (Map) row.get("value"); - res.forEach(Assert::assertEquals); - }); - - } - - private void testTypeName(Object value, String type) { - TestUtil.testCall(db, "RETURN apoc.meta.typeName($value) AS value", singletonMap("value", value), row -> assertEquals(type, row.get("value"))); -// TestUtil.testCall(db, "RETURN apoc.meta.type($value) AS value", singletonMap("value", value), row -> assertEquals(type, row.get("value"))); - } - - private void testIsTypeName(Object value, String type) { - TestUtil.testCall(db, "RETURN apoc.meta.isType($value,$type) AS value", map("value", value, "type", type), result -> assertEquals("type was not "+type,true, result.get("value"))); - TestUtil.testCall(db, "RETURN apoc.meta.isType($value,$type) AS value", map("value", value, "type", type + "foo"), result -> assertEquals(false, result.get("value"))); - } - @Test public void testMetaStats() throws Exception { db.executeTransactionally("CREATE (:Actor)-[:ACTED_IN]->(:Movie) "); diff --git a/core/src/test/java/apoc/text/PhoneticTest.java b/core/src/test/java/apoc/text/PhoneticTest.java index b08c2e75e0..0d3f5b284d 100644 --- a/core/src/test/java/apoc/text/PhoneticTest.java +++ b/core/src/test/java/apoc/text/PhoneticTest.java @@ -21,57 +21,6 @@ public void setUp() throws Exception { TestUtil.registerProcedure(db, Phonetic.class); } - @Test - public void shouldComputeSimpleSoundexEncoding() { - testCall(db, "CALL apoc.text.phonetic('HellodearUser!')", (row) -> - assertThat(row.get("value"), equalTo("H436")) - ); - testCall(db, "RETURN apoc.text.phonetic('HellodearUser!') as value", (row) -> - assertThat(row.get("value"), equalTo("H436")) - ); - } - - @Test - public void shouldComputeSimpleSoundexEncodingOfNull() { - testCall(db, "CALL apoc.text.phonetic(null)", (row) -> - assertThat(row.get("value"), equalTo(null)) - ); - testCall(db, "RETURN apoc.text.phonetic(null) as value", (row) -> - assertThat(row.get("value"), equalTo(null)) - ); - } - - @Test - public void shouldComputeEmptySoundexEncodingForTheEmptyString() { - testCall(db, "CALL apoc.text.phonetic('')", (row) -> - assertThat(row.get("value"), equalTo("")) - ); - testCall(db, "RETURN apoc.text.phonetic('') as value", (row) -> - assertThat(row.get("value"), equalTo("")) - ); - } - - @Test - public void shouldComputeSoundexEncodingOfManyWords() { - testCall(db, "CALL apoc.text.phonetic('Hello, dear User!')", (row) -> - assertThat(row.get("value"), equalTo("H400D600U260")) - ); - testCall(db, "RETURN apoc.text.phonetic('Hello, dear User!') as value", (row) -> - assertThat(row.get("value"), equalTo("H400D600U260")) - ); - } - - - @Test - public void shouldComputeSoundexEncodingOfManyWordsEvenIfTheStringContainsSomeExtraChars() { - testCall(db, "CALL apoc.text.phonetic(' ,Hello, dear User 5!')", (row) -> - assertThat(row.get("value"), equalTo("H400D600U260")) - ); - testCall(db, "RETURN apoc.text.phonetic(' ,Hello, dear User 5!') as value", (row) -> - assertThat(row.get("value"), equalTo("H400D600U260")) - ); - } - @Test public void shouldComputeSoundexDifference() { testCall(db, "CALL apoc.text.phoneticDelta('Hello Mr Rabbit', 'Hello Mr Ribbit')", (row) -> @@ -79,43 +28,4 @@ public void shouldComputeSoundexDifference() { ); } - @Test - public void shoudlComputeDoubleMetaphone() { - testCall(db, "CALL apoc.text.doubleMetaphone('Apoc')", (row) -> - assertThat(row.get("value"), equalTo("APK")) - ); - testCall(db, "RETURN apoc.text.doubleMetaphone('Apoc') as value", (row) -> - assertThat(row.get("value"), equalTo("APK")) - ); - } - - @Test - public void shoudlComputeDoubleMetaphoneOfNull() { - testCall(db, "CALL apoc.text.doubleMetaphone(NULL)", (row) -> - assertThat(row.get("value"), equalTo(null)) - ); - testCall(db, "RETURN apoc.text.doubleMetaphone(NULL) as value", (row) -> - assertThat(row.get("value"), equalTo(null)) - ); - } - - @Test - public void shoudlComputeDoubleMetaphoneForTheEmptyString() { - testCall(db, "CALL apoc.text.doubleMetaphone('')", (row) -> - assertThat(row.get("value"), equalTo("")) - ); - testCall(db, "RETURN apoc.text.doubleMetaphone('') as value", (row) -> - assertThat(row.get("value"), equalTo("")) - ); - } - - @Test - public void shouldComputeDoubleMetaphoneOfManyWords() { - testCall(db, "CALL apoc.text.doubleMetaphone('Hello, dear User!')", (row) -> - assertThat(row.get("value"), equalTo("HLTRASR")) - ); - testCall(db, "RETURN apoc.text.doubleMetaphone('Hello, dear User!') as value ", (row) -> - assertThat(row.get("value"), equalTo("HLTRASR")) - ); - } } diff --git a/core/src/test/java/apoc/warmup/WarmupTest.java b/core/src/test/java/apoc/warmup/WarmupTest.java deleted file mode 100644 index 2f39d32c68..0000000000 --- a/core/src/test/java/apoc/warmup/WarmupTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package apoc.warmup; - -import apoc.util.TestUtil; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.neo4j.test.rule.DbmsRule; -import org.neo4j.test.rule.ImpermanentDbmsRule; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; - -/** - * @author Sascha Peukert - * @since 06.05.16 - */ -public class WarmupTest { - - @Rule - public DbmsRule db = new ImpermanentDbmsRule(); - - @Before - public void setUp() throws Exception { - TestUtil.registerProcedure(db, Warmup.class); - // Create enough nodes and relationships to span 2 pages - db.executeTransactionally("CREATE CONSTRAINT FOR (f:Foo) REQUIRE f.foo IS UNIQUE"); - db.executeTransactionally("UNWIND range(1, 300) AS i CREATE (n:Foo {foo:i})-[:KNOWS {bar:2}]->(m {foobar:3, array:range(1,100)})"); - // Delete all relationships and their nodes, but ones with the minimum and maximum relationship ids, so - // they still span 2 pages - db.executeTransactionally("MATCH ()-[r:KNOWS]->() " + - "WITH [min(id(r)), max(id(r))] AS ids " + - "MATCH (n)-[r:KNOWS]->(m) " + - "WHERE NOT id(r) IN ids " + - "DELETE n, m, r"); - } - - @Test - public void testWarmup() throws Exception { - TestUtil.testCall(db, "CALL apoc.warmup.run()", r -> { - assertEquals(4L, r.get("nodesTotal")); - assertNotEquals(0L, r.get("nodePages")); - assertEquals(2L, r.get("relsTotal")); - assertNotEquals(0L, r.get("relPages")); - }); - } - - @Test - public void testWarmupProperties() throws Exception { - TestUtil.testCall(db, "CALL apoc.warmup.run(true)", r -> { - assertEquals(true, r.get("propertiesLoaded")); - assertNotEquals(0L, r.get("propPages")); - }); - } - - @Test - public void testWarmupDynamicProperties() throws Exception { - TestUtil.testCall(db, "CALL apoc.warmup.run(true,true)", r -> { - assertEquals(true, r.get("propertiesLoaded")); - assertEquals(true, r.get("dynamicPropertiesLoaded")); - assertNotEquals(0L, r.get("arrayPropPages")); - }); - } - - @Test - public void testWarmupIndexes() throws Exception { - TestUtil.testCall(db, "CALL apoc.warmup.run(true,true,true)", r -> { - assertEquals(true, r.get("indexesLoaded")); - assertNotEquals( 0L, r.get("indexPages") ); - }); - } -} diff --git a/full/src/main/java/apoc/cache/Static.java b/full/src/main/java/apoc/cache/Static.java index 0c2cecd258..91edd32aed 100644 --- a/full/src/main/java/apoc/cache/Static.java +++ b/full/src/main/java/apoc/cache/Static.java @@ -28,13 +28,6 @@ public class Static { private static Map storage = new HashMap<>(); - @Procedure("apoc.static.get") - @Deprecated - @Description("apoc.static.get(name) - returns statically stored value from config (apoc.static.) or server lifetime storage") - public Stream getProcedure(@Name("key") String key) { - return Stream.of(new ObjectResult(storage.getOrDefault(key, fromConfig(key)))); - } - @UserFunction("apoc.static.get") @Description("apoc.static.get(name) - returns statically stored value from config (apoc.static.) or server lifetime storage") public Object get(@Name("key") String key) { diff --git a/full/src/main/java/apoc/cluster/Cluster.java b/full/src/main/java/apoc/cluster/Cluster.java deleted file mode 100644 index b35398b719..0000000000 --- a/full/src/main/java/apoc/cluster/Cluster.java +++ /dev/null @@ -1,137 +0,0 @@ -package apoc.cluster; - -import apoc.Description; -import apoc.Extended; -import apoc.result.GraphResult; -import apoc.result.VirtualNode; -import apoc.result.VirtualRelationship; -import org.neo4j.configuration.Config; -import org.neo4j.configuration.connectors.BoltConnector; -import org.neo4j.configuration.helpers.SocketAddress; -import org.neo4j.graphdb.*; -import org.neo4j.kernel.internal.GraphDatabaseAPI; -import org.neo4j.procedure.Context; -import org.neo4j.procedure.Procedure; - -import java.util.*; -import java.util.stream.Stream; - -import static java.util.Collections.singletonMap; - -@Extended -public class Cluster -{ - @Context - public Transaction tx; - @Context - public GraphDatabaseAPI api; - - private static final String boltAddressKey = "bolt_address"; - private static final Map shortName = new HashMap() - {{ - put( "LEADER", "L" ); - put( "FOLLOWER", "F" ); - put( "READ_REPLICA", "RR" ); - }}; - - @Procedure - @Deprecated - @Description( "apoc.cluster.graph - visually displays the servers participating in the Causal Cluster, their " + - "roles, and which server in the cluster you are connected to." ) - public Stream graph() - { - Result execute = tx.execute( "CALL dbms.cluster.overview()" ); - List servers = new LinkedList<>(); - List relationships = new LinkedList<>(); - - while ( execute.hasNext() ) - { - Map next = execute.next(); - String role = (String) next.get( "role" ); - String id = (String) next.get( "id" ); - Label roleLabel = Label.label( role ); - String[] addresses = ((List) next.get( "addresses" )).toArray( new String[0] ); - Map properties = new HashMap<>(); - properties.put( "name", shortName.get( role ) ); - properties.put( "title", role ); - properties.put( boltAddressKey, addresses[0] ); - properties.put( "http_address", addresses[1] ); - properties.put( "cluster_id", id ); - Node server = new VirtualNode( new Label[]{roleLabel}, properties ); - servers.add( server ); - } - - Optional leaderNode = getLeaderNode( servers ); - if ( leaderNode.isPresent() ) - { - for ( Node server : servers ) - { - if ( server.hasLabel( Label.label( "FOLLOWER" ) ) ) - { - VirtualRelationship follows = - new VirtualRelationship( server, leaderNode.get(), RelationshipType.withName( "FOLLOWS" ) ); - relationships.add( follows ); - } - } - } - - VirtualNode client = - new VirtualNode( new Label[]{Label.label( "CLIENT" )}, singletonMap( "name", "Client" ) ); - Optional clientConnection = determineClientConnection( servers, client ); - if ( clientConnection.isPresent() ) - { - servers.add( client ); - relationships.add( clientConnection.get() ); - } - - GraphResult graphResult = new GraphResult( servers, relationships ); - return Stream.of( graphResult ); - } - - private Optional determineClientConnection( List servers, Node client ) - { - Optional boltAddress = getBoltConnector(); - if ( boltAddress.isPresent() ) - { - for ( Node server : servers ) - { - if ( serverHasBoltAddress( boltAddress.get(), server ) ) - { - return Optional.of( new VirtualRelationship( client, server, - RelationshipType.withName( "CONNECTED_TO" ) ) ); - } - } - } - return Optional.empty(); - } - - private Optional getBoltConnector() - { - Config config = api.getDependencyResolver().resolveDependency( Config.class ); - if ( config.get(BoltConnector.enabled) ) - { - SocketAddress advertisedAddress = config.get(BoltConnector.advertised_address); - return Optional.of( "neo4j://" + advertisedAddress ); - } - return Optional.empty(); - } - - private boolean serverHasBoltAddress( String boltAddress, Node server ) - { - String address = (String) server.getProperty( boltAddressKey ); - return address.equals( boltAddress ); - } - - - private Optional getLeaderNode( List servers ) - { - for ( Node server : servers ) - { - if ( server.hasLabel( Label.label( "LEADER" ) ) ) - { - return Optional.of( server ); - } - } - return Optional.empty(); - } -} diff --git a/full/src/main/java/apoc/custom/CypherProcedures.java b/full/src/main/java/apoc/custom/CypherProcedures.java index 26d85d3b4e..2de81b7667 100644 --- a/full/src/main/java/apoc/custom/CypherProcedures.java +++ b/full/src/main/java/apoc/custom/CypherProcedures.java @@ -12,7 +12,6 @@ import org.neo4j.internal.kernel.api.procs.UserFunctionSignature; import org.neo4j.internal.kernel.api.procs.FieldSignature; import org.neo4j.internal.kernel.api.procs.Neo4jTypes; -import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.logging.Log; @@ -50,36 +49,12 @@ public class CypherProcedures { @Context public GraphDatabaseAPI api; - @Context - public KernelTransaction ktx; - @Context public Log log; @Context public CypherProceduresHandler cypherProceduresHandler; - /* - * store in graph properties, load at startup - * allow to register proper params as procedure-params - * allow to register proper return columns - * allow to register mode - */ - @Procedure(value = "apoc.custom.asProcedure",mode = Mode.WRITE, deprecatedBy = "apoc.custom.declareProcedure") - @Description("apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description) - register a custom cypher procedure") - @Deprecated - public void asProcedure(@Name("name") String name, @Name("statement") String statement, - @Name(value = "mode",defaultValue = "read") String mode, - @Name(value= "outputs", defaultValue = "null") List> outputs, - @Name(value= "inputs", defaultValue = "null") List> inputs, - @Name(value= "description", defaultValue = "") String description - ) throws ProcedureException { - ProcedureSignature signature = cypherProceduresHandler.procedureSignature(name, mode, outputs, inputs, description); - Mode modeProcedure = cypherProceduresHandler.mode(mode); - validateProcedure(statement, signature.inputSignature(), signature.outputSignature(), modeProcedure); - cypherProceduresHandler.storeProcedure(signature, statement); - } - @Procedure(value = "apoc.custom.declareProcedure", mode = Mode.WRITE) @Description("apoc.custom.declareProcedure(signature, statement, mode, description) - register a custom cypher procedure") public void declareProcedure(@Name("signature") String signature, @Name("statement") String statement, @@ -95,20 +70,6 @@ public void declareProcedure(@Name("signature") String signature, @Name("stateme cypherProceduresHandler.storeProcedure(procedureSignature, statement); } - - @Procedure(value = "apoc.custom.asFunction",mode = Mode.WRITE, deprecatedBy = "apoc.custom.declareFunction") - @Description("apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description) - register a custom cypher function") - @Deprecated - public void asFunction(@Name("name") String name, @Name("statement") String statement, - @Name(value= "outputs", defaultValue = "") String output, - @Name(value= "inputs", defaultValue = "null") List> inputs, - @Name(value = "forceSingle", defaultValue = "false") boolean forceSingle, - @Name(value = "description", defaultValue = "") String description) throws ProcedureException { - UserFunctionSignature signature = cypherProceduresHandler.functionSignature(name, output, inputs, description); - validateFunction(statement, signature.inputSignature()); - cypherProceduresHandler.storeFunction(signature, statement, forceSingle); - } - @Procedure(value = "apoc.custom.declareFunction", mode = Mode.WRITE) @Description("apoc.custom.declareFunction(signature, statement, forceSingle, description) - register a custom cypher function") public void declareFunction(@Name("signature") String signature, @Name("statement") String statement, diff --git a/full/src/main/java/apoc/custom/CypherProceduresHandler.java b/full/src/main/java/apoc/custom/CypherProceduresHandler.java index da270b9505..5f7f5109ab 100644 --- a/full/src/main/java/apoc/custom/CypherProceduresHandler.java +++ b/full/src/main/java/apoc/custom/CypherProceduresHandler.java @@ -319,18 +319,6 @@ private long getLastUpdate() { }); } - public ProcedureSignature procedureSignature(String name, String mode, List> outputs, List> inputs, String description) { - boolean admin = false; // TODO - return new ProcedureSignature(qualifiedName(name), inputSignatures(inputs), outputSignatures(outputs), - Mode.valueOf(mode.toUpperCase()), admin, null, new String[0], description, null, false, false, true, false, false - ); - } - - public UserFunctionSignature functionSignature(String name, String output, List> inputs, String description) { - AnyType outType = typeof(output.isEmpty() ? "LIST OF MAP" : output); - return new UserFunctionSignature(qualifiedName(name), inputSignatures(inputs), outType, null, description, "apoc.custom", false, false, false); - } - /** * * @param signature @@ -447,11 +435,6 @@ public List inputSignatures(@Name(value = "inputs", defaultValue return inputSignature; } - public List outputSignatures(@Name(value = "outputs", defaultValue = "null") List> outputs) { - return outputs == null ? singletonList(FieldSignature.inputField("row", NTMap)) : - outputs.stream().map(pair -> FieldSignature.outputField(pair.get(0), typeof(pair.get(1)))).collect(Collectors.toList()); - } - private static Neo4jTypes.AnyType typeof(String typeName) { typeName = typeName.replaceAll("\\?", ""); typeName = typeName.toUpperCase(); diff --git a/full/src/main/java/apoc/date/DateExpiry.java b/full/src/main/java/apoc/date/DateExpiry.java deleted file mode 100644 index 0b441d4bf3..0000000000 --- a/full/src/main/java/apoc/date/DateExpiry.java +++ /dev/null @@ -1,35 +0,0 @@ -package apoc.date; - -import apoc.Extended; -import org.neo4j.graphdb.Label; -import org.neo4j.graphdb.Node; -import org.neo4j.procedure.Description; -import org.neo4j.procedure.Mode; -import org.neo4j.procedure.Name; -import org.neo4j.procedure.Procedure; - -import static apoc.date.Date.unit; - - -/** - * @author tkroman - * @since 9.04.2016 - */ -@Extended -public class DateExpiry { - @Procedure(mode = Mode.WRITE, deprecatedBy = "apoc.ttl.expire") - @Description("CALL apoc.date.expire(node,time,'time-unit') - expire node at specified time by setting :TTL label and `ttl` property") - @Deprecated - public void expire(@Name("node") Node node, @Name("time") long time, @Name("timeUnit") String timeUnit) { - node.addLabel(Label.label("TTL")); - node.setProperty("ttl",unit(timeUnit).toMillis(time)); - } - - @Procedure(mode = Mode.WRITE, deprecatedBy = "apoc.ttl.expireIn") - @Description("CALL apoc.date.expireIn(node,time,'time-unit') - expire node after specified length of time time by setting :TTL label and `ttl` property") - @Deprecated - public void expireIn(@Name("node") Node node, @Name("timeDelta") long time, @Name("timeUnit") String timeUnit) { - node.addLabel(Label.label("TTL")); - node.setProperty("ttl",System.currentTimeMillis() + unit(timeUnit).toMillis(time)); - } -} diff --git a/full/src/main/java/apoc/load/Jdbc.java b/full/src/main/java/apoc/load/Jdbc.java index 5497b0cab1..14f534c6c5 100644 --- a/full/src/main/java/apoc/load/Jdbc.java +++ b/full/src/main/java/apoc/load/Jdbc.java @@ -66,14 +66,6 @@ public Stream jdbc(@Name("jdbc") String urlOrKey, @Name("tableOrSql") return executeQuery(urlOrKey, tableOrSelect, config, params.toArray(new Object[params.size()])); } - @Procedure - @Deprecated - @Description("deprecated - please use: apoc.load.jdbc('key or url','',[params]) YIELD row - load from relational database, from a sql statement with parameters") - public Stream jdbcParams(@Name("jdbc") String urlOrKey, @Name("sql") String select, @Name("params") List params, @Name(value = "config",defaultValue = "{}") Map config) { - params = params != null ? params : Collections.emptyList(); - return executeQuery(urlOrKey, select, config, params.toArray(new Object[params.size()])); - } - private Stream executeQuery(String urlOrKey, String tableOrSelect, Map config, Object... params) { LoadJdbcConfig loadJdbcConfig = new LoadJdbcConfig(config); String url = getUrlOrKey(urlOrKey); diff --git a/full/src/main/java/apoc/mongodb/MongoDB.java b/full/src/main/java/apoc/mongodb/MongoDB.java index 0a8af8fdad..0b215bc6f9 100644 --- a/full/src/main/java/apoc/mongodb/MongoDB.java +++ b/full/src/main/java/apoc/mongodb/MongoDB.java @@ -1,7 +1,6 @@ package apoc.mongodb; import apoc.Extended; -import apoc.result.LongResult; import apoc.result.MapResult; import apoc.util.UrlResolver; import org.bson.types.ObjectId; @@ -11,7 +10,6 @@ import org.neo4j.procedure.Name; import org.neo4j.procedure.Procedure; -import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; @@ -51,106 +49,12 @@ public class MongoDB { @Context public Log log; - @Deprecated - @Procedure(deprecatedBy = "apoc.mongo.find") - @Description("apoc.mongodb.get(host-or-key,db,collection,query,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a find operation on mongodb collection") - public Stream get(@Name("host") String hostOrKey, - @Name("db") String db, - @Name("collection") String collection, - @Name("query") Map query, - @Name(value = "compatibleValues", defaultValue = "false") boolean compatibleValues, - @Name(value = "skip", defaultValue = "0") Long skip, - @Name(value = "limit", defaultValue = "0") Long limit, - @Name(value = "extractReferences", defaultValue = "false") boolean extractReferences, - @Name(value = "objectIdAsMap", defaultValue = "true") boolean objectIdAsMap) { - return executeMongoQuery(hostOrKey, db, collection, compatibleValues, - extractReferences, objectIdAsMap, coll -> coll.all(query, skip, limit).map(MapResult::new), - e -> log.error("apoc.mongodb.get - hostOrKey = [" + hostOrKey + "], db = [" + db + "], collection = [" + collection + "], query = [" + query + "], compatibleValues = [" + compatibleValues + "], skip = [" + skip + "], limit = [" + limit + "]", e)); - } - - @Deprecated - @Procedure(deprecatedBy = "apoc.mongo.count") - @Description("apoc.mongodb.count(host-or-key,db,collection,query) yield value - perform a find operation on mongodb collection") - public Stream count(@Name("host") String hostOrKey, @Name("db") String db, @Name("collection") String collection, @Name("query") Map query) { - return executeMongoQuery(hostOrKey, db, collection, false, - false, - false, coll -> { - long count = coll.count(query); - return Stream.of(new LongResult(count)); - }, - e -> log.error("apoc.mongodb.count - hostOrKey = [" + hostOrKey + "], db = [" + db + "], collection = [" + collection + "], query = [" + query + "]",e)); - } - private Coll getColl(@Name("host") String hostOrKey, @Name("db") String db, @Name("collection") String collection, boolean compatibleValues, boolean extractReferences, boolean objectIdAsMap) { String url = getMongoDBUrl(hostOrKey); return Coll.Factory.create(url, db, collection, compatibleValues, extractReferences, objectIdAsMap); } - @Deprecated - @Procedure(deprecatedBy = "apoc.mongo.find") - @Description("apoc.mongodb.first(host-or-key,db,collection,query,[compatibleValues=false|true],[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a first operation on mongodb collection") - public Stream first(@Name("host") String hostOrKey, @Name("db") String db, @Name("collection") String collection, @Name("query") Map query, @Name(value = "compatibleValues", defaultValue = "true") boolean compatibleValues, - @Name(value = "extractReferences", defaultValue = "false") boolean extractReferences, - @Name(value = "objectIdAsMap", defaultValue = "true") boolean objectIdAsMap) { - return executeMongoQuery(hostOrKey, db, collection, compatibleValues, - extractReferences, - objectIdAsMap, coll -> { - Map result = coll.first(query); - return result == null || result.isEmpty() ? Stream.empty() : Stream.of(new MapResult(result)); - }, - e -> log.error("apoc.mongodb.first - hostOrKey = [" + hostOrKey + "], db = [" + db + "], collection = [" + collection + "], query = [" + query + "], compatibleValues = [" + compatibleValues + "]",e)); - } - - @Deprecated - @Procedure(deprecatedBy = "apoc.mongo.find") - @Description("apoc.mongodb.find(host-or-key,db,collection,query,projection,sort,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a find,project,sort operation on mongodb collection") - public Stream find(@Name("host") String hostOrKey, - @Name("db") String db, - @Name("collection") String collection, - @Name("query") Map query, - @Name("project") Map project, - @Name("sort") Map sort, - @Name(value = "compatibleValues", defaultValue = "false") boolean compatibleValues, - @Name(value = "skip", defaultValue = "0") Long skip, - @Name(value = "limit", defaultValue = "0") Long limit, - @Name(value = "extractReferences", defaultValue = "false") boolean extractReferences, - @Name(value = "objectIdAsMap", defaultValue = "true") boolean objectIdAsMap) { - return executeMongoQuery(hostOrKey, db, collection, compatibleValues, - extractReferences, objectIdAsMap, coll -> coll.find(query, project, sort, skip, limit).map(MapResult::new), - e -> log.error("apoc.mongodb.find - hostOrKey = [" + hostOrKey + "], db = [" + db + "], collection = [" + collection + "], query = [" + query + "], project = [" + project + "], sort = [" + sort + "], compatibleValues = [" + compatibleValues + "], skip = [" + skip + "], limit = [" + limit + "]",e)); - } - - @Deprecated - @Procedure(deprecatedBy = "apoc.mongo.insert") - @Description("apoc.mongodb.insert(host-or-key,db,collection,documents) - inserts the given documents into the mongodb collection") - public void insert(@Name("host") String hostOrKey, @Name("db") String db, @Name("collection") String collection, @Name("documents") List> documents) { - try (Coll coll = getMongoColl(() -> getColl(hostOrKey, db, collection, false, false, false))) { - coll.insert(documents); - } catch (Exception e) { - log.error("apoc.mongodb.insert - hostOrKey = [" + hostOrKey + "], db = [" + db + "], collection = [" + collection + "], documents = [" + documents + "]",e); - throw new RuntimeException(e); - } - } - - @Deprecated - @Procedure(deprecatedBy = "apoc.mongo.delete") - @Description("apoc.mongodb.delete(host-or-key,db,collection,query) - delete the given documents from the mongodb collection and returns the number of affected documents") - public Stream delete(@Name("host") String hostOrKey, @Name("db") String db, @Name("collection") String collection, @Name("query") Map query) { - return executeMongoQuery(hostOrKey, db, collection, false, - false, false, coll -> Stream.of(new LongResult(coll.delete(query))), - e -> log.error("apoc.mongodb.delete - hostOrKey = [" + hostOrKey + "], db = [" + db + "], collection = [" + collection + "], query = [" + query + "]",e)); - } - - @Deprecated - @Procedure(deprecatedBy = "apoc.mongo.update") - @Description("apoc.mongodb.update(host-or-key,db,collection,query,update) - updates the given documents from the mongodb collection and returns the number of affected documents") - public Stream update(@Name("host") String hostOrKey, @Name("db") String db, @Name("collection") String collection, @Name("query") Map query, @Name("update") Map update) { - return executeMongoQuery(hostOrKey, db, collection, false, - false, false, coll -> Stream.of(new LongResult(coll.update(query, update))), - e -> log.error("apoc.mongodb.update - hostOrKey = [" + hostOrKey + "], db = [" + db + "], collection = [" + collection + "], query = [" + query + "], update = [" + update + "]",e)); - } - @Procedure("apoc.mongodb.get.byObjectId") @Description("apoc.mongodb.get.byObjectId(hostOrKey, db, collection, objectIdValue, config(default:{})) - get the document by Object id value") public Stream byObjectId(@Name("host") String hostOrKey, @Name("db") String db, @Name("collection") String collection, @Name("objectIdValue") String objectIdValue, @Name(value = "config", defaultValue = "{}") Map config) { diff --git a/full/src/main/java/apoc/periodic/PeriodicExtended.java b/full/src/main/java/apoc/periodic/PeriodicExtended.java deleted file mode 100644 index 3d8830b76d..0000000000 --- a/full/src/main/java/apoc/periodic/PeriodicExtended.java +++ /dev/null @@ -1,145 +0,0 @@ -package apoc.periodic; - -import apoc.Extended; -import apoc.Pools; -import apoc.util.Util; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.Result; -import org.neo4j.graphdb.Transaction; -import org.neo4j.logging.Log; -import org.neo4j.procedure.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicLong; -import java.util.function.BiConsumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@Extended -public class PeriodicExtended { - @Context public GraphDatabaseService db; - @Context public TerminationGuard terminationGuard; - @Context public Log log; - @Context public Pools pools; - @Context public Transaction tx; - - private void recordError(Map executionErrors, Exception e) { - String msg = ExceptionUtils.getRootCause(e).getMessage(); - // String msg = ExceptionUtils.getThrowableList(e).stream().map(Throwable::getMessage).collect(Collectors.joining(",")) - executionErrors.compute(msg, (s, i) -> i == null ? 1 : i + 1); - } - - private void validateQuery(String statement) { - db.executeTransactionally("EXPLAIN " + statement); - } - - /** - * as long as cypherLoop does not return 0, null, false, or the empty string as 'value' do: - * - * invoke cypherAction in batched transactions being feeded from cypherIteration running in main thread - * - * @param cypherLoop - * @param cypherIterate - * @param cypherAction - * @param batchSize - */ - @Procedure(mode = Mode.WRITE) - @Deprecated - @Description("apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows") - public Stream rock_n_roll_while( - @Name("cypherLoop") String cypherLoop, - @Name("cypherIterate") String cypherIterate, - @Name("cypherAction") String cypherAction, - @Name("batchSize") long batchSize) { - Map fieldStatement = Util.map( - "cypherLoop", cypherLoop, - "cypherIterate", cypherIterate); - validateQueries(fieldStatement); - Stream allResults = Stream.empty(); - - Map loopParams = new HashMap<>(1); - Object value = null; - - while (true) { - loopParams.put("previous", value); - - try (Result result = tx.execute(cypherLoop, loopParams)) { - value = result.next().get("loop"); - if (!Util.toBoolean(value)) return allResults; - } - - String periodicId = UUID.randomUUID().toString(); - log.info("Starting batched operation using iteration `%s` in separate thread with id: `%s`", cypherIterate, periodicId); - try (Result result = tx.execute(cypherIterate)) { - Stream oneResult = - PeriodicUtils.iterateAndExecuteBatchedInSeparateThread( - db, terminationGuard, log, pools, - (int) batchSize, false, false, 0, - result, (tx, params) -> tx.execute(cypherAction, params).getQueryStatistics(), 50, -1, periodicId); - final Object loopParam = value; - allResults = Stream.concat(allResults, oneResult.map(r -> r.inLoop(loopParam))); - } - } - } - - private void validateQueries(Map fieldStatement) { - String error = fieldStatement.entrySet() - .stream() - .map(e -> { - try { - validateQuery(e.getValue()); - return null; - } catch (Exception exception) { - return String.format("Exception for field `%s`, message: %s", e.getKey(), exception.getMessage()); - } - }) - .filter(e -> e != null) - .collect(Collectors.joining("\n")); - if (!error.isEmpty()) { - throw new RuntimeException(error); - } - } - - @Deprecated - @Procedure(mode = Mode.WRITE) - @Description("apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows") - public Stream rock_n_roll( - @Name("cypherIterate") String cypherIterate, - @Name("cypherAction") String cypherAction, - @Name("batchSize") long batchSize) { - Map fieldStatement = Util.map( - "cypherIterate", cypherIterate, - "cypherAction", cypherAction); - validateQueries(fieldStatement); - - String periodicId = UUID.randomUUID().toString(); - log.info("Starting batched operation using iteration `%s` in separate thread with id: `%s`", cypherIterate, periodicId); - try (Result result = tx.execute(cypherIterate)) { - return PeriodicUtils.iterateAndExecuteBatchedInSeparateThread( - db, terminationGuard, log, pools, - (int)batchSize, false, false, 0, result, - (tx, p) -> tx.execute(cypherAction, p).getQueryStatistics(), 50, -1, periodicId); - } - } - - private long executeAndReportErrors(Transaction tx, BiConsumer> consumer, Map params, - List> batch, int returnValue, AtomicLong localCount, BatchAndTotalCollector collector) { - try { - consumer.accept(tx, params); - if (localCount!=null) { - localCount.getAndIncrement(); - } - return returnValue; - } catch (Exception e) { - collector.incrementFailedOps(batch.size()); - collector.amendFailedParamsMap(batch); - recordError(collector.getOperationErrors(), e); - throw e; - } - } - -} diff --git a/full/src/test/java/apoc/cache/StaticTest.java b/full/src/test/java/apoc/cache/StaticTest.java index 169b97b8e8..82f1d30902 100644 --- a/full/src/test/java/apoc/cache/StaticTest.java +++ b/full/src/test/java/apoc/cache/StaticTest.java @@ -69,22 +69,19 @@ public void testListFromConfig() throws Exception { @Test public void testOverrideConfig() throws Exception { - TestUtil.testCall(db, "call apoc.static.get('test')", r -> assertEquals(VALUE,r.get("value"))); TestUtil.testCall(db, "return apoc.static.get('test') as value", r -> assertEquals(VALUE,r.get("value"))); TestUtil.testCall(db, "call apoc.static.set('test',42)", r -> assertEquals(VALUE,r.get("value"))); - TestUtil.testCall(db, "call apoc.static.get('test')", r -> assertEquals(42L,r.get("value"))); TestUtil.testCall(db, "return apoc.static.get('test') as value", r -> assertEquals(42L,r.get("value"))); TestUtil.testCall(db, "call apoc.static.set('test',null)", r -> assertEquals(42L,r.get("value"))); - TestUtil.testCall(db, "call apoc.static.get('test')", r -> assertEquals(VALUE,r.get("value"))); TestUtil.testCall(db, "return apoc.static.get('test') as value", r -> assertEquals(VALUE,r.get("value"))); } @Test public void testSet() throws Exception { - TestUtil.testCall(db, "call apoc.static.get('test2')", r -> assertNull(r.get("value"))); + TestUtil.testCall(db, "return apoc.static.get('test2') as value", r -> assertNull(r.get("value"))); TestUtil.testCall(db, "call apoc.static.set('test2',42)", r -> assertNull(r.get("value"))); - TestUtil.testCall(db, "call apoc.static.get('test2')", r -> assertEquals(42L,r.get("value"))); + TestUtil.testCall(db, "return apoc.static.get('test2') as value", r -> assertEquals(42L,r.get("value"))); TestUtil.testCall(db, "call apoc.static.set('test2',null)", r -> assertEquals(42L,r.get("value"))); - TestUtil.testCall(db, "call apoc.static.get('test2')", r -> assertNull(r.get("value"))); + TestUtil.testCall(db, "return apoc.static.get('test2') as value", r -> assertNull(r.get("value"))); } } diff --git a/full/src/test/java/apoc/custom/CypherProceduresClusterTest.java b/full/src/test/java/apoc/custom/CypherProceduresClusterTest.java index 97b3987799..32940404e0 100644 --- a/full/src/test/java/apoc/custom/CypherProceduresClusterTest.java +++ b/full/src/test/java/apoc/custom/CypherProceduresClusterTest.java @@ -41,7 +41,7 @@ public void shouldRecreateCustomFunctionsOnOtherClusterMembers() throws Interrup // given try(Session session = cluster.getDriver().session()) { - session.writeTransaction(tx -> tx.run("call apoc.custom.asFunction('answer1', 'RETURN 42 as answer')")); // we create a function + session.writeTransaction(tx -> tx.run("call apoc.custom.declareFunction('answer1() :: (output::LONG)', 'RETURN 42 as answer')")); // we create a function } // whencypher procedures @@ -61,11 +61,11 @@ public void shouldRecreateCustomFunctionsOnOtherClusterMembers() throws Interrup @Test public void shouldUpdateCustomFunctionsOnOtherClusterMembers() throws InterruptedException { // given - cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.asFunction('answer2', 'RETURN 42 as answer')")); // we create a function + cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.declareFunction('answer2() :: (output::LONG)', 'RETURN 42 as answer')")); // we create a function TestContainerUtil.testCall(cluster.getSession(), "return custom.answer2() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); // when - cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.asFunction('answer2', 'RETURN 52 as answer')")); // we update the function + cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.declareFunction('answer2() :: (output::LONG)', 'RETURN 52 as answer')")); // we update the function Thread.sleep(1000); // then @@ -76,7 +76,7 @@ public void shouldUpdateCustomFunctionsOnOtherClusterMembers() throws Interrupte @Test public void shouldRegisterSimpleStatementOnOtherClusterMembers() throws InterruptedException { // given - cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.asProcedure('answerProcedure1', 'RETURN 33 as answer', 'read', [['answer','long']])")); // we create a procedure + cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.declareProcedure('answerProcedure1() :: LONG', 'RETURN 33 as answer', 'read'")); // we create a procedure // when TestContainerUtil.testCall(cluster.getSession(), "call custom.answerProcedure1()", (row) -> Assert.assertEquals(33L, row.get("answer"))); @@ -88,11 +88,11 @@ public void shouldRegisterSimpleStatementOnOtherClusterMembers() throws Interrup @Test public void shouldUpdateSimpleStatementOnOtherClusterMembers() throws InterruptedException { // given - cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.asProcedure('answerProcedure2', 'RETURN 33 as answer', 'read', [['answer','long']])")); // we create a procedure + cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.declareProcedure('answerProcedure2() :: LONG', 'RETURN 33 as answer')")); // we create a procedure TestContainerUtil.testCall(cluster.getSession(), "call custom.answerProcedure2()", (row) -> Assert.assertEquals(33L, row.get("answer"))); // when - cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.asProcedure('answerProcedure2', 'RETURN 55 as answer', 'read', [['answer','long']])")); // we create a procedure + cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.declareProcedure('answerProcedure2() :: LONG', 'RETURN 55 as answer')")); // we create a procedure Thread.sleep(1000); // then @@ -102,7 +102,7 @@ public void shouldUpdateSimpleStatementOnOtherClusterMembers() throws Interrupte @Test(expected = DatabaseException.class) public void shouldRemoveProcedureOnOtherClusterMembers() throws InterruptedException { // given - cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.asProcedure('answerToRemove', 'RETURN 33 as answer', 'read', [['answer','long']])")); // we create a procedure + cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.declareProcedure('answerToRemove() :: LONG', 'RETURN 33 as answer')")); // we create a procedure Thread.sleep(1000); try { TestContainerUtil.testCallInReadTransaction(cluster.getSession(), "call custom.answerToRemove()", (row) -> Assert.assertEquals(33L, row.get("answer"))); @@ -128,7 +128,7 @@ public void shouldRemoveProcedureOnOtherClusterMembers() throws InterruptedExcep @Test(expected = DatabaseException.class) public void shouldRemoveFunctionOnOtherClusterMembers() throws InterruptedException { // given - cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.asFunction('answerFunctionToRemove', 'RETURN 42 as answer')")); // we create a function + cluster.getSession().writeTransaction(tx -> tx.run("call apoc.custom.declareFunction('answerFunctionToRemove()', 'RETURN 42 as answer')")); // we create a function Thread.sleep(1000); try { TestContainerUtil.testCallInReadTransaction(cluster.getSession(), "return custom.answerFunctionToRemove() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); diff --git a/full/src/test/java/apoc/custom/CypherProceduresStorageTest.java b/full/src/test/java/apoc/custom/CypherProceduresStorageTest.java index 0231390993..689f623fff 100644 --- a/full/src/test/java/apoc/custom/CypherProceduresStorageTest.java +++ b/full/src/test/java/apoc/custom/CypherProceduresStorageTest.java @@ -63,9 +63,9 @@ private void restartDb() { @Test public void registerSimpleStatement() { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42 as answer')"); + db.executeTransactionally("CALL apoc.custom.declareProcedure('answer() :: (answer::LONG)','RETURN 42 as answer')"); restartDb(); - TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, row.get("answer"))); TestUtil.testCall(db, "call apoc.custom.list()", row -> { assertEquals("answer", row.get("name")); assertEquals("procedure", row.get("type")); @@ -74,14 +74,14 @@ public void registerSimpleStatement() { @Test public void registerSimpleFunctionWithDotInName() { - db.executeTransactionally("call apoc.custom.asFunction('foo.bar.baz','RETURN 42 as answer')"); - TestUtil.testCall(db, "return custom.foo.bar.baz() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('foo.bar.baz() :: LONG','RETURN 42 as answer')"); + TestUtil.testCall(db, "return custom.foo.bar.baz() as answer", (row) -> assertEquals(42L, row.get("answer"))); TestUtil.testCall(db, "call apoc.custom.list()", row -> { assertEquals("foo.bar.baz", row.get("name")); assertEquals("function", row.get("type")); }); restartDb(); - TestUtil.testCall(db, "return custom.foo.bar.baz() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + TestUtil.testCall(db, "return custom.foo.bar.baz() as answer", (row) -> assertEquals(42L, row.get("answer"))); TestUtil.testCall(db, "call apoc.custom.list()", row -> { assertEquals("foo.bar.baz", row.get("name")); assertEquals("function", row.get("type")); @@ -90,14 +90,14 @@ public void registerSimpleFunctionWithDotInName() { @Test public void registerSimpleProcedureWithDotInName() { - db.executeTransactionally("call apoc.custom.asProcedure('foo.bar.baz','RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.foo.bar.baz()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareProcedure('foo.bar.baz() :: (answer::LONG)','RETURN 42 as answer')"); + TestUtil.testCall(db, "call custom.foo.bar.baz()", (row) -> assertEquals(42L, row.get("answer"))); TestUtil.testCall(db, "call apoc.custom.list()", row -> { assertEquals("foo.bar.baz", row.get("name")); assertEquals("procedure", row.get("type")); }); restartDb(); - TestUtil.testCall(db, "call custom.foo.bar.baz()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + TestUtil.testCall(db, "call custom.foo.bar.baz()", (row) -> assertEquals(42L, row.get("answer"))); TestUtil.testCall(db, "call apoc.custom.list()", row -> { assertEquals("foo.bar.baz", row.get("name")); assertEquals("procedure", row.get("type")); @@ -106,46 +106,47 @@ public void registerSimpleProcedureWithDotInName() { @Test public void registerSimpleStatementConcreteResults() { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42 as answer','read',[['answer','long']])"); + db.executeTransactionally("CALL apoc.custom.declareProcedure('answer() :: (answer::LONG)','RETURN 42 as answer')"); restartDb(); TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void registerParameterStatement() { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN $answer as answer')"); + db.executeTransactionally("CALL apoc.custom.declareProcedure('answer(answer::LONG) :: (answer::LONG)','RETURN $answer as answer')"); restartDb(); - TestUtil.testCall(db, "call custom.answer({answer:42})", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + TestUtil.testCall(db, "call custom.answer(42)", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void registerConcreteParameterStatement() { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN $input as answer','read',null,[['input','number']])"); + db.executeTransactionally("CALL apoc.custom.declareProcedure('answer(answer::LONG) :: (answer::LONG)','RETURN $answer as answer')"); restartDb(); - TestUtil.testCall(db, "call custom.answer(42)", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + TestUtil.testCall(db, "call custom.answer(42)", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void registerConcreteParameterAndReturnStatement() { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN $input as answer','read',[['answer','number']],[['input','int','42']])"); + db.executeTransactionally("CALL apoc.custom.declareProcedure('answer(input = 42 ::LONG) :: (answer::LONG)','RETURN $input as answer')"); restartDb(); TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void testAllParameterTypes() { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN [$int,$float,$string,$map,$`list int`,$bool,$date,$datetime,$point] as data','read',null," + - "[['int','int'],['float','float'],['string','string'],['map','map'],['list int','list int'],['bool','bool'],['date','date'],['datetime','datetime'],['point','point']])"); + db.executeTransactionally("CALL apoc.custom.declareProcedure('answer(int::INTEGER, float::FLOAT,string::STRING,map::MAP,listInt::LIST OF INTEGER,bool::BOOLEAN,date::DATE,datetime::DATETIME,point::POINT) :: (data::LIST OF ANY)','RETURN [$int,$float,$string,$map,$listInt,$bool,$date,$datetime,$point] as data')"); + restartDb(); - TestUtil.testCall(db, "call custom.answer(42,3.14,'foo',{a:1},[1],true,date(),datetime(),point({x:1,y:2}))", (row) -> assertEquals(9, ((List)((Map)row.get("row")).get("data")).size())); + TestUtil.testCall(db, "call custom.answer(42,3.14,'foo',{a:1},[1],true,date(),datetime(),point({x:1,y:2}))", + (row) -> assertEquals(9, ((List) row.get("data")).size())); } @Test public void registerSimpleStatementFunction() { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42 as answer')"); - TestUtil.testCall(db, "return custom.answer() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer() :: LONG','RETURN 42 as answer')"); + TestUtil.testCall(db, "return custom.answer() as answer", (row) -> assertEquals(42L, row.get("answer"))); restartDb(); - TestUtil.testCall(db, "return custom.answer() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + TestUtil.testCall(db, "return custom.answer() as answer", (row) -> assertEquals(42L, row.get("answer"))); TestUtil.testCall(db, "call apoc.custom.list()", row -> { assertEquals("answer", row.get("name")); assertEquals("function", row.get("type")); @@ -154,14 +155,14 @@ public void registerSimpleStatementFunction() { @Test public void registerSimpleStatementFunctionWithDotInName() { - db.executeTransactionally("call apoc.custom.asFunction('foo.bar.baz','RETURN 42 as answer')"); - TestUtil.testCall(db, "return custom.foo.bar.baz() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('foo.bar.baz() :: LONG','RETURN 42 as answer')"); + TestUtil.testCall(db, "return custom.foo.bar.baz() as answer", (row) -> assertEquals(42L, row.get("answer"))); TestUtil.testCall(db, "call apoc.custom.list()", row -> { assertEquals("foo.bar.baz", row.get("name")); assertEquals("function", row.get("type")); }); restartDb(); - TestUtil.testCall(db, "return custom.foo.bar.baz() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + TestUtil.testCall(db, "return custom.foo.bar.baz() as answer", (row) -> assertEquals(42L, row.get("answer"))); TestUtil.testCall(db, "call apoc.custom.list()", row -> { assertEquals("foo.bar.baz", row.get("name")); assertEquals("function", row.get("type")); @@ -170,65 +171,63 @@ public void registerSimpleStatementFunctionWithDotInName() { @Test public void registerSimpleStatementConcreteResultsFunction() { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42 as answer','long')"); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer() :: LONG','RETURN 42 as answer')"); restartDb(); TestUtil.testCall(db, "return custom.answer() as answer", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void registerSimpleStatementConcreteResultsFunctionUnnamedResultColumn() { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42','long')"); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer() :: LONG','RETURN 42 as answer')"); restartDb(); TestUtil.testCall(db, "return custom.answer() as answer", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void registerParameterStatementFunction() { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN $answer as answer','long')"); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer(answer::LONG) :: LONG','RETURN $answer as answer')"); restartDb(); - TestUtil.testCall(db, "return custom.answer({answer:42}) as answer", (row) -> assertEquals(42L, row.get("answer"))); + TestUtil.testCall(db, "return custom.answer(42) as answer", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void registerConcreteParameterAndReturnStatementFunction() { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN $input as answer','long',[['input','number']])"); - restartDb(); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer(input::LONG) :: LONG','RETURN $input as answer')"); TestUtil.testCall(db, "return custom.answer(42) as answer", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void testAllParameterTypesFunction() { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN [$int,$float,$string,$map,$`list int`,$bool,$date,$datetime,$point] as data','list of any'," + - "[['int','int'],['float','float'],['string','string'],['map','map'],['list int','list int'],['bool','bool'],['date','date'],['datetime','datetime'],['point','point']], true)"); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer(int::INTEGER, float::FLOAT,string::STRING,map::MAP,listInt::LIST OF INTEGER,bool::BOOLEAN,date::DATE,datetime::DATETIME,point::POINT) :: LIST OF ANY','RETURN [$int,$float,$string,$map,$listInt,$bool,$date,$datetime,$point] as data')"); restartDb(); - TestUtil.testCall(db, "return custom.answer(42,3.14,'foo',{a:1},[1],true,date(),datetime(),point({x:1,y:2})) as data", (row) -> assertEquals(9, ((List)row.get("data")).size())); + TestUtil.testCall(db, "return custom.answer(42,3.14,'foo',{a:1},[1],true,date(),datetime(),point({x:1,y:2})) as data", + (row) -> { + System.out.println(row); + assertEquals(9, ((List) row.get("data")).get(0).size()); + }); } @Test public void testIssue1744() throws Exception { db.executeTransactionally("CREATE (:Area {name: 'foo'})-[:CURRENT]->(:VantagePoint {alpha: 'beta'})"); - db.executeTransactionally("CALL apoc.custom.asProcedure('vantagepoint_within_area',\n" + + db.executeTransactionally("CALL apoc.custom.declareProcedure('vantagepoint_within_area(areaName::STRING) :: (resource::NODE)',\n" + " \"MATCH (start:Area {name: $areaName} )\n" + " CALL apoc.path.expand(start,'CONTAINS>|| row) { @Test public void testIssue1714WithRestartDb() throws Exception { db.executeTransactionally("CREATE (i:Target {value: 2});"); - db.executeTransactionally("CALL apoc.custom.asFunction('n', 'MATCH (t:Target {value : $val}) RETURN t', 'NODE', [['val', 'INTEGER']])"); + db.executeTransactionally("CALL apoc.custom.declareFunction('nn(val::INTEGER) :: NODE', 'MATCH (t:Target {value : $val}) RETURN t')"); restartDb(); - TestUtil.testCall(db, "RETURN custom.n(2) as row", (row) -> assertEquals(2L, ((Node) row.get("row")).getProperty("value"))); + TestUtil.testCall(db, "RETURN custom.nn(2) as row", (row) -> assertEquals(2L, ((Node) row.get("row")).getProperty("value"))); } } diff --git a/full/src/test/java/apoc/custom/CypherProceduresTest.java b/full/src/test/java/apoc/custom/CypherProceduresTest.java index ab11a3c1e3..e3996926d7 100644 --- a/full/src/test/java/apoc/custom/CypherProceduresTest.java +++ b/full/src/test/java/apoc/custom/CypherProceduresTest.java @@ -62,62 +62,14 @@ public void tearDown() { @Test public void registerSimpleStatement() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); db.executeTransactionally("CALL apoc.custom.declareProcedure('answer2() :: (answer::INT)','RETURN 42 as answer')"); TestUtil.testCall(db, "call custom.answer2()", (row) -> assertEquals(42L, row.get("answer"))); } @Test public void registerSimpleStatementWithOneChar() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('a','RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.a()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); TestUtil.testFail(db, "CALL apoc.custom.declareProcedure('b() :: (answer::INT)','RETURN 42 as answer')", QueryExecutionException.class); } - - @Test - public void overrideSingleCallStatement() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.answer() yield row return row", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); - db.executeTransactionally("call db.clearQueryCaches()"); - - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 43 as answer')"); - TestUtil.testCall(db, "call custom.answer() yield row return row", (row) -> assertEquals(43L, ((Map)row.get("row")).get("answer"))); - } - - @Test - public void overrideCypherCallStatement() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42 as answer')"); - TestUtil.testCall(db, "with 1 as foo call custom.answer() yield row return row", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); - db.executeTransactionally("call db.clearQueryCaches()"); - - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 43 as answer')"); - TestUtil.testCall(db, "with 1 as foo call custom.answer() yield row return row", (row) -> assertEquals(43L, ((Map)row.get("row")).get("answer"))); - } - - @Test - public void registerSimpleStatementConcreteResults() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42 as answer','read',[['answer','long']])"); - TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, row.get("answer"))); - } - - @Test - public void registerParameterStatement() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN $answer as answer')"); - TestUtil.testCall(db, "call custom.answer({answer:42})", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); - } - - @Test - public void registerConcreteParameterStatement() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN $input as answer','read',null,[['input','number']])"); - TestUtil.testCall(db, "call custom.answer(42)", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); - } - - @Test - public void registerConcreteParameterAndReturnStatement() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN $input as answer','read',[['answer','number']],[['input','int','42']])"); - TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, row.get("answer"))); - } @Test public void testValidationProceduresIssue2654() { @@ -164,13 +116,6 @@ public void testValidationFunctionsIssue2654() { (r) -> assertEquals("P5M1DT12H, 1577836799999, point({x: 1.0, y: 1.0, crs: 'cartesian'})", r.get("result"))); } - @Test - public void testAllParameterTypes() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN [$int,$float,$string,$map,$`list int`,$bool,$date,$datetime,$point] as data','read',null," + - "[['int','int'],['float','float'],['string','string'],['map','map'],['list int','list int'],['bool','bool'],['date','date'],['datetime','datetime'],['point','point']])"); - TestUtil.testCall(db, "call custom.answer(42,3.14,'foo',{a:1},[1],true,date(),datetime(),point({x:1,y:2}))", (row) -> assertEquals(9, ((List)((Map)row.get("row")).get("data")).size())); - } - @Test public void testDeclareFunctionReturnTypes() { // given @@ -208,142 +153,24 @@ public void testDeclareFunctionReturnTypes() { }); } - @Test - public void testRegisterFunctionReturnTypes() { - // given - db.executeTransactionally("UNWIND range(1, 4) as val CREATE (i:Target {value: val});"); - - // when - db.executeTransactionally("CALL apoc.custom.asFunction('ret_node', 'MATCH (t:Target {value : $val}) RETURN t', 'NODE', [['val', 'INTEGER']])"); - db.executeTransactionally("CALL apoc.custom.asFunction('ret_node_list', 'MATCH (t:Target {value : $val}) RETURN t', 'LIST OF NODE', [['val', 'INTEGER']])"); - db.executeTransactionally("CALL apoc.custom.asFunction('ret_map', 'MATCH (t:Target {value : $val}) RETURN t', 'MAP', [['val', 'INTEGER']])"); - db.executeTransactionally("CALL apoc.custom.asFunction('ret_map_list', 'MATCH (t:Target {value : $val}) RETURN t', 'LIST OF MAP', [['val', 'INTEGER']])"); - // then - TestUtil.testResult(db, "RETURN custom.ret_node(1) AS val", (result) -> { - Node node = result.columnAs("val").next(); - assertTrue(node.hasLabel(Label.label("Target"))); - assertEquals(1L, node.getProperty("value")); - }); - TestUtil.testResult(db, "RETURN custom.ret_node_list(2) AS val", (result) -> { - List nodes = result.>columnAs("val").next(); - assertEquals(1, nodes.size()); - Node t = nodes.get(0); - assertTrue(t.hasLabel(Label.label("Target"))); - assertEquals(2L, t.getProperty("value")); - }); - TestUtil.testResult(db, "RETURN custom.ret_map(3) AS val", (result) -> { - Map map = result.>columnAs("val").next(); - assertEquals(1, map.size()); - Node t = map.get("t"); - assertTrue(t.hasLabel(Label.label("Target"))); - assertEquals(3L, t.getProperty("value")); - }); - TestUtil.testResult(db, "RETURN custom.ret_map_list(4) AS val", (result) -> { - List> nodes = result.>>columnAs("val").next(); - assertEquals(1, nodes.size()); - Node t = nodes.get(0).get("t"); - assertTrue(t.hasLabel(Label.label("Target"))); - assertEquals(4L, t.getProperty("value")); - }); - } - - @Test - public void testStatementReturningNode() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','create path=(node)-[relationship:FOO]->() return node, relationship, path','write', [['node','Node'], ['relationship','RELATIONSHIP'], ['path','PATH']], [])"); - TestUtil.testCall(db, "call custom.answer()", (row) -> {}); - } - - @Test - public void testWrongMode() { - assertProcedureFails("The query execution type is READ_WRITE, but you provided mode READ.\n" + - "Supported modes are [READ, WRITE, WRITE]", - "call apoc.custom.asProcedure('answer','create path=(node)-[relationship:FOO]->() return node, relationship, path','read', [['node','Node'], ['relationship','RELATIONSHIP'], ['path','PATH']], [])"); - } - @Test public void registerSimpleStatementFunction() throws Exception { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42 as answer')"); - TestUtil.testCall(db, "return custom.answer() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); db.executeTransactionally("CALL apoc.custom.declareFunction('answer2() :: STRING','RETURN 42 as answer')"); TestUtil.testCall(db, "return custom.answer2() as row", (row) -> assertEquals(42L, row.get("row"))); } @Test public void registerSimpleStatementFunctionWithOneChar() throws Exception { - db.executeTransactionally("call apoc.custom.asFunction('a','RETURN 42 as answer')"); - TestUtil.testCall(db, "return custom.a() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); final String procedureSignature = "b() :: STRING"; assertProcedureFails(String.format(SIGNATURE_SYNTAX_ERROR, procedureSignature), "CALL apoc.custom.declareFunction('" + procedureSignature + "','RETURN 42 as answer')"); } - @Test - public void registerSimpleStatementConcreteResultsFunction() throws Exception { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42 as answer','long')"); - TestUtil.testCall(db, "return custom.answer() as answer", (row) -> assertEquals(42L, row.get("answer"))); - } - - @Test - public void registerSimpleStatementConcreteResultsFunctionUnnamedResultColumn() throws Exception { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42','long')"); - TestUtil.testCall(db, "return custom.answer() as answer", (row) -> assertEquals(42L, row.get("answer"))); - } - - @Test - public void registerParameterStatementFunction() throws Exception { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN $answer as answer','long')"); - TestUtil.testCall(db, "return custom.answer({answer:42}) as answer", (row) -> assertEquals(42L, row.get("answer"))); - } - - @Test - public void registerConcreteParameterAndReturnStatementFunction() throws Exception { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN $input.a as answer','long',[['input','map']])"); - TestUtil.testCall(db, "return custom.answer({a: 42}) as answer", (row) -> assertEquals(42L, row.get("answer"))); - } - - @Test - public void testAllParameterTypesFunction() throws Exception { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN [$int,$float,$string,$map,$`list int`,$bool,$date,$datetime,$point] as data','list of any'," + - "[['int','int'],['float','float'],['string','string'],['map','map'],['list int','list int'],['bool','bool'],['date','date'],['datetime','datetime'],['point','point']], true)"); - TestUtil.testCall(db, "return custom.answer(42,3.14,'foo',{a:1},[1],true,date(),datetime(),point({x:1,y:2})) as data", (row) -> assertEquals(9, ((List)row.get("data")).size())); - } - - @Test - public void shouldRegisterSimpleStatementWithDescription() throws Exception { - // given - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42 as answer', 'read', null, null, 'Answer to the Ultimate Question of Life, the Universe, and Everything')"); - - // when - TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); - - // then - TestUtil.testCall(db, "call apoc.custom.list()", row -> { - assertEquals("Answer to the Ultimate Question of Life, the Universe, and Everything", row.get("description")); - assertEquals("procedure", row.get("type")); - }); - } - - @Test - public void shouldRegisterSimpleStatementFunctionDescription() throws Exception { - // given - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42 as answer', '', null, false, 'Answer to the Ultimate Question of Life, the Universe, and Everything')"); - - // when - TestUtil.testCall(db, "return custom.answer() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); - - // then - TestUtil.testCall(db, "call apoc.custom.list()", row -> { - assertEquals("Answer to the Ultimate Question of Life, the Universe, and Everything", row.get("description")); - assertEquals("function", row.get("type")); - }); - } - @Test public void shouldListAllProceduresAndFunctions() throws Exception { // given - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN $input as answer','read',[['answer','number']],[['input','int','42']], 'Procedure that answer to the Ultimate Question of Life, the Universe, and Everything')"); - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN $input as answer','long', [['input','number']], false)"); - // System.out.println(db.execute("call apoc.custom.list").resultAsString()); + db.executeTransactionally("CALL apoc.custom.declareProcedure('answer(input = 42 ::INT) :: (answer::NUMBER)','RETURN $input as answer', 'READ', 'Procedure that answer to the Ultimate Question of Life, the Universe, and Everything')"); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer(input::NUMBER) :: INT','RETURN $input as answer')"); // when TestUtil.testResult(db, "call apoc.custom.list", (row) -> { @@ -392,8 +219,8 @@ public void shouldRemoveTheCustomProcedure() throws Exception { thrown.expect(new StatusCodeMatcher("Neo.ClientError.Statement.SyntaxError")); // given - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareProcedure('answer() :: (answer::LONG)','RETURN 42 as answer')"); + TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, row.get("answer"))); // when db.executeTransactionally("call apoc.custom.removeProcedure('answer')"); @@ -406,129 +233,129 @@ public void shouldRemoveTheCustomProcedure() throws Exception { @Test public void shouldOverrideAndRemoveTheCustomFunctionWithDotInName() throws Exception { thrown.expect(QueryExecutionException.class); - thrown.expectMessage("Unknown function 'custom.a.b.c'"); + thrown.expectMessage("Unknown function 'custom.aa.bb.cc'"); thrown.expect(new StatusCodeMatcher("Neo.ClientError.Statement.SyntaxError")); // given - db.executeTransactionally("CALL apoc.custom.asFunction('a.b.c','RETURN 42 as answer')"); - TestUtil.testCall(db, "return custom.a.b.c() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('aa.bb.cc() :: LONG','RETURN 42 as answer')"); + TestUtil.testCall(db, "return custom.aa.bb.cc() as answer", (row) -> assertEquals(42L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); - db.executeTransactionally("CALL apoc.custom.asFunction('a.b.c','RETURN 43 as answer')"); - TestUtil.testCall(db, "return custom.a.b.c() as row", (row) -> assertEquals(43L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('aa.bb.cc() :: LONG','RETURN 43 as answer')"); + TestUtil.testCall(db, "return custom.aa.bb.cc() as answer", (row) -> assertEquals(43L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); // when - db.executeTransactionally("call apoc.custom.removeFunction('a.b.c')"); + db.executeTransactionally("call apoc.custom.removeFunction('aa.bb.cc')"); db.executeTransactionally("call db.clearQueryCaches()"); // then - TestUtil.count(db, "RETURN custom.a.b.c()"); + TestUtil.count(db, "RETURN custom.aa.bb.cc()"); } @Test public void shouldOverrideAndRemoveTheCustomProcedureWithDotInName() throws Exception { thrown.expect(QueryExecutionException.class); - thrown.expectMessage("There is no procedure with the name `custom.a.b.c` registered for this database instance. " + + thrown.expectMessage("There is no procedure with the name `custom.aa.bb.cc` registered for this database instance. " + "Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed."); thrown.expect(new StatusCodeMatcher("Neo.ClientError.Statement.SyntaxError")); // given - db.executeTransactionally("call apoc.custom.asProcedure('a.b.c','RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.a.b.c()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareProcedure('aa.bb.cc() :: (answer::LONG)','RETURN 42 as answer')"); + TestUtil.testCall(db, "call custom.aa.bb.cc()", (row) -> assertEquals(42L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); - db.executeTransactionally("call apoc.custom.asProcedure('a.b.c','RETURN 43 as answer')"); - TestUtil.testCall(db, "call custom.a.b.c()", (row) -> assertEquals(43L, ((Map)row.get("row")).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareProcedure('aa.bb.cc() :: (answer::LONG)','RETURN 43 as answer')"); + TestUtil.testCall(db, "call custom.aa.bb.cc()", (row) -> assertEquals(43L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); // when - db.executeTransactionally("call apoc.custom.removeProcedure('a.b.c')"); + db.executeTransactionally("call apoc.custom.removeProcedure('aa.bb.cc')"); db.executeTransactionally("call db.clearQueryCaches()"); // then - TestUtil.count(db, "call custom.a.b.c()"); + TestUtil.count(db, "call custom.aa.bb.cc()"); } @Test public void shouldRemoveTheCustomFunctionWithDotInName() throws Exception { thrown.expect(QueryExecutionException.class); - thrown.expectMessage("Unknown function 'custom.a.b.c'"); + thrown.expectMessage("Unknown function 'custom.aa.bb.cc'"); thrown.expect(new StatusCodeMatcher("Neo.ClientError.Statement.SyntaxError")); // given - db.executeTransactionally("CALL apoc.custom.asFunction('a.b.c','RETURN 42 as answer')"); - TestUtil.testCall(db, "return custom.a.b.c() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('aa.bb.cc() :: LONG','RETURN 42 as answer')"); + TestUtil.testCall(db, "return custom.aa.bb.cc() as answer", (row) -> assertEquals(42L, row.get("answer"))); // when - db.executeTransactionally("call apoc.custom.removeFunction('a.b.c')"); + db.executeTransactionally("call apoc.custom.removeFunction('aa.bb.cc')"); db.executeTransactionally("call db.clearQueryCaches()"); // then - TestUtil.count(db, "RETURN custom.a.b.c()"); + TestUtil.count(db, "RETURN custom.aa.bb.cc()"); } @Test public void shouldRemoveTheCustomProcedureWithDotInName() throws Exception { thrown.expect(QueryExecutionException.class); - thrown.expectMessage("There is no procedure with the name `custom.a.b.c` registered for this database instance. " + + thrown.expectMessage("There is no procedure with the name `custom.aa.bb.cc` registered for this database instance. " + "Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed."); thrown.expect(new StatusCodeMatcher("Neo.ClientError.Statement.SyntaxError")); // given - db.executeTransactionally("call apoc.custom.asProcedure('a.b.c','RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.a.b.c()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareProcedure('aa.bb.cc() :: (answer::LONG)','RETURN 42 as answer')"); + TestUtil.testCall(db, "call custom.aa.bb.cc()", (row) -> assertEquals(42L, row.get("answer"))); // when - db.executeTransactionally("call apoc.custom.removeProcedure('a.b.c')"); + db.executeTransactionally("call apoc.custom.removeProcedure('aa.bb.cc')"); db.executeTransactionally("call db.clearQueryCaches()"); // then - TestUtil.count(db, "call custom.a.b.c()"); + TestUtil.count(db, "call custom.aa.bb.cc()"); } @Test public void shouldOverrideCustomFunctionWithDotInNameOnlyIfWithSameNamespaceAndFinalName() throws Exception { // given - db.executeTransactionally("call apoc.custom.asFunction('a.b.name','RETURN 42 as answer')"); - TestUtil.testCall(db, "return custom.a.b.name() as row", (row) -> assertEquals(42L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('aa.bb.name() :: LONG','RETURN 42 as answer')"); + TestUtil.testCall(db, "return custom.aa.bb.name() as answer", (row) -> assertEquals(42L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); - db.executeTransactionally("call apoc.custom.asFunction('a.b.name','RETURN 34 as answer')"); - TestUtil.testCall(db, "return custom.a.b.name() as row", (row) -> assertEquals(34L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('aa.bb.name() :: LONG','RETURN 34 as answer')"); + TestUtil.testCall(db, "return custom.aa.bb.name() as answer", (row) -> assertEquals(34L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); - db.executeTransactionally("call apoc.custom.asFunction('x.z.name','RETURN 12 as answer')"); - TestUtil.testCall(db, "return custom.x.z.name() as row", (row) -> assertEquals(12L, ((Map)((List)row.get("row")).get(0)).get("answer"))); - TestUtil.testCall(db, "return custom.a.b.name() as row", (row) -> assertEquals(34L, ((Map)((List)row.get("row")).get(0)).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareFunction('xx.zz.name() :: LONG','RETURN 12 as answer')"); + TestUtil.testCall(db, "return custom.xx.zz.name() as answer", (row) -> assertEquals(12L, row.get("answer"))); + TestUtil.testCall(db, "return custom.aa.bb.name() as answer", (row) -> assertEquals(34L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); TestUtil.testResult(db, "call apoc.custom.list", (row) -> { assertTrue(row.hasNext()); Map mapFirst = row.next(); - assertEquals("a.b.name", mapFirst.get("name")); + assertEquals("aa.bb.name", mapFirst.get("name")); assertEquals("RETURN 34 as answer", mapFirst.get("statement")); assertEquals(FUNCTION, mapFirst.get("type")); assertTrue(row.hasNext()); Map mapSecond = row.next(); - assertEquals("x.z.name", mapSecond.get("name")); + assertEquals("xx.zz.name", mapSecond.get("name")); assertEquals("RETURN 12 as answer", mapSecond.get("statement")); assertEquals(FUNCTION, mapSecond.get("type")); assertFalse(row.hasNext()); }); - db.executeTransactionally("call apoc.custom.removeFunction('a.b.name')"); + db.executeTransactionally("call apoc.custom.removeFunction('aa.bb.name')"); db.executeTransactionally("call db.clearQueryCaches()"); TestUtil.testResult(db, "call apoc.custom.list", (row) -> { assertTrue(row.hasNext()); Map map = row.next(); - assertEquals("x.z.name", map.get("name")); + assertEquals("xx.zz.name", map.get("name")); assertEquals("RETURN 12 as answer", map.get("statement")); assertEquals(FUNCTION, map.get("type")); assertFalse(row.hasNext()); }); - db.executeTransactionally("call apoc.custom.removeFunction('x.z.name')"); + db.executeTransactionally("call apoc.custom.removeFunction('xx.zz.name')"); db.executeTransactionally("call db.clearQueryCaches()"); TestUtil.testCallEmpty(db, "call apoc.custom.list()", Collections.emptyMap()); @@ -538,45 +365,45 @@ public void shouldOverrideCustomFunctionWithDotInNameOnlyIfWithSameNamespaceAndF public void shouldOverrideCustomProcedureWithDotInNameOnlyIfWithSameNamespaceAndFinalName() throws Exception { // given - db.executeTransactionally("call apoc.custom.asProcedure('a.b.name','RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.a.b.name()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareProcedure('aa.bb.name() :: (answer::LONG)','RETURN 42 as answer')"); + TestUtil.testCall(db, "call custom.aa.bb.name()", (row) -> assertEquals(42L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); - db.executeTransactionally("call apoc.custom.asProcedure('a.b.name','RETURN 34 as answer')"); - TestUtil.testCall(db, "call custom.a.b.name()", (row) -> assertEquals(34L, ((Map)row.get("row")).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareProcedure('aa.bb.name() :: (answer::LONG)','RETURN 34 as answer')"); + TestUtil.testCall(db, "call custom.aa.bb.name()", (row) -> assertEquals(34L, row.get("answer"))); db.executeTransactionally("call db.clearQueryCaches()"); - db.executeTransactionally("call apoc.custom.asProcedure('x.z.name','RETURN 12 as answer')"); - TestUtil.testCall(db, "call custom.x.z.name()", (row) -> assertEquals(12L, ((Map)row.get("row")).get("answer"))); - TestUtil.testCall(db, "call custom.a.b.name()", (row) -> assertEquals(34L, ((Map)row.get("row")).get("answer"))); + db.executeTransactionally("CALL apoc.custom.declareProcedure('xx.zz.name() :: (answer::LONG)','RETURN 12 as answer')"); + TestUtil.testCall(db, "call custom.xx.zz.name()", (row) -> assertEquals(12L, row.get("answer"))); + TestUtil.testCall(db, "call custom.aa.bb.name()", (row) -> assertEquals(34L, row.get("answer"))); TestUtil.testResult(db, "call apoc.custom.list", (row) -> { assertTrue(row.hasNext()); Map mapFirst = row.next(); - assertEquals("a.b.name", mapFirst.get("name")); + assertEquals("aa.bb.name", mapFirst.get("name")); assertEquals("RETURN 34 as answer", mapFirst.get("statement")); assertEquals(PROCEDURE, mapFirst.get("type")); assertTrue(row.hasNext()); Map mapSecond = row.next(); - assertEquals("x.z.name", mapSecond.get("name")); + assertEquals("xx.zz.name", mapSecond.get("name")); assertEquals("RETURN 12 as answer", mapSecond.get("statement")); assertEquals(PROCEDURE, mapSecond.get("type")); assertFalse(row.hasNext()); }); - db.executeTransactionally("call apoc.custom.removeProcedure('a.b.name')"); + db.executeTransactionally("call apoc.custom.removeProcedure('aa.bb.name')"); db.executeTransactionally("call db.clearQueryCaches()"); TestUtil.testResult(db, "call apoc.custom.list", (row) -> { assertTrue(row.hasNext()); Map map = row.next(); - assertEquals("x.z.name", map.get("name")); + assertEquals("xx.zz.name", map.get("name")); assertEquals("RETURN 12 as answer", map.get("statement")); assertEquals(PROCEDURE, map.get("type")); assertFalse(row.hasNext()); }); - db.executeTransactionally("call apoc.custom.removeProcedure('x.z.name')"); + db.executeTransactionally("call apoc.custom.removeProcedure('xx.zz.name')"); db.executeTransactionally("call db.clearQueryCaches()"); TestUtil.testCallEmpty(db, "call apoc.custom.list()", Collections.emptyMap()); @@ -589,7 +416,7 @@ public void shouldRemoveTheCustomFunction() throws Exception { thrown.expect(new StatusCodeMatcher("Neo.ClientError.Statement.SyntaxError")); // given - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42','long')"); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer() :: LONG','RETURN 42 as answer')"); TestUtil.testCall(db, "return custom.answer() as answer", (row) -> assertEquals(42L, row.get("answer"))); // when @@ -600,50 +427,6 @@ public void shouldRemoveTheCustomFunction() throws Exception { TestUtil.count(db, "return custom.answer()"); } - @Test - public void shouldOverwriteAndRemoveCustomProcedure() throws Exception { - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42')"); - db.executeTransactionally("call apoc.custom.asProcedure('answer','RETURN 42')"); - assertEquals("Expecting one procedure listed", 1, TestUtil.count(db, "call apoc.custom.list()")); - db.executeTransactionally("call apoc.custom.removeProcedure('answer')"); - } - - @Test - public void shouldOverwriteAndRemoveCustomFunction() throws Exception { - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42','long')"); - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42','long')"); - assertEquals("Expecting one function listed", 1, TestUtil.count(db, "call apoc.custom.list()")); - db.executeTransactionally("call apoc.custom.removeFunction('answer')"); - } - - @Test - public void shouldRemovalOfProcedureNodeDeactivate() { - thrown.expect(QueryExecutionException.class); - thrown.expectMessage("There is no procedure with the name `custom.answer` registered for this database instance. " + - "Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed."); - thrown.expect(new StatusCodeMatcher("Neo.ClientError.Statement.SyntaxError")); - - //given - db.executeTransactionally("call apoc.custom.asProcedure('answer', 'RETURN 42 as answer')"); - TestUtil.testCall(db, "call custom.answer()", (row) -> assertEquals(42L, ((Map)row.get("row")).get("answer"))); - - // remove the node in systemdb - GraphDatabaseService systemDb = db.getManagementService().database("system"); - try (Transaction tx = systemDb.beginTx()) { - Node node = tx.findNode(SystemLabels.ApocCypherProcedures, SystemPropertyKeys.name.name(), "answer"); - node.delete(); - tx.commit(); - } - - // refresh procedures - RegisterComponentFactory.RegisterComponentLifecycle registerComponentLifecycle = db.getDependencyResolver().resolveDependency(RegisterComponentFactory.RegisterComponentLifecycle.class); - CypherProceduresHandler cypherProceduresHandler = (CypherProceduresHandler) registerComponentLifecycle.getResolvers().get(CypherProceduresHandler.class).get(db.databaseName()); - cypherProceduresHandler.restoreProceduresAndFunctions(); - - // when - TestUtil.count(db, "call custom.answer()"); - } - @Test public void shouldRemovalOfFunctionNodeDeactivate() { thrown.expect(QueryExecutionException.class); @@ -651,7 +434,7 @@ public void shouldRemovalOfFunctionNodeDeactivate() { thrown.expect(new StatusCodeMatcher("Neo.ClientError.Statement.SyntaxError")); //given - db.executeTransactionally("call apoc.custom.asFunction('answer','RETURN 42','long')"); + db.executeTransactionally("CALL apoc.custom.declareFunction('answer() :: LONG','RETURN 42 as answer')"); long answer = TestUtil.singleResultFirstColumn(db, "return custom.answer()"); assertEquals(42L, answer); @@ -673,39 +456,6 @@ public void shouldRemovalOfFunctionNodeDeactivate() { TestUtil.singleResultFirstColumn(db, "return custom.answer()"); } - @Test - public void shouldFailWithMismatchedParameters() { - // input mismatch - assertProcedureFails(ERROR_MISMATCHED_INPUTS, - "call apoc.custom.asFunction('answer','RETURN $input as answer','long',[['ajeje','number']])"); - assertProcedureFails(ERROR_MISMATCHED_INPUTS, - "call apoc.custom.asProcedure('answer','RETURN $one as one, $two as two','read',null,[['one','number']])"); - assertProcedureFails(ERROR_MISMATCHED_INPUTS, - "call apoc.custom.declareFunction('double(wrong::INT) :: INT','RETURN $input*2 as answer')"); - assertProcedureFails(ERROR_MISMATCHED_INPUTS, - "call apoc.custom.declareProcedure('sum(input::INT, invalid::INT) :: (answer::INT)','RETURN $first + $second AS answer')"); - // output mismatch - assertProcedureFails(ERROR_MISMATCHED_OUTPUTS, - "call apoc.custom.asProcedure('answer','RETURN $one as one, $two as two','read',[['one','number']],[['one','number'], ['two','number']])"); - assertProcedureFails(ERROR_MISMATCHED_OUTPUTS, - "call apoc.custom.declareProcedure('sum(first::INT, second::INT) :: (something::INT)','RETURN $first + $second AS answer')"); - } - - @Test(expected = QueryExecutionException.class) - public void shouldCreateAVoidProcedure() { - // I create a function to pass later in VOID query - final String functionName = "toDelete"; - final String queryFunction = String.format("RETURN custom.%s() AS num", functionName); - db.executeTransactionally("call apoc.custom.asFunction('" + functionName + "', 'return 10', 'INT')"); - testCall(db, queryFunction, row -> assertEquals(10L, row.get("num"))); - - // now I create a custom procedure with VOID return - db.executeTransactionally("call apoc.custom.declareProcedure('myVoidProc(name :: STRING) :: VOID','call apoc.custom.removeFunction($name)')"); - db.executeTransactionally("CALL custom.myVoidProc('" + functionName + "')"); - db.executeTransactionally("call db.clearQueryCaches()"); - testCall(db, queryFunction, row -> fail("Should fail because of unknown function")); - } - @Test public void shouldFailDeclareFunctionWithDefaultNumberParameters() { final String query = "RETURN $base * $exp AS res"; @@ -787,19 +537,10 @@ public void shouldCreateFunctionWithDefaultParameters() { db.executeTransactionally("CALL apoc.custom.declareProcedure('multiParDeclareProc(params = {} :: MAP) :: (sum :: INT) ', 'RETURN $one + $two + $three as sum')"); TestUtil.testCall(db, "call custom.multiParDeclareProc({one:2, two: 3, three: 4})", (row) -> assertEquals(9L, row.get("sum"))); - - db.executeTransactionally("call apoc.custom.asFunction('multiParFun','RETURN $one + $two as sum', 'long')"); - TestUtil.testCall(db, "return custom.multiParFun({one:2, two: 4}) as row", (row) -> assertEquals(6L, row.get("row"))); - - db.executeTransactionally("call apoc.custom.asProcedure('multiParProc','RETURN $one + $two as sum', 'read', [['sum', 'int']])"); - TestUtil.testCall(db, "call custom.multiParProc({one:2, two: 3})", (row) -> assertEquals(5L, row.get("sum"))); - + // default outputs db.executeTransactionally("CALL apoc.custom.declareProcedure('declareDefaultOut(one :: INTEGER, two :: INTEGER) :: (row :: MAP) ', 'RETURN $one + $two as sum')"); TestUtil.testCall(db, "call custom.declareDefaultOut(5, 3)", (row) -> assertEquals(8L, ((Map)row.get("row")).get("sum"))); - - db.executeTransactionally("call apoc.custom.asProcedure('asDefaultOut','RETURN $one + $two as sum', 'read', [['row', 'MAP']], [['one', 'INTEGER'], ['two', 'INTEGER']])"); - TestUtil.testCall(db, "call custom.asDefaultOut(6,4)", (row) -> assertEquals(10L, ((Map)row.get("row")).get("sum"))); } @Test diff --git a/full/src/test/java/apoc/date/TTLTest.java b/full/src/test/java/apoc/date/TTLTest.java deleted file mode 100644 index 22a5cef256..0000000000 --- a/full/src/test/java/apoc/date/TTLTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package apoc.date; - -import apoc.periodic.Periodic; -import apoc.util.TestUtil; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.contrib.java.lang.system.ProvideSystemProperty; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; -import org.neo4j.graphdb.Label; -import org.neo4j.graphdb.Transaction; -import org.neo4j.internal.helpers.collection.Iterators; -import org.neo4j.test.rule.DbmsRule; -import org.neo4j.test.rule.ImpermanentDbmsRule; - -import java.util.Collections; - -import static apoc.ApocConfig.APOC_TTL_ENABLED; -import static apoc.ApocConfig.APOC_TTL_SCHEDULE; -import static org.junit.Assert.assertEquals; -import static org.neo4j.configuration.GraphDatabaseSettings.procedure_unrestricted; - -/** - * @author mh - * @since 21.05.16 - */ -public class TTLTest { - - public static DbmsRule db = new ImpermanentDbmsRule() - .withSetting(procedure_unrestricted, Collections.singletonList("apoc.*")); - - public static ProvideSystemProperty systemPropertyRule - = new ProvideSystemProperty(APOC_TTL_ENABLED, "true") - .and(APOC_TTL_SCHEDULE, "5"); - - @ClassRule - public static TestRule chain = RuleChain.outerRule(systemPropertyRule).around(db); - - @BeforeClass - public static void setUp() throws Exception { - TestUtil.registerProcedure(db, DateExpiry.class, Periodic.class); - db.executeTransactionally("CREATE (n:Foo:TTL) SET n.ttl = timestamp() + 100"); - db.executeTransactionally("CREATE (n:Bar) WITH n CALL apoc.date.expireIn(n,500,'ms') RETURN count(*)"); - testNodes(1,1); - } - - @AfterClass - public static void tearDown() { - db.shutdown(); - } - - @Test - public void testExpire() throws Exception { - Thread.sleep(10*1000); - testNodes(0,0); - } - - private static void testNodes(int foo, int bar) { - try (Transaction tx=db.beginTx()) { - assertEquals(foo, Iterators.count(tx.findNodes(Label.label("Foo")))); - assertEquals(bar, Iterators.count(tx.findNodes(Label.label("Bar")))); - assertEquals(foo + bar, Iterators.count(tx.findNodes(Label.label("TTL")))); - tx.commit(); - } - } -} diff --git a/full/src/test/java/apoc/mongodb/MongoDBTest.java b/full/src/test/java/apoc/mongodb/MongoDBTest.java index d5d2745422..9b10244071 100644 --- a/full/src/test/java/apoc/mongodb/MongoDBTest.java +++ b/full/src/test/java/apoc/mongodb/MongoDBTest.java @@ -5,21 +5,17 @@ import apoc.util.TestUtil; import apoc.util.UrlResolver; import com.mongodb.MongoClient; -import org.apache.commons.lang3.time.DateUtils; import org.bson.types.ObjectId; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.neo4j.graphdb.QueryExecutionException; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -117,27 +113,6 @@ public void testCompatibleValues() { assertFalse("should not have an exception", hasException); } - @Test - public void testGet() { - TestUtil.testResult(db, "CALL apoc.mongodb.get($host,$db,$collection,null)", params, - res -> assertResult(res)); - } - - @Test - public void testGetCompatible() throws Exception { - TestUtil.testResult(db, "CALL apoc.mongodb.get($host,$db,$collection,null,true)", params, - res -> assertResult(res, LocalDateTime.from(currentTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()))); - } - - @Test - public void testFirst() throws Exception { - TestUtil.testCall(db, "CALL apoc.mongodb.first($host,$db,$collection,{name:'testDocument'})", params, r -> { - Map doc = (Map) r.get("value"); - assertNotNull(doc.get("_id")); - assertEquals("testDocument", doc.get("name")); - }); - } - @Test public void testGetByObjectId() throws Exception { List refsIds = productReferences.stream().map(ObjectId::toString).collect(Collectors.toList()); @@ -185,129 +160,4 @@ public void testGetByObjectIdWithConfigs() throws Exception { assertBoughtReferences(doc, false, false); }); } - - @Test - public void testFind() throws Exception { - TestUtil.testResult(db, "CALL apoc.mongodb.find($host,$db,$collection,{name:'testDocument'},null,null)", - params, res -> assertResult(res)); - } - - @Test - public void testFindSort() throws Exception { - TestUtil.testResult(db, "CALL apoc.mongodb.find($host,$db,$collection,{name:'testDocument'},null,{name:1})", - params, res -> assertResult(res)); - } - - @Test - public void testCount() throws Exception { - TestUtil.testCall(db, "CALL apoc.mongodb.count($host,$db,$collection,{name:'testDocument'})", params, r -> { - assertEquals(NUM_OF_RECORDS, r.get("value")); - }); - } - - @Test - public void testCountAll() throws Exception { - TestUtil.testCall(db, "CALL apoc.mongodb.count($host,$db,$collection,null)", params, r -> { - assertEquals(NUM_OF_RECORDS, r.get("value")); - }); - } - - @Test - public void testUpdate() throws Exception { - TestUtil.testCall(db, "CALL apoc.mongodb.update($host,$db,$collection,{name:'testDocument'},{`$set`:{age:42}})", params, r -> { - long affected = (long) r.get("value"); - assertEquals(NUM_OF_RECORDS, affected); - }); - } - - @Test - public void testInsert() throws Exception { - TestUtil.testResult(db, "CALL apoc.mongodb.insert($host,$db,$collection,[{John:'Snow'}])", params, (r) -> { - assertFalse("should be empty", r.hasNext()); - }); - TestUtil.testCall(db, "CALL apoc.mongodb.first($host,$db,$collection,{John:'Snow'})", params, r -> { - Map doc = (Map) r.get("value"); - assertNotNull(doc.get("_id")); - assertEquals("Snow", doc.get("John")); - }); - } - - @Test - public void testDelete() throws Exception { - TestUtil.testResult(db, "CALL apoc.mongodb.insert($host,$db,$collection,[{foo:'bar'}])", params, (r) -> { - assertFalse("should be empty", r.hasNext()); - }); - TestUtil.testCall(db, "CALL apoc.mongodb.delete($host,$db,$collection,{foo:'bar'})", params, r -> { - long affected = (long) r.get("value"); - assertEquals(1L, affected); - }); - TestUtil.testResult(db, "CALL apoc.mongodb.first($host,$db,$collection,{foo:'bar'})", params, r -> { - assertFalse("should be empty", r.hasNext()); - }); - } - - @Test - public void testInsertFailsDupKey() { - // Three apoc.mongodb.insert each call gets the error: E11000 duplicate key error collection - TestUtil.ignoreException(() -> { - TestUtil.testResult(db, "CALL apoc.mongodb.insert($host,$db,'error',[{foo:'bar', _id: 1}, {foo:'bar', _id: 1}])", params, (r) -> { - assertFalse("should be empty", r.hasNext()); - }); - }, QueryExecutionException.class); - TestUtil.ignoreException(() -> { - TestUtil.testResult(db, "CALL apoc.mongodb.insert($host,$db,'error',[{foo:'bar', _id: 1}, {foo:'bar', _id: 1}])", params, (r) -> { - assertFalse("should be empty", r.hasNext()); - }); - }, QueryExecutionException.class); - TestUtil.ignoreException(() -> { - TestUtil.testResult(db, "CALL apoc.mongodb.insert($host,$db,'error',[{foo:'bar', _id: 1}, {foo:'bar', _id: 1}])", params, (r) -> { - assertFalse("should be empty", r.hasNext()); - }); - }, QueryExecutionException.class); - } - - @Test - public void shouldInsertDataIntoNeo4jWithFromDocument() throws Exception { - Date date = DateUtils.parseDate("11-10-1935", "dd-MM-yyyy"); - TestUtil.testResult(db, "CALL apoc.mongodb.first($host, $db, $collection, $filter, $compatibleValues, $extractReferences) YIELD value " + - "CALL apoc.graph.fromDocument(value, $fromDocConfig) YIELD graph AS g1 " + - "RETURN g1", - map("host", HOST, - "db", "test", - "collection", "person", - "filter", Collections.emptyMap(), - "compatibleValues", true, - "extractReferences", true, - "fromDocConfig", map("write", true, "skipValidation", true, "mappings", map("$", "Person:Customer{!name,bought,coordinates,born}", "$.bought", "Product{!name,price,tags}"))), - r -> assertionsInsertDataWithFromDocument(date, r)); - } - - @Ignore("this does not throw an exception") //TODO: check why test is failing - @Test - public void shouldFailTheInsertWithoutCompatibleValuesFlag() { - thrown.expect(QueryExecutionException.class); - TestUtil.testResult(db, "CALL apoc.mongodb.first($host, $db, $collection, $filter, $compatibleValues, $extractReferences) YIELD value " + - "CALL apoc.graph.fromDocument(value, $fromDocConfig) YIELD graph AS g1 " + - "RETURN g1", - map("host", HOST, - "db", "test", - "collection", "person", - "filter", Collections.emptyMap(), - "compatibleValues", false, - "extractReferences", true, - "fromDocConfig", map("write", true, "skipValidation", true, "mappings", map("$", "Person:Customer{!name,bought,coordinates,born}", "$.bought", "Product{!name,price,tags}"))), - r -> {}); - } - - @Test - public void shouldUseMongoUrlKey() { - TestUtil.testResult(db, "CALL apoc.mongodb.first($host, $db, $collection, $filter, $compatibleValues, $extractReferences)", - map("host", HOST, - "db", "test", - "collection", "person", - "filter", Collections.emptyMap(), - "compatibleValues", false, - "extractReferences", true), - r -> assertTrue(r.hasNext())); - } } diff --git a/full/src/test/java/apoc/periodic/PeriodicExtendedTest.java b/full/src/test/java/apoc/periodic/PeriodicExtendedTest.java deleted file mode 100644 index acbea5e002..0000000000 --- a/full/src/test/java/apoc/periodic/PeriodicExtendedTest.java +++ /dev/null @@ -1,223 +0,0 @@ -package apoc.periodic; - -import apoc.load.Jdbc; -import apoc.util.TestUtil; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.jupiter.api.AfterAll; - -import org.neo4j.common.DependencyResolver; -import org.neo4j.graphdb.QueryExecutionException; -import org.neo4j.internal.helpers.collection.Iterators; -import org.neo4j.kernel.api.exceptions.Status; -import org.neo4j.kernel.impl.api.KernelTransactions; -import org.neo4j.kernel.internal.GraphDatabaseAPI; -import org.neo4j.test.rule.DbmsRule; -import org.neo4j.test.rule.ImpermanentDbmsRule; - -import java.sql.SQLException; -import java.util.Map; - -import static apoc.util.TestUtil.testCall; -import static apoc.util.TestUtil.testResult; -import static apoc.util.Util.map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -public class PeriodicExtendedTest { - - @Rule - public DbmsRule db = new ImpermanentDbmsRule(); - - @Before - public void initDb() { - TestUtil.registerProcedure(db, Periodic.class, PeriodicExtended.class, Jdbc.class); - } - - @AfterAll - public void tearDown() { - db.shutdown(); - } - - @Test - public void testRock_n_roll() { - // setup - db.executeTransactionally("UNWIND range(1,100) AS x CREATE (:Person{name:'Person_'+x})"); - - // when&then - - testResult(db, "CALL apoc.periodic.rock_n_roll('match (p:Person) return p', 'WITH $p as p SET p.lastname =p.name REMOVE p.name', 10)", result -> { - Map row = Iterators.single(result); - assertEquals(10L, row.get("batches")); - assertEquals(100L, row.get("total")); - }); - // then - testCall(db, - "MATCH (p:Person) where p.lastname is not null return count(p) as count", - row -> assertEquals(100L, row.get("count")) - ); - } - - @Test - public void testTerminateRockNRoll() { - PeriodicTestUtils.testTerminatePeriodicQuery(db, "CALL apoc.periodic.rock_n_roll('UNWIND range(0,1000) as id RETURN id', 'CREATE (:Foo {id: $id})', 10)"); - } - - public void testTerminatePeriodicQuery(String periodicQuery) { - killPeriodicQueryAsync(); - try { - testResult(db, periodicQuery, result -> { - Map row = Iterators.single(result); - assertEquals( periodicQuery + " result: " + row.toString(), true, row.get("wasTerminated")); - }); - fail("Should have terminated"); - } catch(Exception tfe) { - assertEquals(tfe.getMessage(),true, tfe.getMessage().contains("terminated")); - } - } - - public void killPeriodicQueryAsync() { - new Thread(() -> { - int retries = 10; - try { - while (retries-- > 0 && !terminateQuery("apoc.periodic")) { - Thread.sleep(10); - } - } catch (InterruptedException e) { - // ignore - } - }).start(); - } - - boolean terminateQuery(String pattern) { - DependencyResolver dependencyResolver = ((GraphDatabaseAPI) db).getDependencyResolver(); - KernelTransactions kernelTransactions = dependencyResolver.resolveDependency(KernelTransactions.class); - long numberOfKilledTransactions = kernelTransactions.activeTransactions().stream() - .filter(kernelTransactionHandle -> - kernelTransactionHandle.executingQuery().map(query -> query.rawQueryText().contains(pattern)) - .orElse(false) - ) - .map(kernelTransactionHandle -> kernelTransactionHandle.markForTermination(Status.Transaction.Terminated)) - .count(); - return numberOfKilledTransactions > 0; - } - - @Test - public void testIterateErrors() { - testResult(db, "CALL apoc.periodic.rock_n_roll('UNWIND range(0,99) as id RETURN id', 'CREATE (:Foo {id: 1 / ($id % 10)})', 10)", result -> { - Map row = Iterators.single(result); - assertEquals(10L, row.get("batches")); - assertEquals(100L, row.get("total")); - assertEquals(0L, row.get("committedOperations")); - assertEquals(100L, row.get("failedOperations")); - assertEquals(10L, row.get("failedBatches")); - Map batchErrors = map("org.neo4j.graphdb.QueryExecutionException: / by zero", 10L); - assertEquals(batchErrors, ((Map) row.get("batch")).get("errors")); - Map operationsErrors = map("/ by zero", 10L); - assertEquals(operationsErrors, ((Map) row.get("operations")).get("errors")); - }); - } - - - @Test - public void testIterateJDBC() { - TestUtil.ignoreException(() -> { - testResult(db, "CALL apoc.periodic.iterate('call apoc.load.jdbc(\"jdbc:mysql://localhost:3306/northwind?user=root\",\"customers\")', 'create (c:Customer) SET c += $row', {batchSize:10,parallel:true})", result -> { - Map row = Iterators.single(result); - assertEquals(3L, row.get("batches")); - assertEquals(29L, row.get("total")); - }); - - testCall(db, - "MATCH (p:Customer) return count(p) as count", - row -> assertEquals(29L, row.get("count")) - ); - }, SQLException.class); - } - - @Test - public void testRock_n_roll_while() { - // setup - db.executeTransactionally("UNWIND range(1,100) AS x CREATE (:Person{name:'Person_'+x})"); - - // when&then - testResult(db, "CALL apoc.periodic.rock_n_roll_while('return coalesce($previous,3)-1 as loop', 'match (p:Person) return p', 'MATCH (p) where p=$p SET p.lastname =p.name', 10)", result -> { - long l = 0; - while (result.hasNext()) { - Map row = result.next(); - assertEquals(2L - l, row.get("loop")); - assertEquals(10L, row.get("batches")); - assertEquals(100L, row.get("total")); - l += 1; - } - assertEquals(2L, l); - }); - // then - testCall(db, - "MATCH (p:Person) where p.lastname is not null return count(p) as count", - row -> assertEquals(100L, row.get("count")) - ); - } - - - @Test(expected = QueryExecutionException.class) - public void testRockNRollWhileLoopFail() { - final String query = "CALL apoc.periodic.rock_n_roll_while('return coalescence($previous, 3) - 1 as loop', " + - "'match (p:Person) return p', " + - "'MATCH (p) where p = {p} SET p.lastname = p.name', " + - "10)"; - testFail(query); - } - - @Test(expected = QueryExecutionException.class) - public void testRockNRollWhileIterateFail() { - final String query = "CALL apoc.periodic.rock_n_roll_while('return coalesce($previous, 3) - 1 as loop', " + - "'match (p:Person) return pp', " + - "'MATCH (p) where p = {p} SET p.lastname = p.name', " + - "10)"; - testFail(query); - } - - - @Test(expected = QueryExecutionException.class) - public void testRockNRollIterateFail() { - final String query = "CALL apoc.periodic.rock_n_roll('match (pp:Person) return p', " + - "'WITH $p as p SET p.lastname = p.name REMOVE p.name', " + - "10)"; - testFail(query); - } - - @Test(expected = QueryExecutionException.class) - public void testRockNRollActionFail() { - final String query = "CALL apoc.periodic.rock_n_roll('match (p:Person) return p', " + - "'WITH $p as p SET pp.lastname = p.name REMOVE p.name', " + - "10)"; - testFail(query); - } - - @Test(expected = QueryExecutionException.class) - public void testRockNRollWhileFail() { - final String newline = System.lineSeparator(); - final String query = "CALL apoc.periodic.rock_n_roll_while('return coalescence($previous, 3) - 1 as loop', " + - "'match (p:Person) return pp', " + - "'MATCH (p) where p = $p SET p.lastname = p.name', " + - "10)"; - try { - testFail(query); - } catch (QueryExecutionException e) { - String expected = "Failed to invoke procedure `apoc.periodic.rock_n_roll_while`: Caused by: java.lang.RuntimeException: Exception for field `cypherLoop`, message: Unknown function 'coalescence' (line 1, column 16 (offset: 15))" + newline + - "\"EXPLAIN return coalescence($previous, 3) - 1 as loop\"" + newline + - " ^\n" + // XXX: do not replace this newline (\n) with the native newline value - "Exception for field `cypherIterate`, message: Variable `pp` not defined (line 1, column 33 (offset: 32))" + newline + - "\"EXPLAIN match (p:Person) return pp\"" + newline + - " ^"; - assertEquals(expected, e.getMessage()); - throw e; - } - } - - private void testFail(String query) { - testCall(db, query, row -> fail("The test should fail but it didn't")); - } -} diff --git a/full/src/test/java/apoc/systemdb/SystemDbTest.java b/full/src/test/java/apoc/systemdb/SystemDbTest.java index 414da76dec..6acad45673 100644 --- a/full/src/test/java/apoc/systemdb/SystemDbTest.java +++ b/full/src/test/java/apoc/systemdb/SystemDbTest.java @@ -125,13 +125,6 @@ public void testExportMetadata() { final String declareProcedure = "CALL apoc.custom.declareProcedure('declareBar(one = 2 :: INTEGER?, two = 3 :: INTEGER?) :: (sum :: INTEGER?)', 'RETURN $one + $two as sum', 'READ', '');"; db.executeTransactionally(declareProcedure); - // We test custom procedures and functions with deprecated syntax - // the expected exported cypher queries will leverage the new procedures (declareFunction and declareProcedure) - db.executeTransactionally("CALL apoc.custom.asProcedure('procName','RETURN $input as answer','read',[['answer','number']],[['input','int','42']], 'Procedure that answer to the Ultimate Question of Life, the Universe, and Everything');"); - db.executeTransactionally("CALL apoc.custom.asFunction('funName','RETURN $input as answer', 'long', [['input','number']], false);"); - String declareStatementFromFunction = "CALL apoc.custom.declareFunction('funName(input :: NUMBER?) :: (INTEGER?)', 'RETURN $input as answer', false, '');"; - String declareStatementFromProcedure = "CALL apoc.custom.declareProcedure('procName(input = 42 :: INTEGER?) :: (answer :: NUMBER?)', 'RETURN $input as answer', 'READ', 'Procedure that answer to the Ultimate Question of Life, the Universe, and Everything');"; - // We test uuid, we also need to export the related constraint (in another file) final String constraintForUuid = "CREATE CONSTRAINT Person_alpha IF NOT EXISTS FOR (n:Person) REQUIRE n.alpha IS UNIQUE;"; db.executeTransactionally(constraintForUuid); @@ -143,7 +136,7 @@ public void testExportMetadata() { db.executeTransactionally(dvStatement); TestUtil.testCall(db, "CALL apoc.systemdb.export.metadata", row -> { - assertEquals(8L, row.get("rows")); + assertEquals(6L, row.get("rows")); assertEquals(true, row.get("done")); assertEquals("metadata", row.get("file")); }); @@ -151,8 +144,8 @@ public void testExportMetadata() { assertEquals(Set.of(constraintForUuid), readFileLines("metadata.Uuid.schema.neo4j.cypher", directory)); assertEquals(Set.of(uuidStatement), readFileLines("metadata.Uuid.neo4j.cypher", directory)); assertEquals(Set.of(triggerOne, triggerTwo, pauseTrigger), readFileLines("metadata.Trigger.neo4j.cypher", directory)); - assertEquals(Set.of(declareProcedure, declareStatementFromProcedure), readFileLines("metadata.CypherProcedure.neo4j.cypher", directory)); - assertEquals(Set.of(declareFunction, declareStatementFromFunction), readFileLines("metadata.CypherFunction.neo4j.cypher", directory)); + assertEquals(Set.of(declareProcedure), readFileLines("metadata.CypherProcedure.neo4j.cypher", directory)); + assertEquals(Set.of(declareFunction), readFileLines("metadata.CypherFunction.neo4j.cypher", directory)); assertEquals(Set.of(dvStatement), readFileLines("metadata.DataVirtualizationCatalog.neo4j.cypher", directory)); // -- with config and uuid constrain dropped From 4d00017f964ef6233add1d4d7a60c2959407bebf Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Fri, 15 Jul 2022 13:43:06 +0200 Subject: [PATCH 2/9] Remove references of deprecated procedures from all documentation --- docs/asciidoc/functions.adoc | 4 - ...oc.algo.dijkstraWithDefaultWeight-lite.csv | 2 - .../apoc.algo.dijkstraWithDefaultWeight.adoc | 5 - .../apoc.algo.dijkstraWithDefaultWeight.csv | 2 - .../apoc.cluster-lite.csv | 2 - .../generated-documentation/apoc.cluster.csv | 6 - .../apoc.cluster.graph-lite.csv | 2 - .../apoc.cluster.graph.adoc | 5 - .../apoc.cluster.graph.csv | 2 - .../apoc.coll-lite.csv | 1 - .../generated-documentation/apoc.coll.csv | 5 - .../apoc.coll.reverse-lite.csv | 2 - .../apoc.coll.reverse.adoc | 5 - .../apoc.coll.reverse.csv | 2 - .../apoc.create-lite.csv | 4 - .../apoc.create.vPattern-lite.csv | 2 - .../apoc.create.vPattern.adoc | 5 - .../apoc.create.vPattern.csv | 2 - .../apoc.create.vPatternFull-lite.csv | 2 - .../apoc.create.vPatternFull.adoc | 5 - .../apoc.create.vPatternFull.csv | 2 - .../apoc.custom-lite.csv | 2 - .../apoc.custom.asFunction-lite.csv | 2 - .../apoc.custom.asFunction.adoc | 5 - .../apoc.custom.asFunction.csv | 2 - .../apoc.custom.asProcedure-lite.csv | 2 - .../apoc.custom.asProcedure.adoc | 5 - .../apoc.custom.asProcedure.csv | 2 - .../generated-documentation/apoc.custom.csv | 10 - .../generated-documentation/apoc.cypher.csv | 5 - .../apoc.cypher.runFirstColumn-lite.csv | 2 - .../apoc.cypher.runFirstColumn.adoc | 5 - .../apoc.cypher.runFirstColumn.csv | 2 - .../apoc.data-lite.csv | 1 - .../generated-documentation/apoc.data.csv | 5 - .../apoc.data.domain-lite.csv | 2 - .../apoc.data.domain.adoc | 5 - .../apoc.data.domain.csv | 2 - .../apoc.date-lite.csv | 3 - .../generated-documentation/apoc.date.csv | 15 -- .../apoc.date.expire-lite.csv | 2 - .../apoc.date.expire.adoc | 5 - .../apoc.date.expire.csv | 2 - .../apoc.date.expireIn-lite.csv | 2 - .../apoc.date.expireIn.adoc | 5 - .../apoc.date.expireIn.csv | 2 - .../apoc.date.parseAsZonedDateTime-lite.csv | 2 - .../apoc.date.parseAsZonedDateTime.adoc | 5 - .../apoc.date.parseAsZonedDateTime.csv | 2 - .../apoc.export-lite.csv | 5 - .../generated-documentation/apoc.export.csv | 21 -- .../apoc.export.cypherAll-lite.csv | 2 - .../apoc.export.cypherAll.adoc | 5 - .../apoc.export.cypherAll.csv | 2 - .../apoc.export.cypherData-lite.csv | 2 - .../apoc.export.cypherData.adoc | 5 - .../apoc.export.cypherData.csv | 2 - .../apoc.export.cypherGraph-lite.csv | 2 - .../apoc.export.cypherGraph.adoc | 5 - .../apoc.export.cypherGraph.csv | 2 - .../apoc.export.cypherQuery-lite.csv | 2 - .../apoc.export.cypherQuery.adoc | 5 - .../apoc.export.cypherQuery.csv | 2 - .../apoc.load.jdbcParams-lite.csv | 2 - .../apoc.load.jdbcParams.adoc | 5 - .../apoc.load.jdbcParams.csv | 2 - .../generated-documentation/apoc.math.csv | 5 - .../apoc.math.round-lite.csv | 2 - .../apoc.math.round.adoc | 5 - .../apoc.math.round.csv | 2 - .../apoc.meta-lite.csv | 4 - .../apoc.meta.isType-lite.csv | 2 - .../apoc.meta.isType.adoc | 5 - .../apoc.meta.isType.csv | 2 - .../apoc.meta.type-lite.csv | 2 - .../apoc.meta.type.adoc | 5 - .../apoc.meta.type.csv | 2 - .../apoc.meta.typeName-lite.csv | 2 - .../apoc.meta.typeName.adoc | 5 - .../apoc.meta.typeName.csv | 2 - .../apoc.meta.types-lite.csv | 2 - .../apoc.meta.types.adoc | 5 - .../apoc.meta.types.csv | 2 - .../apoc.mongodb-lite.csv | 8 - .../apoc.mongodb.count-lite.csv | 2 - .../apoc.mongodb.count.adoc | 5 - .../apoc.mongodb.count.csv | 2 - .../generated-documentation/apoc.mongodb.csv | 36 --- .../apoc.mongodb.delete-lite.csv | 2 - .../apoc.mongodb.delete.adoc | 5 - .../apoc.mongodb.delete.csv | 2 - .../apoc.mongodb.find-lite.csv | 2 - .../apoc.mongodb.find.adoc | 5 - .../apoc.mongodb.find.csv | 2 - .../apoc.mongodb.first-lite.csv | 2 - .../apoc.mongodb.first.adoc | 5 - .../apoc.mongodb.first.csv | 2 - .../apoc.mongodb.get-lite.csv | 2 +- .../apoc.mongodb.get.adoc | 5 - .../apoc.mongodb.insert-lite.csv | 2 - .../apoc.mongodb.insert.adoc | 5 - .../apoc.mongodb.insert.csv | 2 - .../apoc.mongodb.update-lite.csv | 2 - .../apoc.mongodb.update.adoc | 5 - .../apoc.mongodb.update.csv | 2 - .../apoc.periodic-lite.csv | 2 - .../generated-documentation/apoc.periodic.csv | 10 - .../apoc.periodic.rock_n_roll-lite.csv | 2 - .../apoc.periodic.rock_n_roll.adoc | 5 - .../apoc.periodic.rock_n_roll.csv | 2 - .../apoc.periodic.rock_n_roll_while-lite.csv | 2 - .../apoc.periodic.rock_n_roll_while.adoc | 5 - .../apoc.periodic.rock_n_roll_while.csv | 2 - ...actor.cloneNodesWithRelationships-lite.csv | 2 - ....refactor.cloneNodesWithRelationships.adoc | 5 - ...c.refactor.cloneNodesWithRelationships.csv | 2 - .../generated-documentation/apoc.refactor.csv | 5 - .../apoc.warmup-lite.csv | 2 - .../generated-documentation/apoc.warmup.csv | 6 - .../apoc.warmup.run-lite.csv | 2 - .../apoc.warmup.run.adoc | 5 - .../apoc.warmup.run.csv | 2 - .../generated-documentation/apoc.xml-lite.csv | 1 - .../generated-documentation/apoc.xml.csv | 5 - .../apoc.xml.import-lite.csv | 2 - .../apoc.xml.import.adoc | 5 - .../apoc.xml.import.csv | 2 - .../generated-documentation/documentation.csv | 47 +--- docs/asciidoc/modules/ROOT/nav.adoc | 2 - .../algorithms/path-finding-procedures.adoc | 1 - .../pages/background-operations/triggers.adoc | 2 +- .../cypher-based-procedures-functions.adoc | 63 ++--- .../cypher-execution/running-cypher.adoc | 1 - .../collection-list-functions.adoc | 1 - .../pages/database-integration/index.adoc | 1 - .../pages/database-integration/load-jdbc.adoc | 13 - .../pages/database-integration/mongo.adoc | 22 +- .../pages/database-integration/redis.adoc | 2 +- .../pages/database-introspection/meta.adoc | 20 +- .../graph-refactoring/clone-nodes.adoc | 34 --- .../graph-updates/periodic-execution.adoc | 12 +- .../pages/mathematical/math-functions.adoc | 1 - .../ROOT/pages/misc/static-values.adoc | 3 - .../ROOT/pages/misc/text-functions.adoc | 19 -- .../modules/ROOT/pages/operational/index.adoc | 1 - .../ROOT/pages/operational/warmup.adoc | 10 - .../apoc.algo.dijkstraWithDefaultWeight.adoc | 40 --- .../apoc.cluster/apoc.cluster.graph.adoc | 24 -- .../pages/overview/apoc.cluster/index.adoc | 17 -- .../overview/apoc.coll/apoc.coll.reverse.adoc | 30 --- .../apoc.create/apoc.create.vPattern.adoc | 44 ---- .../apoc.create/apoc.create.vPatternFull.adoc | 46 ---- .../apoc.custom/apoc.custom.asFunction.adoc | 37 --- .../apoc.custom/apoc.custom.asProcedure.adoc | 37 --- .../pages/overview/apoc.custom/index.adoc | 10 - .../apoc.cypher.runFirstColumn.adoc | 30 --- .../pages/overview/apoc.cypher/index.adoc | 5 - .../overview/apoc.data/apoc.data.domain.adoc | 30 --- .../ROOT/pages/overview/apoc.data/index.adoc | 5 - .../overview/apoc.date/apoc.date.expire.adoc | 28 -- .../apoc.date/apoc.date.expireIn.adoc | 28 -- .../apoc.date.parseAsZonedDateTime.adoc | 28 -- .../ROOT/pages/overview/apoc.date/index.adoc | 15 -- .../apoc.export/apoc.export.cypherAll.adoc | 50 ---- .../apoc.export/apoc.export.cypherData.adoc | 52 ---- .../apoc.export/apoc.export.cypherGraph.adoc | 51 ---- .../apoc.export/apoc.export.cypherQuery.adoc | 51 ---- .../apoc.load/apoc.load.jdbcParams.adoc | 38 --- .../overview/apoc.math/apoc.math.round.adoc | 34 --- .../ROOT/pages/overview/apoc.math/index.adoc | 5 - .../overview/apoc.meta/apoc.meta.isType.adoc | 27 -- .../overview/apoc.meta/apoc.meta.type.adoc | 26 -- .../apoc.meta/apoc.meta.typeName.adoc | 26 -- .../overview/apoc.meta/apoc.meta.types.adoc | 26 -- .../ROOT/pages/overview/apoc.meta/index.adoc | 20 -- .../apoc.mongodb/apoc.mongodb.count.adoc | 45 ---- .../apoc.mongodb/apoc.mongodb.delete.adoc | 45 ---- .../apoc.mongodb/apoc.mongodb.find.adoc | 52 ---- .../apoc.mongodb/apoc.mongodb.first.adoc | 48 ---- .../apoc.mongodb/apoc.mongodb.get.adoc | 50 ---- .../apoc.mongodb/apoc.mongodb.insert.adoc | 38 --- .../apoc.mongodb/apoc.mongodb.update.adoc | 46 ---- .../pages/overview/apoc.mongodb/index.adoc | 35 --- .../apoc.periodic.rock_n_roll.adoc | 49 ---- .../apoc.periodic.rock_n_roll_while.adoc | 38 --- .../pages/overview/apoc.periodic/index.adoc | 10 - ....refactor.cloneNodesWithRelationships.adoc | 37 --- .../pages/overview/apoc.refactor/index.adoc | 5 - .../pages/overview/apoc.static/index.adoc | 5 - .../ROOT/pages/overview/apoc.text/index.adoc | 10 - .../overview/apoc.warmup/apoc.warmup.run.adoc | 70 ----- .../pages/overview/apoc.warmup/index.adoc | 17 -- .../overview/apoc.xml/apoc.xml.import.adoc | 34 --- .../ROOT/pages/overview/apoc.xml/index.adoc | 5 - .../pages/temporal/datetime-conversions.adoc | 12 - .../modules/ROOT/pages/transaction/index.adoc | 2 - .../pages/virtual/virtual-nodes-rels.adoc | 3 - .../documentation.adoc | 217 +--------------- .../partials/generated-documentation/nav.adoc | 42 --- .../partials/usage/apoc.coll.reverse.adoc | 13 - .../partials/usage/apoc.create.vPattern.adoc | 55 ---- .../usage/apoc.create.vPatternFull.adoc | 55 ---- .../usage/apoc.custom.asFunction.adoc | 25 -- .../usage/apoc.custom.asProcedure.adoc | 30 --- .../usage/apoc.custom.declareFunction.adoc | 2 - .../ROOT/partials/usage/apoc.data.domain.adoc | 25 -- .../ROOT/partials/usage/apoc.math.round.adoc | 28 -- .../partials/usage/apoc.mongodb.count.adoc | 20 -- .../partials/usage/apoc.mongodb.delete.adoc | 52 ---- .../partials/usage/apoc.mongodb.find.adoc | 33 --- .../partials/usage/apoc.mongodb.first.adoc | 25 -- .../ROOT/partials/usage/apoc.mongodb.get.adoc | 33 --- .../partials/usage/apoc.mongodb.insert.adoc | 25 -- .../partials/usage/apoc.mongodb.update.adoc | 54 ---- .../ROOT/partials/usage/apoc.warmup.run.adoc | 51 ---- docs/guide.html | 167 ------------ ...or.cloneNodesWithRelationships.dataset.png | Bin 44325 -> 0 bytes ...c.refactor.cloneNodesWithRelationships.png | Bin 48433 -> 0 bytes docs/index.html | 243 ------------------ full/import/apoc-core-extended.csv | 37 --- full/src/main/resources/extended.txt | 16 -- full/src/test/java/DocsTest.java | 2 - full/src/test/resources/signatures.csv | 26 -- 223 files changed, 51 insertions(+), 3473 deletions(-) delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.get.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import-lite.csv delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import.adoc delete mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import.csv delete mode 100644 docs/asciidoc/modules/ROOT/pages/operational/warmup.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.algo/apoc.algo.dijkstraWithDefaultWeight.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.cluster/apoc.cluster.graph.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.cluster/index.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.coll/apoc.coll.reverse.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.create/apoc.create.vPattern.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.create/apoc.create.vPatternFull.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/apoc.custom.asFunction.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/apoc.custom.asProcedure.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.cypher/apoc.cypher.runFirstColumn.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.data/apoc.data.domain.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.expire.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.expireIn.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.parseAsZonedDateTime.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherAll.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherData.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherGraph.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherQuery.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.load/apoc.load.jdbcParams.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.math/apoc.math.round.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.isType.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.type.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.typeName.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.types.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.count.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.delete.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.find.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.first.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.get.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.insert.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.update.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/apoc.periodic.rock_n_roll.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/apoc.periodic.rock_n_roll_while.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.refactor/apoc.refactor.cloneNodesWithRelationships.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/apoc.warmup.run.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/index.adoc delete mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.xml/apoc.xml.import.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.coll.reverse.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.create.vPattern.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.create.vPatternFull.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.asFunction.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.asProcedure.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.data.domain.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.math.round.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.count.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.delete.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.find.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.first.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.get.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.insert.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.update.adoc delete mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.warmup.run.adoc delete mode 100644 docs/images/apoc.refactor.cloneNodesWithRelationships.dataset.png delete mode 100644 docs/images/apoc.refactor.cloneNodesWithRelationships.png diff --git a/docs/asciidoc/functions.adoc b/docs/asciidoc/functions.adoc index fa6cd8313b..9a333ad52e 100644 --- a/docs/asciidoc/functions.adoc +++ b/docs/asciidoc/functions.adoc @@ -76,10 +76,6 @@ In our APOC procedure library we already converted about https://github.com/neo4 | 8 | apoc.convert.toMap(value) -| type information and checking -| 4 -| apoc.meta.type(value) - | collection and map functions | 25 | apoc.map.fromList(["k1",v1,"k2",v2,"k3",v3]) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight-lite.csv deleted file mode 100644 index 04949f5b0b..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.algo.dijkstraWithDefaultWeight(startNode :: NODE?, endNode :: NODE?, relationshipTypesAndDirections :: STRING?, weightPropertyName :: STRING?, defaultWeight :: FLOAT?) :: (path :: PATH?, weight :: FLOAT?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight.adoc deleted file mode 100644 index 5ed2a0c5be..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.algo/apoc.algo.dijkstraWithDefaultWeight.adoc[apoc.algo.dijkstraWithDefaultWeight icon:book[]] + - -`apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS|', 'distance', 10) YIELD path, weight` - run dijkstra with relationship property name as cost function and a default weight if the property does not exist -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight.csv deleted file mode 100644 index dfc9878b31..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.algo.dijkstraWithDefaultWeight.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.algo.dijkstraWithDefaultWeight¦apoc.algo.dijkstraWithDefaultWeight(startNode :: NODE?, endNode :: NODE?, relationshipTypesAndDirections :: STRING?, weightPropertyName :: STRING?, defaultWeight :: FLOAT?) :: (path :: PATH?, weight :: FLOAT?)¦apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS|', 'distance', 10) YIELD path, weight - run dijkstra with relationship property name as cost function and a default weight if the property does not exist diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster-lite.csv deleted file mode 100644 index 491904ac86..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.cluster.graph() :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.csv deleted file mode 100644 index 475f947220..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.csv +++ /dev/null @@ -1,6 +0,0 @@ -¦Qualified Name¦Type¦Release -|xref::overview/apoc.cluster/apoc.cluster.adoc[apoc.cluster.graph icon:book[]] - - -|label:procedure[] -|label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph-lite.csv deleted file mode 100644 index 491904ac86..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.cluster.graph() :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph.adoc deleted file mode 100644 index 2c52a3a20a..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.cluster/apoc.cluster.graph.adoc[apoc.cluster.graph icon:book[]] + - -`` -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph.csv deleted file mode 100644 index d4cb8fca83..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cluster.graph.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.cluster.graph¦apoc.cluster.graph() :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?)¦ diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll-lite.csv index d900245670..c3f3f6c85c 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll-lite.csv @@ -35,7 +35,6 @@ ¦apoc.coll.randomItems(coll :: LIST? OF ANY?, itemCount :: INTEGER?, allowRepick = false :: BOOLEAN?) :: (LIST? OF ANY?) ¦apoc.coll.remove(coll :: LIST? OF ANY?, index :: INTEGER?, length = 1 :: INTEGER?) :: (LIST? OF ANY?) ¦apoc.coll.removeAll(first :: LIST? OF ANY?, second :: LIST? OF ANY?) :: (LIST? OF ANY?) -¦apoc.coll.reverse(coll :: LIST? OF ANY?) :: (LIST? OF ANY?) ¦apoc.coll.runningTotal(list :: LIST? OF NUMBER?) :: (LIST? OF ANY?) ¦apoc.coll.set(coll :: LIST? OF ANY?, index :: INTEGER?, value :: ANY?) :: (LIST? OF ANY?) ¦apoc.coll.shuffle(coll :: LIST? OF ANY?) :: (LIST? OF ANY?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.csv index 4565d0b8a8..75f2cebec0 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.csv @@ -189,11 +189,6 @@ apoc.coll.remove(coll, index, [length=1]) \| remove range of values from index t apoc.coll.removeAll(first, second) - returns first list with all elements of second list removed |label:function[] |label:apoc-core[] -|xref::overview/apoc.coll/apoc.coll.adoc[apoc.coll.reverse icon:book[]] - -apoc.coll.reverse(coll) - returns reversed list -|label:function[] -|label:apoc-core[] |xref::overview/apoc.coll/apoc.coll.adoc[apoc.coll.runningTotal icon:book[]] apoc.coll.runningTotal(list1) - returns an accumulative array. For example apoc.coll.runningTotal([1,2,3.5]) return [1,3,6.5] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse-lite.csv deleted file mode 100644 index 881743ebcf..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.coll.reverse(coll :: LIST? OF ANY?) :: (LIST? OF ANY?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse.adoc deleted file mode 100644 index 13f3326577..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.coll/apoc.coll.reverse.adoc[apoc.coll.reverse icon:book[]] + - -`apoc.coll.reverse(coll)` - returns reversed list -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse.csv deleted file mode 100644 index 46a01a6ad1..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.coll.reverse.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.coll.reverse¦apoc.coll.reverse(coll :: LIST? OF ANY?) :: (LIST? OF ANY?)¦apoc.coll.reverse(coll) - returns reversed list diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create-lite.csv index eed1b064b2..f754f09b3b 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create-lite.csv @@ -14,10 +14,6 @@ ¦apoc.create.uuids(count :: INTEGER?) :: (row :: INTEGER?, uuid :: STRING?) ¦apoc.create.vNode(label :: LIST? OF STRING?, props :: MAP?) :: (node :: NODE?) ¦apoc.create.vNodes(label :: LIST? OF STRING?, props :: LIST? OF MAP?) :: (node :: NODE?) -¦apoc.create.clonePathToVirtual(path :: PATH?) :: (path :: PATH?) -¦apoc.create.clonePathsToVirtual(paths :: LIST? OF PATH?) :: (path :: PATH?) -¦apoc.create.vPattern(from :: MAP?, relType :: STRING?, props :: MAP?, to :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?) -¦apoc.create.vPatternFull(labelsN :: LIST? OF STRING?, n :: MAP?, relType :: STRING?, props :: MAP?, labelsM :: LIST? OF STRING?, m :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?) ¦apoc.create.vRelationship(from :: NODE?, relType :: STRING?, props :: MAP?, to :: NODE?) :: (rel :: RELATIONSHIP?) ¦apoc.create.virtualPath(labelsN :: LIST? OF STRING?, n :: MAP?, relType :: STRING?, props :: MAP?, labelsM :: LIST? OF STRING?, m :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?) ¦apoc.create.uuid() :: (STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern-lite.csv deleted file mode 100644 index e9b055468a..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.create.vPattern(from :: MAP?, relType :: STRING?, props :: MAP?, to :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern.adoc deleted file mode 100644 index 1c6c73c929..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.create/apoc.create.vPattern.adoc[apoc.create.vPattern icon:book[]] + - -`apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,...}, {_labels:['LabelB'],key:value}) returns a virtual pattern` -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern.csv deleted file mode 100644 index 7a67aefc15..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPattern.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.create.vPattern¦apoc.create.vPattern(from :: MAP?, relType :: STRING?, props :: MAP?, to :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?)¦apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,...}, {_labels:['LabelB'],key:value}) returns a virtual pattern diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull-lite.csv deleted file mode 100644 index 79c024c883..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.create.vPatternFull(labelsN :: LIST? OF STRING?, n :: MAP?, relType :: STRING?, props :: MAP?, labelsM :: LIST? OF STRING?, m :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull.adoc deleted file mode 100644 index 4b049c045e..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.create/apoc.create.vPatternFull.adoc[apoc.create.vPatternFull icon:book[]] + - -`apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual pattern` -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull.csv deleted file mode 100644 index f0c5904332..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.create.vPatternFull.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.create.vPatternFull¦apoc.create.vPatternFull(labelsN :: LIST? OF STRING?, n :: MAP?, relType :: STRING?, props :: MAP?, labelsM :: LIST? OF STRING?, m :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?)¦apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual pattern diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom-lite.csv index 42881ec63a..f9c26659a3 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom-lite.csv @@ -1,6 +1,4 @@ ¦signature -¦apoc.custom.asFunction(name :: STRING?, statement :: STRING?, outputs = :: STRING?, inputs = null :: LIST? OF LIST? OF STRING?, forceSingle = false :: BOOLEAN?, description = :: STRING?) :: VOID -¦apoc.custom.asProcedure(name :: STRING?, statement :: STRING?, mode = read :: STRING?, outputs = null :: LIST? OF LIST? OF STRING?, inputs = null :: LIST? OF LIST? OF STRING?, description = :: STRING?) :: VOID ¦apoc.custom.declareFunction(signature :: STRING?, statement :: STRING?, forceSingle = false :: BOOLEAN?, description = :: STRING?) :: VOID ¦apoc.custom.declareProcedure(signature :: STRING?, statement :: STRING?, mode = read :: STRING?, description = :: STRING?) :: VOID ¦apoc.custom.list() :: (type :: STRING?, name :: STRING?, description :: STRING?, mode :: STRING?, statement :: STRING?, inputs :: LIST? OF LIST? OF STRING?, outputs :: ANY?, forceSingle :: BOOLEAN?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction-lite.csv deleted file mode 100644 index d1e0833d22..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.custom.asFunction(name :: STRING?, statement :: STRING?, outputs = :: STRING?, inputs = null :: LIST? OF LIST? OF STRING?, forceSingle = false :: BOOLEAN?, description = :: STRING?) :: VOID diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction.adoc deleted file mode 100644 index 3100874d32..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.custom/apoc.custom.asFunction.adoc[apoc.custom.asFunction icon:book[]] + - -`apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description)` - register a custom cypher function -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction.csv deleted file mode 100644 index 5a5d846a43..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asFunction.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.custom.asFunction¦apoc.custom.asFunction(name :: STRING?, statement :: STRING?, outputs = :: STRING?, inputs = null :: LIST? OF LIST? OF STRING?, forceSingle = false :: BOOLEAN?, description = :: STRING?) :: VOID¦apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description) - register a custom cypher function diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure-lite.csv deleted file mode 100644 index cfd812ebd0..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.custom.asProcedure(name :: STRING?, statement :: STRING?, mode = read :: STRING?, outputs = null :: LIST? OF LIST? OF STRING?, inputs = null :: LIST? OF LIST? OF STRING?, description = :: STRING?) :: VOID diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure.adoc deleted file mode 100644 index f7990380ac..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.custom/apoc.custom.asProcedure.adoc[apoc.custom.asProcedure icon:book[]] + - -`apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description)` - register a custom cypher procedure -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure.csv deleted file mode 100644 index d4afb29b26..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.asProcedure.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.custom.asProcedure¦apoc.custom.asProcedure(name :: STRING?, statement :: STRING?, mode = read :: STRING?, outputs = null :: LIST? OF LIST? OF STRING?, inputs = null :: LIST? OF LIST? OF STRING?, description = :: STRING?) :: VOID¦apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description) - register a custom cypher procedure diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.csv index 7d34f76d36..78e1d44f7d 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.custom.csv @@ -1,14 +1,4 @@ ¦Qualified Name¦Type¦Release -|xref::overview/apoc.custom/apoc.custom.adoc[apoc.custom.asFunction icon:book[]] - -apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description) - register a custom cypher function -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.custom/apoc.custom.adoc[apoc.custom.asProcedure icon:book[]] - -apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description) - register a custom cypher procedure -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.custom/apoc.custom.adoc[apoc.custom.declareFunction icon:book[]] apoc.custom.declareFunction(signature, statement, forceSingle, description) - register a custom cypher function diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.csv index f3bcbf0792..b64423a341 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.csv @@ -84,11 +84,6 @@ apoc.cypher.runTimeboxed('cypherStatement',\{params}, timeout) - abort kernelTra apoc.cypher.runWrite(statement, params) yield value - alias for apoc.cypher.doIt |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.cypher/apoc.cypher.adoc[apoc.cypher.runFirstColumn icon:book[]] - -use either apoc.cypher.runFirstColumnMany for a list return or apoc.cypher.runFirstColumnSingle for returning the first row of the first column -|label:function[] -|label:apoc-core[] |xref::overview/apoc.cypher/apoc.cypher.adoc[apoc.cypher.runFirstColumnMany icon:book[]] apoc.cypher.runFirstColumnMany(statement, params) - executes statement with given parameters, returns first column only collected into a list, params are available as identifiers diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn-lite.csv deleted file mode 100644 index 26c8489ba8..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.cypher.runFirstColumn(cypher :: STRING?, params :: MAP?, expectMultipleValues = true :: BOOLEAN?) :: (ANY?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn.adoc deleted file mode 100644 index 12c585e680..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.cypher/apoc.cypher.runFirstColumn.adoc[apoc.cypher.runFirstColumn icon:book[]] + - -`use either apoc.cypher.runFirstColumnMany for a list return or apoc.cypher.runFirstColumnSingle for returning the first row of the first column` -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn.csv deleted file mode 100644 index 531add0fe3..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.cypher.runFirstColumn.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.cypher.runFirstColumn¦apoc.cypher.runFirstColumn(cypher :: STRING?, params :: MAP?, expectMultipleValues = true :: BOOLEAN?) :: (ANY?)¦use either apoc.cypher.runFirstColumnMany for a list return or apoc.cypher.runFirstColumnSingle for returning the first row of the first column diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data-lite.csv index 3ba715a25e..2c8aed2ccb 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data-lite.csv @@ -1,4 +1,3 @@ ¦signature -¦apoc.data.domain(url_or_email_address :: STRING?) :: (STRING?) ¦apoc.data.email(email_address :: STRING?) :: (MAP?) ¦apoc.data.url(url :: STRING?) :: (MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.csv index e5b85f22f7..9bcc4f6c6a 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.csv @@ -1,9 +1,4 @@ ¦Qualified Name¦Type¦Release -|xref::overview/apoc.data/apoc.data.adoc[apoc.data.domain icon:book[]] - -apoc.data.domain('url_or_email_address') YIELD domain - extract the domain name from a url or an email address. If nothing was found, yield null. -|label:function[] -|label:apoc-core[] |xref::overview/apoc.data/apoc.data.adoc[apoc.data.email icon:book[]] apoc.data.email('email_address') as {personal,user,domain} - extract the personal name, user and domain as a map diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain-lite.csv deleted file mode 100644 index e84101944a..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.data.domain(url_or_email_address :: STRING?) :: (STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain.adoc deleted file mode 100644 index ace9069d3d..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.data/apoc.data.domain.adoc[apoc.data.domain icon:book[]] + - -`apoc.data.domain('url_or_email_address') YIELD domain` - extract the domain name from a url or an email address. If nothing was found, yield null. -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain.csv deleted file mode 100644 index 8c1ebc713d..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.data.domain.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.data.domain¦apoc.data.domain(url_or_email_address :: STRING?) :: (STRING?)¦apoc.data.domain('url_or_email_address') YIELD domain - extract the domain name from a url or an email address. If nothing was found, yield null. diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date-lite.csv index 1a3cc800e5..130e02be43 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date-lite.csv @@ -1,6 +1,4 @@ ¦signature -¦apoc.date.expire(node :: NODE?, time :: INTEGER?, timeUnit :: STRING?) :: VOID -¦apoc.date.expireIn(node :: NODE?, timeDelta :: INTEGER?, timeUnit :: STRING?) :: VOID ¦apoc.date.add(time :: INTEGER?, unit :: STRING?, addValue :: INTEGER?, addUnit :: STRING?) :: (INTEGER?) ¦apoc.date.convert(time :: INTEGER?, unit :: STRING?, toUnit :: STRING?) :: (INTEGER?) ¦apoc.date.convertFormat(temporal :: STRING?, currentFormat :: STRING?, convertTo = yyyy-MM-dd :: STRING?) :: (STRING?) @@ -10,7 +8,6 @@ ¦apoc.date.format(time :: INTEGER?, unit = ms :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = :: STRING?) :: (STRING?) ¦apoc.date.fromISO8601(time :: STRING?) :: (INTEGER?) ¦apoc.date.parse(time :: STRING?, unit = ms :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = :: STRING?) :: (INTEGER?) -¦apoc.date.parseAsZonedDateTime(time :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = UTC :: STRING?) :: (DATETIME?) ¦apoc.date.systemTimezone() :: (STRING?) ¦apoc.date.toISO8601(time :: INTEGER?, unit = ms :: STRING?) :: (STRING?) ¦apoc.date.toYears(value :: ANY?, format = yyyy-MM-dd HH:mm:ss :: STRING?) :: (FLOAT?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.csv index 882e87df5d..e1cdf70dc8 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.csv @@ -1,14 +1,4 @@ ¦Qualified Name¦Type¦Release -|xref::overview/apoc.date/apoc.date.adoc[apoc.date.expire icon:book[]] - -CALL apoc.date.expire(node,time,'time-unit') - expire node at specified time by setting :TTL label and `ttl` property -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.date/apoc.date.adoc[apoc.date.expireIn icon:book[]] - -CALL apoc.date.expireIn(node,time,'time-unit') - expire node after specified length of time time by setting :TTL label and `ttl` property -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.date/apoc.date.adoc[apoc.date.add icon:book[]] apoc.date.add(12345, 'ms', -365, 'd') - given a timestamp in one time unit, adds a value of the specified time unit @@ -54,11 +44,6 @@ apoc.date.fromISO8601('yyyy-MM-ddTHH:mm:ss.SSSZ') - return number representation apoc.date.parse('2012-12-23','ms\|s\|m\|h\|d','yyyy-MM-dd') - parse date string using the specified format into the specified time unit |label:function[] |label:apoc-core[] -|xref::overview/apoc.date/apoc.date.adoc[apoc.date.parseAsZonedDateTime icon:book[]] - -apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') - parse date string using the specified format to specified timezone -|label:function[] -|label:apoc-core[] |xref::overview/apoc.date/apoc.date.adoc[apoc.date.systemTimezone icon:book[]] apoc.date.systemTimezone() - returns the system timezone display name diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire-lite.csv deleted file mode 100644 index 3fa2efcd94..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.date.expire(node :: NODE?, time :: INTEGER?, timeUnit :: STRING?) :: VOID diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire.adoc deleted file mode 100644 index df0d6970ce..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.date/apoc.date.expire.adoc[apoc.date.expire icon:book[]] + - -`CALL apoc.date.expire(node,time,'time-unit')` - expire node at specified time by setting :TTL label and `ttl` property -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire.csv deleted file mode 100644 index 1785157b07..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expire.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.date.expire¦apoc.date.expire(node :: NODE?, time :: INTEGER?, timeUnit :: STRING?) :: VOID¦CALL apoc.date.expire(node,time,'time-unit') - expire node at specified time by setting :TTL label and `ttl` property diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn-lite.csv deleted file mode 100644 index 92e223466a..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.date.expireIn(node :: NODE?, timeDelta :: INTEGER?, timeUnit :: STRING?) :: VOID diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn.adoc deleted file mode 100644 index 7a2c75c1e0..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.date/apoc.date.expireIn.adoc[apoc.date.expireIn icon:book[]] + - -`CALL apoc.date.expireIn(node,time,'time-unit')` - expire node after specified length of time time by setting :TTL label and `ttl` property -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn.csv deleted file mode 100644 index 6c6dbcdf0b..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.expireIn.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.date.expireIn¦apoc.date.expireIn(node :: NODE?, timeDelta :: INTEGER?, timeUnit :: STRING?) :: VOID¦CALL apoc.date.expire.in(node,time,'time-unit') - expire node after specified length of time time by setting :TTL label and `ttl` property diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime-lite.csv deleted file mode 100644 index 1b18589f4c..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.date.parseAsZonedDateTime(time :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = UTC :: STRING?) :: (DATETIME?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime.adoc deleted file mode 100644 index 3428c665b0..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.date/apoc.date.parseAsZonedDateTime.adoc[apoc.date.parseAsZonedDateTime icon:book[]] + - -`apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset')` - parse date string using the specified format to specified timezone -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime.csv deleted file mode 100644 index 9f0f820272..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.date.parseAsZonedDateTime.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.date.parseAsZonedDateTime¦apoc.date.parseAsZonedDateTime(time :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = UTC :: STRING?) :: (DATETIME?)¦apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') parse date string using the specified format to specified timezone diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export-lite.csv deleted file mode 100644 index 0cf267cef0..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export-lite.csv +++ /dev/null @@ -1,5 +0,0 @@ -¦signature -¦apoc.export.cypherAll(file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) -¦apoc.export.cypherData(nodes :: LIST? OF NODE?, rels :: LIST? OF RELATIONSHIP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) -¦apoc.export.cypherGraph(graph :: MAP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) -¦apoc.export.cypherQuery(query :: STRING?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.csv deleted file mode 100644 index 123ef90dba..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.csv +++ /dev/null @@ -1,21 +0,0 @@ -¦Qualified Name¦Type¦Release -|xref::overview/apoc.export/apoc.export.adoc[apoc.export.cypherAll icon:book[]] - -apoc.export.cypherAll(file,config) - exports whole database incl. indexes as cypher statements to the provided file -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.export/apoc.export.adoc[apoc.export.cypherData icon:book[]] - -apoc.export.cypherData(nodes,rels,file,config) - exports given nodes and relationships incl. indexes as cypher statements to the provided file -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.export/apoc.export.adoc[apoc.export.cypherGraph icon:book[]] - -apoc.export.cypherGraph(graph,file,config) - exports given graph object incl. indexes as cypher statements to the provided file -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.export/apoc.export.adoc[apoc.export.cypherQuery icon:book[]] - -apoc.export.cypherQuery(query,file,config) - exports nodes and relationships from the cypher kernelTransaction incl. indexes as cypher statements to the provided file -|label:procedure[] -|label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll-lite.csv deleted file mode 100644 index e833b61b03..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.export.cypherAll(file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll.adoc deleted file mode 100644 index 4732bd6136..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.export/apoc.export.cypherAll.adoc[apoc.export.cypherAll icon:book[]] + - -`apoc.export.cypherAll(file,config)` - exports whole database incl. indexes as cypher statements to the provided file -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll.csv deleted file mode 100644 index d7120f4a62..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherAll.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.export.cypherAll¦apoc.export.cypherAll(file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)¦apoc.export.cypherAll(file,config) - exports whole database incl. indexes as cypher statements to the provided file diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData-lite.csv deleted file mode 100644 index b904a44dd7..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.export.cypherData(nodes :: LIST? OF NODE?, rels :: LIST? OF RELATIONSHIP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData.adoc deleted file mode 100644 index 41ed7cf505..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.export/apoc.export.cypherData.adoc[apoc.export.cypherData icon:book[]] + - -`apoc.export.cypherData(nodes,rels,file,config)` - exports given nodes and relationships incl. indexes as cypher statements to the provided file -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData.csv deleted file mode 100644 index 87776e4806..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherData.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.export.cypherData¦apoc.export.cypherData(nodes :: LIST? OF NODE?, rels :: LIST? OF RELATIONSHIP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)¦apoc.export.cypherData(nodes,rels,file,config) - exports given nodes and relationships incl. indexes as cypher statements to the provided file diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph-lite.csv deleted file mode 100644 index 0120a8705b..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.export.cypherGraph(graph :: MAP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph.adoc deleted file mode 100644 index 56ec560bb8..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.export/apoc.export.cypherGraph.adoc[apoc.export.cypherGraph icon:book[]] + - -`apoc.export.cypherGraph(graph,file,config)` - exports given graph object incl. indexes as cypher statements to the provided file -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph.csv deleted file mode 100644 index 5b3784f38f..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherGraph.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.export.cypherGraph¦apoc.export.cypherGraph(graph :: MAP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)¦apoc.export.cypherGraph(graph,file,config) - exports given graph object incl. indexes as cypher statements to the provided file diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery-lite.csv deleted file mode 100644 index 3f14aac8d3..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.export.cypherQuery(query :: STRING?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery.adoc deleted file mode 100644 index 2e885ec794..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.export/apoc.export.cypherQuery.adoc[apoc.export.cypherQuery icon:book[]] + - -`apoc.export.cypherQuery(query,file,config)` - exports nodes and relationships from the cypher kernelTransaction incl. indexes as cypher statements to the provided file -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery.csv deleted file mode 100644 index 2889909aa5..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.export.cypherQuery.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.export.cypherQuery¦apoc.export.cypherQuery(query :: STRING?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)¦apoc.export.cypherQuery(query,file,config) - exports nodes and relationships from the cypher kernelTransaction incl. indexes as cypher statements to the provided file diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams-lite.csv deleted file mode 100644 index 874153d6ef..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.load.jdbcParams(jdbc :: STRING?, sql :: STRING?, params :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams.adoc deleted file mode 100644 index d5a1d4a7d7..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.load/apoc.load.jdbcParams.adoc[apoc.load.jdbcParams icon:book[]] + - -`deprecated` - please use: apoc.load.jdbc('key or url','',[params]) YIELD row -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams.csv deleted file mode 100644 index 44fc21af1a..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.load.jdbcParams.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.load.jdbcParams¦apoc.load.jdbcParams(jdbc :: STRING?, sql :: STRING?, params :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?)¦deprecated - please use: apoc.load.jdbc('key or url','',[params]) YIELD row - load from relational database, from a sql statement with parameters diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.csv index c14d31fcec..2caef430fd 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.csv @@ -44,8 +44,3 @@ apoc.math.minInt() \| return the minimum value an int can have apoc.math.minLong() \| return the minimum value a long can have |label:function[] |label:apoc-core[] -|xref::overview/apoc.math/apoc.math.adoc[apoc.math.round icon:book[]] - -apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY]) -|label:function[] -|label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round-lite.csv deleted file mode 100644 index fff1f78881..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.math.round(value :: FLOAT?, precision = 0 :: INTEGER?, mode = HALF_UP :: STRING?) :: (FLOAT?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round.adoc deleted file mode 100644 index 6809f0bab6..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.math/apoc.math.round.adoc[apoc.math.round icon:book[]] + - -`apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY])` -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round.csv deleted file mode 100644 index b130bad8de..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.math.round.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.math.round¦apoc.math.round(value :: FLOAT?, precision = 0 :: INTEGER?, mode = HALF_UP :: STRING?) :: (FLOAT?)¦apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY]) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta-lite.csv index 9a86a18a8e..6bdff9dc9a 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta-lite.csv @@ -7,7 +7,3 @@ ¦apoc.meta.schema(config = {} :: MAP?) :: (value :: MAP?) ¦apoc.meta.stats() :: (labelCount :: INTEGER?, relTypeCount :: INTEGER?, propertyKeyCount :: INTEGER?, nodeCount :: INTEGER?, relCount :: INTEGER?, labels :: MAP?, relTypes :: MAP?, relTypesCount :: MAP?, stats :: MAP?) ¦apoc.meta.subGraph(config :: MAP?) :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?) -¦apoc.meta.isType(value :: ANY?, type :: STRING?) :: (BOOLEAN?) -¦apoc.meta.type(value :: ANY?) :: (STRING?) -¦apoc.meta.typeName(value :: ANY?) :: (STRING?) -¦apoc.meta.types(properties :: ANY?) :: (MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType-lite.csv deleted file mode 100644 index a707319120..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.meta.isType(value :: ANY?, type :: STRING?) :: (BOOLEAN?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType.adoc deleted file mode 100644 index 128fc43c28..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.meta/apoc.meta.isType.adoc[apoc.meta.isType icon:book[]] + - -`apoc.meta.isType(value,type)` - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType.csv deleted file mode 100644 index a68bd145be..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.isType.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.meta.isType¦apoc.meta.isType(value :: ANY?, type :: STRING?) :: (BOOLEAN?)¦apoc.meta.isType(value,type) - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type-lite.csv deleted file mode 100644 index ea7110fc32..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.meta.type(value :: ANY?) :: (STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type.adoc deleted file mode 100644 index c519667488..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.meta/apoc.meta.type.adoc[apoc.meta.type icon:book[]] + - -`apoc.meta.type(value)` - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type.csv deleted file mode 100644 index 154cccb306..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.type.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.meta.type¦apoc.meta.type(value :: ANY?) :: (STRING?)¦apoc.meta.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName-lite.csv deleted file mode 100644 index 2d2c941f3c..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.meta.typeName(value :: ANY?) :: (STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName.adoc deleted file mode 100644 index ecb4c8e902..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.meta/apoc.meta.typeName.adoc[apoc.meta.typeName icon:book[]] + - -`apoc.meta.typeName(value)` - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName.csv deleted file mode 100644 index 8948eb2461..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.typeName.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.meta.typeName¦apoc.meta.typeName(value :: ANY?) :: (STRING?)¦apoc.meta.typeName(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types-lite.csv deleted file mode 100644 index 80e4e96a60..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.meta.types(properties :: ANY?) :: (MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types.adoc deleted file mode 100644 index 39b3b474b0..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.meta/apoc.meta.types.adoc[apoc.meta.types icon:book[]] + - -`apoc.meta.types(node-relationship-map) ` - returns a map of keys to types -¦label:function[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types.csv deleted file mode 100644 index 96a83148f3..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.meta.types.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦function¦apoc.meta.types¦apoc.meta.types(properties :: ANY?) :: (MAP?)¦apoc.meta.types(node-relationship-map) - returns a map of keys to types diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb-lite.csv deleted file mode 100644 index 9bedd03bd2..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb-lite.csv +++ /dev/null @@ -1,8 +0,0 @@ -¦signature -¦apoc.mongodb.count(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?) -¦apoc.mongodb.delete(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?) -¦apoc.mongodb.find(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, project :: MAP?, sort :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) -¦apoc.mongodb.first(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = true :: BOOLEAN?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) -¦apoc.mongodb.get(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) -¦apoc.mongodb.insert(host :: STRING?, db :: STRING?, collection :: STRING?, documents :: LIST? OF MAP?) :: VOID -¦apoc.mongodb.update(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, update :: MAP?) :: (value :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count-lite.csv deleted file mode 100644 index a5cc93c9a5..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.mongodb.count(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count.adoc deleted file mode 100644 index c5e53dd34a..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.mongodb/apoc.mongodb.count.adoc[apoc.mongodb.count icon:book[]] + - -`apoc.mongodb.count(host-or-key,db,collection,query) yield value` - perform a find operation on mongodb collection -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count.csv deleted file mode 100644 index d640b3520b..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.count.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.mongodb.count¦apoc.mongodb.count(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?)¦apoc.mongodb.count(host-or-key,db,collection,query) yield value - perform a find operation on mongodb collection diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.csv deleted file mode 100644 index 8a471cb2a2..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.csv +++ /dev/null @@ -1,36 +0,0 @@ -¦Qualified Name¦Type¦Release -|xref::overview/apoc.mongodb/apoc.mongodb.adoc[apoc.mongodb.count icon:book[]] - -apoc.mongodb.count(host-or-key,db,collection,query) yield value - perform a find operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.adoc[apoc.mongodb.delete icon:book[]] - -apoc.mongodb.delete(host-or-key,db,collection,query) - delete the given documents from the mongodb collection and returns the number of affected documents -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.adoc[apoc.mongodb.find icon:book[]] - -apoc.mongodb.find(host-or-key,db,collection,query,projection,sort,[compatibleValues=false\|true],skip-or-null,limit-or-null,[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a find,project,sort operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.adoc[apoc.mongodb.first icon:book[]] - -apoc.mongodb.first(host-or-key,db,collection,query,[compatibleValues=false\|true],[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a first operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.adoc[apoc.mongodb.get icon:book[]] - -apoc.mongodb.get(host-or-key,db,collection,query,[compatibleValues=false\|true],skip-or-null,limit-or-null,[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a find operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.adoc[apoc.mongodb.insert icon:book[]] - -apoc.mongodb.insert(host-or-key,db,collection,documents) - inserts the given documents into the mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.adoc[apoc.mongodb.update icon:book[]] - -apoc.mongodb.update(host-or-key,db,collection,query,update) - updates the given documents from the mongodb collection and returns the number of affected documents -|label:procedure[] -|label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete-lite.csv deleted file mode 100644 index 3b27384787..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.mongodb.delete(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete.adoc deleted file mode 100644 index 3a57710f73..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.mongodb/apoc.mongodb.delete.adoc[apoc.mongodb.delete icon:book[]] + - -`apoc.mongodb.delete(host-or-key,db,collection,query)` - delete the given documents from the mongodb collection and returns the number of affected documents -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete.csv deleted file mode 100644 index 1aa628580e..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.delete.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.mongodb.delete¦apoc.mongodb.delete(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?)¦apoc.mongodb.delete(host-or-key,db,collection,query) - delete the given documents from the mongodb collection and returns the number of affected documents diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find-lite.csv deleted file mode 100644 index 9b60ccc00f..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.mongodb.find(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, project :: MAP?, sort :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find.adoc deleted file mode 100644 index 1206290397..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.mongodb/apoc.mongodb.find.adoc[apoc.mongodb.find icon:book[]] + - -`apoc.mongodb.find(host-or-key,db,collection,query,projection,sort,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value` - perform a find,project,sort operation on mongodb collection -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find.csv deleted file mode 100644 index 5dbe74b3dc..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.find.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.mongodb.find¦apoc.mongodb.find(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, project :: MAP?, sort :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?)¦apoc.mongodb.find(host-or-key,db,collection,query,projection,sort,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a find,project,sort operation on mongodb collection diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first-lite.csv deleted file mode 100644 index c59355e98e..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.mongodb.first(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = true :: BOOLEAN?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first.adoc deleted file mode 100644 index a05901a431..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.mongodb/apoc.mongodb.first.adoc[apoc.mongodb.first icon:book[]] + - -`apoc.mongodb.first(host-or-key,db,collection,query,[compatibleValues=false|true],[extractReferences=false|true],[objectIdAsMap=true|false]) yield value` - perform a first operation on mongodb collection -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first.csv deleted file mode 100644 index 93c6c96fc0..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.first.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.mongodb.first¦apoc.mongodb.first(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = true :: BOOLEAN?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?)¦apoc.mongodb.first(host-or-key,db,collection,query,[compatibleValues=false|true],[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a first operation on mongodb collection diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.get-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.get-lite.csv index 47e52615fe..f25646d3ed 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.get-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.get-lite.csv @@ -1,2 +1,2 @@ ¦signature -¦apoc.mongodb.get(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) +¦apoc.mongodb.get.byObjectId(host :: STRING?, db :: STRING?, collection :: STRING?, objectIdValue :: STRING?, config = {} :: MAP?) :: (value :: MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.get.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.get.adoc deleted file mode 100644 index 52ebd47a5c..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.get.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.mongodb/apoc.mongodb.get.adoc[apoc.mongodb.get icon:book[]] + - -`apoc.mongodb.get(host-or-key,db,collection,query,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value` - perform a find operation on mongodb collection -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert-lite.csv deleted file mode 100644 index 2950768232..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.mongodb.insert(host :: STRING?, db :: STRING?, collection :: STRING?, documents :: LIST? OF MAP?) :: VOID diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert.adoc deleted file mode 100644 index a5cf5253ca..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.mongodb/apoc.mongodb.insert.adoc[apoc.mongodb.insert icon:book[]] + - -`apoc.mongodb.insert(host-or-key,db,collection,documents)` - inserts the given documents into the mongodb collection -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert.csv deleted file mode 100644 index 4d87039594..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.insert.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.mongodb.insert¦apoc.mongodb.insert(host :: STRING?, db :: STRING?, collection :: STRING?, documents :: LIST? OF MAP?) :: VOID¦apoc.mongodb.insert(host-or-key,db,collection,documents) - inserts the given documents into the mongodb collection diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update-lite.csv deleted file mode 100644 index 89c2404bea..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.mongodb.update(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, update :: MAP?) :: (value :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update.adoc deleted file mode 100644 index 162b4f945d..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.mongodb/apoc.mongodb.update.adoc[apoc.mongodb.update icon:book[]] + - -`apoc.mongodb.update(host-or-key,db,collection,query,update)` - updates the given documents from the mongodb collection and returns the number of affected documents -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update.csv deleted file mode 100644 index aa6fdbd136..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.mongodb.update.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.mongodb.update¦apoc.mongodb.update(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, update :: MAP?) :: (value :: INTEGER?)¦apoc.mongodb.update(host-or-key,db,collection,query,update) - updates the given documents from the mongodb collection and returns the number of affected documents diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic-lite.csv index a731f424c4..102529e403 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic-lite.csv @@ -5,7 +5,5 @@ ¦apoc.periodic.iterate(cypherIterate :: STRING?, cypherAction :: STRING?, config :: MAP?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?, updateStatistics :: MAP?) ¦apoc.periodic.list() :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?) ¦apoc.periodic.repeat(name :: STRING?, statement :: STRING?, rate :: INTEGER?, config = {} :: MAP?) :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?) -¦apoc.periodic.rock_n_roll(cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?, updateStatistics :: MAP?) -¦apoc.periodic.rock_n_roll_while(cypherLoop :: STRING?, cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (loop :: ANY?, batches :: INTEGER?, total :: INTEGER?) ¦apoc.periodic.submit(name :: STRING?, statement :: STRING?, params = {} :: MAP?) :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?) ¦apoc.periodic.truncate(config = {} :: MAP?) :: VOID diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.csv index e6673aa30e..2d9ed7db6c 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.csv @@ -29,16 +29,6 @@ apoc.periodic.list - list all jobs apoc.periodic.repeat('name',statement,repeat-rate-in-seconds, config) submit a repeatedly-called background statement. Fourth parameter 'config' is optional and can contain 'params' entry for nested statement. |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.periodic/apoc.periodic.adoc[apoc.periodic.rock_n_roll icon:book[]] - -apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.periodic/apoc.periodic.adoc[apoc.periodic.rock_n_roll_while icon:book[]] - -apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.periodic/apoc.periodic.adoc[apoc.periodic.submit icon:book[]] apoc.periodic.submit('name',statement,params) - submit a one-off background statement; parameter 'params' is optional and can contain query parameters for Cypher statement diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll-lite.csv deleted file mode 100644 index 9030caa09d..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.periodic.rock_n_roll(cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?, updateStatistics :: MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll.adoc deleted file mode 100644 index 8ecccd2301..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.periodic/apoc.periodic.rock_n_roll.adoc[apoc.periodic.rock_n_roll icon:book[]] + - -`apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total` - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll.csv deleted file mode 100644 index 4f8125041c..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.periodic.rock_n_roll¦apoc.periodic.rock_n_roll(cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?)¦apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while-lite.csv deleted file mode 100644 index 77adc1373e..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.periodic.rock_n_roll_while(cypherLoop :: STRING?, cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (loop :: ANY?, batches :: INTEGER?, total :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while.adoc deleted file mode 100644 index 8ae782ba0b..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.periodic/apoc.periodic.rock_n_roll_while.adoc[apoc.periodic.rock_n_roll_while icon:book[]] + - -`apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total` - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows -¦label:procedure[] -¦label:apoc-full[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while.csv deleted file mode 100644 index caf8e7e41b..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.periodic.rock_n_roll_while.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.periodic.rock_n_roll_while¦apoc.periodic.rock_n_roll_while(cypherLoop :: STRING?, cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (loop :: ANY?, batches :: INTEGER?, total :: INTEGER?)¦apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships-lite.csv deleted file mode 100644 index f630f6eb9f..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.refactor.cloneNodesWithRelationships(nodes :: LIST? OF NODE?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships.adoc deleted file mode 100644 index 26b31b5cdb..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.refactor/apoc.refactor.cloneNodesWithRelationships.adoc[apoc.refactor.cloneNodesWithRelationships icon:book[]] + - -`apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) clone nodes with their labels, properties and relationships` -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships.csv deleted file mode 100644 index de8902e3eb..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.cloneNodesWithRelationships.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.refactor.cloneNodesWithRelationships¦apoc.refactor.cloneNodesWithRelationships(nodes :: LIST? OF NODE?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)¦apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) clone nodes with their labels, properties and relationships diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.csv index 85dd758bbe..b27f33538b 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.refactor.csv @@ -9,11 +9,6 @@ apoc.refactor.categorize(sourceKey, type, outgoing, label, targetKey, copiedKeys apoc.refactor.cloneNodes([node1,node2,...]) clone nodes with their labels and properties |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.refactor/apoc.refactor.adoc[apoc.refactor.cloneNodesWithRelationships icon:book[]] - -apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) clone nodes with their labels, properties and relationships -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.refactor/apoc.refactor.adoc[apoc.refactor.cloneSubgraph icon:book[]] apoc.refactor.cloneSubgraph([node1,node2,...], [rel1,rel2,...]:[], {standinNodes:[], skipProperties:[]}) YIELD input, output, error \| clone nodes with their labels and properties (optionally skipping any properties in the skipProperties list via the config map), and clone the given relationships (will exist between cloned nodes only). If no relationships are provided, all relationships between the given nodes will be cloned. Relationships can be optionally redirected according to standinNodes node pairings (this is a list of list-pairs of nodes), so given a node in the original subgraph (first of the pair), an existing node (second of the pair) can act as a standin for it within the cloned subgraph. Cloned relationships will be redirected to the standin. diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup-lite.csv deleted file mode 100644 index d2803e0a93..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.csv deleted file mode 100644 index 8e520abad7..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.csv +++ /dev/null @@ -1,6 +0,0 @@ -¦Qualified Name¦Type¦Release -|xref::overview/apoc.warmup/apoc.warmup.adoc[apoc.warmup.run icon:book[]] - -apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time -|label:procedure[] -|label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run-lite.csv deleted file mode 100644 index d2803e0a93..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.adoc deleted file mode 100644 index 0a41219ccd..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.warmup/apoc.warmup.run.adoc[apoc.warmup.run icon:book[]] + - -`apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false)` - quickly loads all nodes and rels into memory by skipping one page at a time -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.csv deleted file mode 100644 index 342b56bb20..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.warmup.run¦apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?)¦apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml-lite.csv index 90853a7a91..43f3c81781 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml-lite.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml-lite.csv @@ -1,3 +1,2 @@ ¦signature -¦apoc.xml.import(url :: STRING?, config = {} :: MAP?) :: (node :: NODE?) ¦apoc.xml.parse(data :: STRING?, path = / :: STRING?, config = {} :: MAP?, simple = false :: BOOLEAN?) :: (MAP?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.csv index 103f4528d4..fd1f9840db 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.csv @@ -1,9 +1,4 @@ ¦Qualified Name¦Type¦Release -|xref::overview/apoc.xml/apoc.xml.adoc[apoc.xml.import icon:book[]] - -Deprecated by apoc.import.xml -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.xml/apoc.xml.adoc[apoc.xml.parse icon:book[]] RETURN apoc.xml.parse(, , config, false) AS value diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import-lite.csv deleted file mode 100644 index 4b42c3f443..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import-lite.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦signature -¦apoc.xml.import(url :: STRING?, config = {} :: MAP?) :: (node :: NODE?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import.adoc deleted file mode 100644 index 3380efb6d8..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import.adoc +++ /dev/null @@ -1,5 +0,0 @@ -¦xref::overview/apoc.xml/apoc.xml.import.adoc[apoc.xml.import icon:book[]] + - -`Deprecated by apoc.import.xml` -¦label:procedure[] -¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import.csv deleted file mode 100644 index eb6c94ce8c..0000000000 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.xml.import.csv +++ /dev/null @@ -1,2 +0,0 @@ -¦type¦qualified name¦signature¦description -¦procedure¦apoc.xml.import¦apoc.xml.import(url :: STRING?, config = {} :: MAP?) :: (node :: NODE?)¦Deprecated by apoc.import.xml diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/documentation.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/documentation.csv index 869300412c..da6b9d229b 100644 --- a/docs/asciidoc/modules/ROOT/examples/generated-documentation/documentation.csv +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/documentation.csv @@ -10,7 +10,6 @@ ¦procedure¦apoc.bolt.load¦apoc.bolt.load(url :: STRING?, kernelTransaction :: STRING?, params = {} :: MAP?, config = {} :: MAP?) :: (row :: MAP?)¦apoc.bolt.load(url-or-key, kernelTransaction, params, config) - access to other databases via bolt for read¦false¦xref::database-integration/bolt-neo4j.adoc ¦procedure¦apoc.bolt.load.fromLocal¦apoc.bolt.load.fromLocal(url :: STRING?, localStatement :: STRING?, remoteStatement :: STRING?, config = {} :: MAP?) :: (row :: MAP?)¦¦false¦xref::database-integration/bolt-neo4j.adoc ¦procedure¦apoc.case¦apoc.case(conditionals :: LIST? OF ANY?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)¦apoc.case([condition, query, condition, query, ...], elseQuery:'', params:{}) yield value - given a list of conditional / read-only query pairs, executes the query associated with the first conditional evaluating to true (or the else query if none are true) with the given parameters¦true¦xref::cypher-execution/conditionals.adoc -¦procedure¦apoc.cluster.graph¦apoc.cluster.graph() :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?)¦¦false¦ ¦procedure¦apoc.coll.elements¦apoc.coll.elements(values :: LIST? OF ANY?, limit = -1 :: INTEGER?, offset = 0 :: INTEGER?) :: (_1 :: ANY?, _2 :: ANY?, _3 :: ANY?, _4 :: ANY?, _5 :: ANY?, _6 :: ANY?, _7 :: ANY?, _8 :: ANY?, _9 :: ANY?, _10 :: ANY?, _1s :: STRING?, _2s :: STRING?, _3s :: STRING?, _4s :: STRING?, _5s :: STRING?, _6s :: STRING?, _7s :: STRING?, _8s :: STRING?, _9s :: STRING?, _10s :: STRING?, _1i :: INTEGER?, _2i :: INTEGER?, _3i :: INTEGER?, _4i :: INTEGER?, _5i :: INTEGER?, _6i :: INTEGER?, _7i :: INTEGER?, _8i :: INTEGER?, _9i :: INTEGER?, _10i :: INTEGER?, _1f :: FLOAT?, _2f :: FLOAT?, _3f :: FLOAT?, _4f :: FLOAT?, _5f :: FLOAT?, _6f :: FLOAT?, _7f :: FLOAT?, _8f :: FLOAT?, _9f :: FLOAT?, _10f :: FLOAT?, _1b :: BOOLEAN?, _2b :: BOOLEAN?, _3b :: BOOLEAN?, _4b :: BOOLEAN?, _5b :: BOOLEAN?, _6b :: BOOLEAN?, _7b :: BOOLEAN?, _8b :: BOOLEAN?, _9b :: BOOLEAN?, _10b :: BOOLEAN?, _1l :: LIST? OF ANY?, _2l :: LIST? OF ANY?, _3l :: LIST? OF ANY?, _4l :: LIST? OF ANY?, _5l :: LIST? OF ANY?, _6l :: LIST? OF ANY?, _7l :: LIST? OF ANY?, _8l :: LIST? OF ANY?, _9l :: LIST? OF ANY?, _10l :: LIST? OF ANY?, _1m :: MAP?, _2m :: MAP?, _3m :: MAP?, _4m :: MAP?, _5m :: MAP?, _6m :: MAP?, _7m :: MAP?, _8m :: MAP?, _9m :: MAP?, _10m :: MAP?, _1n :: NODE?, _2n :: NODE?, _3n :: NODE?, _4n :: NODE?, _5n :: NODE?, _6n :: NODE?, _7n :: NODE?, _8n :: NODE?, _9n :: NODE?, _10n :: NODE?, _1r :: RELATIONSHIP?, _2r :: RELATIONSHIP?, _3r :: RELATIONSHIP?, _4r :: RELATIONSHIP?, _5r :: RELATIONSHIP?, _6r :: RELATIONSHIP?, _7r :: RELATIONSHIP?, _8r :: RELATIONSHIP?, _9r :: RELATIONSHIP?, _10r :: RELATIONSHIP?, _1p :: PATH?, _2p :: PATH?, _3p :: PATH?, _4p :: PATH?, _5p :: PATH?, _6p :: PATH?, _7p :: PATH?, _8p :: PATH?, _9p :: PATH?, _10p :: PATH?, elements :: INTEGER?)¦apoc.coll.elements(list,limit,offset) yield _1,_2,..,_10,_1s,_2i,_3f,_4m,_5l,_6n,_7r,_8p - deconstruct subset of mixed list into identifiers of the correct type¦true¦ ¦procedure¦apoc.coll.partition¦apoc.coll.partition(values :: LIST? OF ANY?, batchSize :: INTEGER?) :: (value :: LIST? OF ANY?)¦apoc.coll.partition(list,batchSize)¦true¦ ¦procedure¦apoc.coll.split¦apoc.coll.split(values :: LIST? OF ANY?, value :: ANY?) :: (value :: LIST? OF ANY?)¦apoc.coll.split(list,value) | splits collection on given values rows of lists, value itself will not be part of resulting lists¦true¦ @@ -45,12 +44,8 @@ ¦procedure¦apoc.create.uuids¦apoc.create.uuids(count :: INTEGER?) :: (row :: INTEGER?, uuid :: STRING?)¦apoc.create.uuids(count) yield uuid - creates 'count' UUIDs ¦true¦ ¦procedure¦apoc.create.vNode¦apoc.create.vNode(label :: LIST? OF STRING?, props :: MAP?) :: (node :: NODE?)¦apoc.create.vNode(['Label'], {key:value,...}) returns a virtual node¦true¦xref::virtual/virtual-nodes-rels.adoc ¦procedure¦apoc.create.vNodes¦apoc.create.vNodes(label :: LIST? OF STRING?, props :: LIST? OF MAP?) :: (node :: NODE?)¦apoc.create.vNodes(['Label'], [{key:value,...}]) returns virtual nodes¦true¦xref::virtual/virtual-nodes-rels.adoc -¦procedure¦apoc.create.vPattern¦apoc.create.vPattern(from :: MAP?, relType :: STRING?, props :: MAP?, to :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?)¦apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,...}, {_labels:['LabelB'],key:value}) returns a virtual pattern¦true¦xref::virtual/virtual-nodes-rels.adoc -¦procedure¦apoc.create.vPatternFull¦apoc.create.vPatternFull(labelsN :: LIST? OF STRING?, n :: MAP?, relType :: STRING?, props :: MAP?, labelsM :: LIST? OF STRING?, m :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?)¦apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual pattern¦true¦xref::virtual/virtual-nodes-rels.adoc ¦procedure¦apoc.create.vRelationship¦apoc.create.vRelationship(from :: NODE?, relType :: STRING?, props :: MAP?, to :: NODE?) :: (rel :: RELATIONSHIP?)¦apoc.create.vRelationship(nodeFrom,'KNOWS',{key:value,...}, nodeTo) returns a virtual relationship¦true¦xref::virtual/virtual-nodes-rels.adoc ¦procedure¦apoc.create.virtualPath¦apoc.create.virtualPath(labelsN :: LIST? OF STRING?, n :: MAP?, relType :: STRING?, props :: MAP?, labelsM :: LIST? OF STRING?, m :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?)¦apoc.create.virtualPath(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual path of nodes joined by a relationship and the associated properties¦true¦xref::virtual/virtual-nodes-rels.adoc -¦procedure¦apoc.custom.asFunction¦apoc.custom.asFunction(name :: STRING?, statement :: STRING?, outputs = :: STRING?, inputs = null :: LIST? OF LIST? OF STRING?, forceSingle = false :: BOOLEAN?, description = :: STRING?) :: VOID¦apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description) - register a custom cypher function¦false¦xref::cypher-execution/cypher-based-procedures-functions.adoc -¦procedure¦apoc.custom.asProcedure¦apoc.custom.asProcedure(name :: STRING?, statement :: STRING?, mode = read :: STRING?, outputs = null :: LIST? OF LIST? OF STRING?, inputs = null :: LIST? OF LIST? OF STRING?, description = :: STRING?) :: VOID¦apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description) - register a custom cypher procedure¦false¦xref::cypher-execution/cypher-based-procedures-functions.adoc ¦procedure¦apoc.custom.declareFunction¦apoc.custom.declareFunction(signature :: STRING?, statement :: STRING?, forceSingle = false :: BOOLEAN?, description = :: STRING?) :: VOID¦apoc.custom.declareFunction(signature, statement, forceSingle, description) - register a custom cypher function¦false¦xref::cypher-execution/cypher-based-procedures-functions.adoc ¦procedure¦apoc.custom.declareProcedure¦apoc.custom.declareProcedure(signature :: STRING?, statement :: STRING?, mode = read :: STRING?, description = :: STRING?) :: VOID¦apoc.custom.declareProcedure(signature, statement, mode, description) - register a custom cypher procedure¦false¦xref::cypher-execution/cypher-based-procedures-functions.adoc ¦procedure¦apoc.custom.list¦apoc.custom.list() :: (type :: STRING?, name :: STRING?, description :: STRING?, mode :: STRING?, statement :: STRING?, inputs :: LIST? OF LIST? OF STRING?, outputs :: ANY?, forceSingle :: BOOLEAN?)¦apoc.custom.list() - provide a list of custom procedures/function registered¦false¦xref::cypher-execution/cypher-based-procedures-functions.adoc @@ -70,8 +65,6 @@ ¦procedure¦apoc.cypher.runSchemaFiles¦apoc.cypher.runSchemaFiles(file :: LIST? OF STRING?, config = {} :: MAP?) :: (row :: INTEGER?, result :: MAP?)¦apoc.cypher.runSchemaFiles([files or urls],{statistics:true,timeout:10}) - allows only schema operations, runs each schema statement in the files, all semicolon separated¦false¦xref::cypher-execution/index.adoc ¦procedure¦apoc.cypher.runTimeboxed¦apoc.cypher.runTimeboxed(cypher :: STRING?, params :: MAP?, timeout :: INTEGER?) :: (value :: MAP?)¦apoc.cypher.runTimeboxed('cypherStatement',\{params}, timeout) - abort kernelTransaction after timeout ms if not finished¦true¦xref::cypher-execution/index.adoc ¦procedure¦apoc.cypher.runWrite¦apoc.cypher.runWrite(cypher :: STRING?, params :: MAP?) :: (value :: MAP?)¦apoc.cypher.runWrite(statement, params) yield value - alias for apoc.cypher.doIt¦true¦xref::cypher-execution/index.adoc -¦procedure¦apoc.date.expire¦apoc.date.expire(node :: NODE?, time :: INTEGER?, timeUnit :: STRING?) :: VOID¦CALL apoc.date.expire(node,time,'time-unit') - expire node at specified time by setting :TTL label and `ttl` property¦false¦ -¦procedure¦apoc.date.expireIn¦apoc.date.expireIn(node :: NODE?, timeDelta :: INTEGER?, timeUnit :: STRING?) :: VOID¦CALL apoc.date.expireIn(node,time,'time-unit') - expire node after specified length of time time by setting :TTL label and `ttl` property¦false¦ ¦procedure¦apoc.do.case¦apoc.do.case(conditionals :: LIST? OF ANY?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)¦apoc.do.case([condition, query, condition, query, ...], elseQuery:'', params:{}) yield value - given a list of conditional / writing query pairs, executes the query associated with the first conditional evaluating to true (or the else query if none are true) with the given parameters¦true¦xref::cypher-execution/conditionals.adoc ¦procedure¦apoc.do.when¦apoc.do.when(condition :: BOOLEAN?, ifQuery :: STRING?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)¦apoc.do.when(condition, ifQuery, elseQuery:'', params:{}) yield value - based on the conditional, executes writing ifQuery or elseQuery with the given parameters¦true¦xref::cypher-execution/conditionals.adoc ¦procedure¦apoc.es.get¦apoc.es.get(host :: STRING?, index :: STRING?, type :: STRING?, id :: STRING?, query :: ANY?, payload :: ANY?) :: (value :: MAP?)¦apoc.es.get(host-or-port,index-or-null,type-or-null,id-or-null,query-or-null,payload-or-null) yield value - perform a GET operation on elastic search¦false¦xref::database-integration/elasticsearch.adoc @@ -140,7 +133,6 @@ ¦procedure¦apoc.load.driver¦apoc.load.driver(driverClass :: STRING?) :: VOID¦apoc.load.driver('org.apache.derby.jdbc.EmbeddedDriver') register JDBC driver of source database¦false¦ ¦procedure¦apoc.load.html¦apoc.load.html(url :: STRING?, query = {} :: MAP?, config = {} :: MAP?) :: (value :: MAP?)¦apoc.load.html('url',{name: jquery, name2: jquery}, config) YIELD value - Load Html page and return the result as a Map¦false¦ ¦procedure¦apoc.load.jdbc¦apoc.load.jdbc(jdbc :: STRING?, tableOrSql :: STRING?, params = [] :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?)¦apoc.load.jdbc('key or url','table or statement', params, config) YIELD row - load from relational database, from a full table or a sql statement¦false¦xref::database-integration/load-jdbc.adoc -¦procedure¦apoc.load.jdbcParams¦apoc.load.jdbcParams(jdbc :: STRING?, sql :: STRING?, params :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?)¦deprecated - please use: apoc.load.jdbc('key or url','',[params]) YIELD row - load from relational database, from a sql statement with parameters¦false¦xref::database-integration/load-jdbc.adoc ¦procedure¦apoc.load.jdbcUpdate¦apoc.load.jdbcUpdate(jdbc :: STRING?, query :: STRING?, params = [] :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?)¦apoc.load.jdbcUpdate('key or url','statement',[params],config) YIELD row - update relational database, from a SQL statement with optional parameters¦false¦xref::database-integration/load-jdbc.adoc ¦procedure¦apoc.load.json¦apoc.load.json(url :: STRING?, path = :: STRING?, config = {} :: MAP?) :: (value :: MAP?)¦apoc.load.json('url',path, config) YIELD value - import JSON as stream of values if the JSON was an array or a single value if it was a map¦true¦xref::import/load-json.adoc ¦procedure¦apoc.load.jsonArray¦apoc.load.jsonArray(url :: STRING?, path = :: STRING?) :: (value :: ANY?)¦apoc.load.jsonArray('url') YIELD value - load array from JSON URL (e.g. web-api) to import JSON as stream of values¦true¦xref::import/load-json.adoc @@ -185,14 +177,7 @@ ¦procedure¦apoc.mongo.find¦apoc.mongo.find(uri :: STRING?, query = null :: ANY?, config = {} :: MAP?) :: (value :: MAP?)¦apoc.mongo.find(uri, query, $config) yield value - perform a find operation on mongodb collection¦false¦xref::database-integration/mongo.adoc ¦procedure¦apoc.mongo.insert¦apoc.mongo.insert(uri :: STRING?, documents :: LIST? OF ANY?, config = {} :: MAP?) :: VOID¦apoc.mongo.insert(uri, documents, $config) yield value - inserts the given documents into the mongodb collection¦false¦xref::database-integration/mongo.adoc ¦procedure¦apoc.mongo.update¦apoc.mongo.update(uri :: STRING?, query :: ANY?, update :: ANY?, config = {} :: MAP?) :: (value :: INTEGER?)¦apoc.mongo.update(uri, query, update, $config) - updates the given documents from the mongodb collection and returns the number of affected documents¦false¦xref::database-integration/mongo.adoc -¦procedure¦apoc.mongodb.count¦apoc.mongodb.count(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?)¦apoc.mongodb.count(host-or-key,db,collection,query) yield value - perform a find operation on mongodb collection¦false¦xref::database-integration/mongodb.adoc -¦procedure¦apoc.mongodb.delete¦apoc.mongodb.delete(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?)¦apoc.mongodb.delete(host-or-key,db,collection,query) - delete the given documents from the mongodb collection and returns the number of affected documents¦false¦xref::database-integration/mongodb.adoc -¦procedure¦apoc.mongodb.find¦apoc.mongodb.find(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, project :: MAP?, sort :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?)¦apoc.mongodb.find(host-or-key,db,collection,query,projection,sort,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a find,project,sort operation on mongodb collection¦false¦xref::database-integration/mongodb.adoc -¦procedure¦apoc.mongodb.first¦apoc.mongodb.first(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = true :: BOOLEAN?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?)¦apoc.mongodb.first(host-or-key,db,collection,query,[compatibleValues=false|true],[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a first operation on mongodb collection¦false¦xref::database-integration/mongodb.adoc -¦procedure¦apoc.mongodb.get¦apoc.mongodb.get(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?)¦apoc.mongodb.get(host-or-key,db,collection,query,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a find operation on mongodb collection¦false¦xref::database-integration/mongodb.adoc -¦procedure¦apoc.mongodb.get.byObjectId¦apoc.mongodb.get.byObjectId(host :: STRING?, db :: STRING?, collection :: STRING?, objectIdValue :: STRING?, config = {} :: MAP?) :: (value :: MAP?)¦apoc.mongodb.get.byObjectId(hostOrKey, db, collection, objectIdValue, config(default:{})) - get the document by Object id value¦true¦xref::database-integration/mongodb.adoc -¦procedure¦apoc.mongodb.insert¦apoc.mongodb.insert(host :: STRING?, db :: STRING?, collection :: STRING?, documents :: LIST? OF MAP?) :: VOID¦apoc.mongodb.insert(host-or-key,db,collection,documents) - inserts the given documents into the mongodb collection¦false¦xref::database-integration/mongodb.adoc -¦procedure¦apoc.mongodb.update¦apoc.mongodb.update(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, update :: MAP?) :: (value :: INTEGER?)¦apoc.mongodb.update(host-or-key,db,collection,query,update) - updates the given documents from the mongodb collection and returns the number of affected documents¦false¦xref::database-integration/mongodb.adoc +¦procedure¦apoc.mongodb.get.byObjectId¦apoc.mongodb.get.byObjectId(host :: STRING?, db :: STRING?, collection :: STRING?, objectIdValue :: STRING?, config = {} :: MAP?) :: (value :: MAP?)¦apoc.mongodb.get.byObjectId(hostOrKey, db, collection, objectIdValue, config(default:{})) - get the document by Object id value¦false¦xref::database-integration/mongodb.adoc ¦procedure¦apoc.monitor.ids¦apoc.monitor.ids() :: (nodeIds :: INTEGER?, relIds :: INTEGER?, propIds :: INTEGER?, relTypeIds :: INTEGER?)¦apoc.monitor.ids() returns the object ids in use for this neo4j instance¦false¦xref::database-introspection/monitoring.adoc ¦procedure¦apoc.monitor.kernel¦apoc.monitor.kernel() :: (readOnly :: BOOLEAN?, kernelVersion :: STRING?, storeId :: STRING?, kernelStartTime :: STRING?, databaseName :: STRING?, storeLogVersion :: INTEGER?, storeCreationDate :: STRING?)¦apoc.monitor.kernel() returns informations about the neo4j kernel¦false¦xref::database-introspection/monitoring.adoc ¦procedure¦apoc.monitor.store¦apoc.monitor.store() :: (logSize :: INTEGER?, stringStoreSize :: INTEGER?, arrayStoreSize :: INTEGER?, relStoreSize :: INTEGER?, propStoreSize :: INTEGER?, totalStoreSize :: INTEGER?, nodeStoreSize :: INTEGER?)¦apoc.monitor.store() returns informations about the sizes of the different parts of the neo4j graph store¦false¦xref::database-introspection/monitoring.adoc @@ -236,13 +221,10 @@ ¦procedure¦apoc.periodic.iterate¦apoc.periodic.iterate(cypherIterate :: STRING?, cypherAction :: STRING?, config :: MAP?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?, updateStatistics :: MAP?)¦apoc.periodic.iterate('statement returning items', 'statement per item', {batchSize:1000,iterateList:true,parallel:false,params:{},concurrency:50,retries:0}) YIELD batches, total - run the second statement for each item returned by the first statement. Returns number of batches and total processed rows¦true¦ ¦procedure¦apoc.periodic.list¦apoc.periodic.list() :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?)¦apoc.periodic.list - list all jobs¦true¦ ¦procedure¦apoc.periodic.repeat¦apoc.periodic.repeat(name :: STRING?, statement :: STRING?, rate :: INTEGER?, config = {} :: MAP?) :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?)¦apoc.periodic.repeat('name',statement,repeat-rate-in-seconds, config) submit a repeatedly-called background statement. Fourth parameter 'config' is optional and can contain 'params' entry for nested statement.¦true¦ -¦procedure¦apoc.periodic.rock_n_roll¦apoc.periodic.rock_n_roll(cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?, updateStatistics :: MAP?)¦apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows¦false¦xref::graph-updates/periodic-execution.adoc#periodic-rock-n-roll -¦procedure¦apoc.periodic.rock_n_roll_while¦apoc.periodic.rock_n_roll_while(cypherLoop :: STRING?, cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (loop :: ANY?, batches :: INTEGER?, total :: INTEGER?)¦apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows¦false¦ ¦procedure¦apoc.periodic.submit¦apoc.periodic.submit(name :: STRING?, statement :: STRING?, params = {} :: MAP?) :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?)¦apoc.periodic.submit('name',statement,params) - submit a one-off background statement; parameter 'params' is optional and can contain query parameters for Cypher statement¦true¦ ¦procedure¦apoc.periodic.truncate¦apoc.periodic.truncate(config = {} :: MAP?) :: VOID¦apoc.periodic.truncate(\{config}) - removes all entities (and optionally indexes and constraints) from db using the apoc.periodic.iterate under the hood¦true¦ ¦procedure¦apoc.refactor.categorize¦apoc.refactor.categorize(sourceKey :: STRING?, type :: STRING?, outgoing :: BOOLEAN?, label :: STRING?, targetKey :: STRING?, copiedKeys :: LIST? OF STRING?, batchSize :: INTEGER?) :: VOID¦apoc.refactor.categorize(sourceKey, type, outgoing, label, targetKey, copiedKeys, batchSize) turn each unique propertyKey into a category node and connect to it¦true¦ ¦procedure¦apoc.refactor.cloneNodes¦apoc.refactor.cloneNodes(nodes :: LIST? OF NODE?, withRelationships = false :: BOOLEAN?, skipProperties = [] :: LIST? OF STRING?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)¦apoc.refactor.cloneNodes([node1,node2,...]) clone nodes with their labels and properties¦true¦ -¦procedure¦apoc.refactor.cloneNodesWithRelationships¦apoc.refactor.cloneNodesWithRelationships(nodes :: LIST? OF NODE?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)¦apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) clone nodes with their labels, properties and relationships¦true¦xref::graph-updates/graph-refactoring/clone-nodes.adoc ¦procedure¦apoc.refactor.cloneSubgraph¦apoc.refactor.cloneSubgraph(nodes :: LIST? OF NODE?, rels = [] :: LIST? OF RELATIONSHIP?, config = {} :: MAP?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)¦apoc.refactor.cloneSubgraph([node1,node2,...], [rel1,rel2,...]:[], {standinNodes:[], skipProperties:[]}) YIELD input, output, error | clone nodes with their labels and properties (optionally skipping any properties in the skipProperties list via the config map), and clone the given relationships (will exist between cloned nodes only). If no relationships are provided, all relationships between the given nodes will be cloned. Relationships can be optionally redirected according to standinNodes node pairings (this is a list of list-pairs of nodes), so given a node in the original subgraph (first of the pair), an existing node (second of the pair) can act as a standin for it within the cloned subgraph. Cloned relationships will be redirected to the standin.¦true¦ ¦procedure¦apoc.refactor.cloneSubgraphFromPaths¦apoc.refactor.cloneSubgraphFromPaths(paths :: LIST? OF PATH?, config = {} :: MAP?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)¦apoc.refactor.cloneSubgraphFromPaths([path1, path2, ...], {standinNodes:[], skipProperties:[]}) YIELD input, output, error | from the subgraph formed from the given paths, clone nodes with their labels and properties (optionally skipping any properties in the skipProperties list via the config map), and clone the relationships (will exist between cloned nodes only). Relationships can be optionally redirected according to standinNodes node pairings (this is a list of list-pairs of nodes), so given a node in the original subgraph (first of the pair), an existing node (second of the pair) can act as a standin for it within the cloned subgraph. Cloned relationships will be redirected to the standin.¦true¦ ¦procedure¦apoc.refactor.collapseNode¦apoc.refactor.collapseNode(nodes :: ANY?, type :: STRING?) :: (input :: INTEGER?, output :: RELATIONSHIP?, error :: STRING?)¦apoc.refactor.collapseNode([node1,node2],'TYPE') collapse node to relationship, node with one rel becomes self-relationship¦true¦ @@ -272,18 +254,15 @@ ¦procedure¦apoc.spatial.geocode¦apoc.spatial.geocode(location :: STRING?, maxResults = 100 :: INTEGER?, quotaException = false :: BOOLEAN?) :: (location :: MAP?, data :: MAP?, latitude :: FLOAT?, longitude :: FLOAT?, description :: STRING?)¦apoc.spatial.geocode('address') YIELD location, latitude, longitude, description, osmData - look up geographic location of address from a geocoding service (the default one is OpenStreetMap)¦true¦xref::misc/spatial.adoc ¦procedure¦apoc.spatial.geocodeOnce¦apoc.spatial.geocodeOnce(location :: STRING?) :: (location :: MAP?, data :: MAP?, latitude :: FLOAT?, longitude :: FLOAT?, description :: STRING?)¦apoc.spatial.geocodeOnce('address') YIELD location, latitude, longitude, description, osmData - look up geographic location of address from a geocoding service (the default one is OpenStreetMap)¦true¦xref::misc/spatial.adoc ¦procedure¦apoc.spatial.reverseGeocode¦apoc.spatial.reverseGeocode(latitude :: FLOAT?, longitude :: FLOAT?, quotaException = false :: BOOLEAN?) :: (location :: MAP?, data :: MAP?, latitude :: FLOAT?, longitude :: FLOAT?, description :: STRING?)¦apoc.spatial.reverseGeocode(latitude,longitude) YIELD location, latitude, longitude, description - look up address from latitude and longitude from a geocoding service (the default one is OpenStreetMap)¦true¦xref::misc/spatial.adoc -¦procedure¦apoc.spatial.sortByDistance¦apoc.spatial.sortByDistance(paths :: LIST? OF PATH?) :: (path :: PATH?, distance :: FLOAT?)¦apoc.spatial.sortPathsByDistance(List) sort the given paths based on the geo informations (lat/long) in ascending order¦true¦xref::misc/spatial.adoc -¦procedure¦apoc.static.get¦apoc.static.get(key :: STRING?) :: (value :: ANY?)¦apoc.static.get(name) - returns statically stored value from config (apoc.static.) or server lifetime storage¦false¦xref::misc/static-values.adoc +¦procedure¦apoc.spatial.sortByDistance¦apoc.spatial.sortByDistance(paths :: LIST? OF PATH?) :: (path :: PATH?, distance :: FLOAT?)¦apoc.spatial.sortByDistance(List) sort the given paths based on the geo informations (lat/long) in ascending order¦true¦xref::misc/spatial.adoc ¦procedure¦apoc.static.list¦apoc.static.list(prefix :: STRING?) :: (key :: STRING?, value :: ANY?)¦apoc.static.list(prefix) - returns statically stored values from config (apoc.static..*) or server lifetime storage¦false¦xref::misc/static-values.adoc ¦procedure¦apoc.static.set¦apoc.static.set(key :: STRING?, value :: ANY?) :: (value :: ANY?)¦apoc.static.set(name, value) - stores value under key for server lifetime storage, returns previously stored or configured value¦false¦xref::misc/static-values.adoc ¦procedure¦apoc.stats.degrees¦apoc.stats.degrees(types = :: STRING?) :: (type :: STRING?, direction :: STRING?, total :: INTEGER?, p50 :: INTEGER?, p75 :: INTEGER?, p90 :: INTEGER?, p95 :: INTEGER?, p99 :: INTEGER?, p999 :: INTEGER?, max :: INTEGER?, min :: INTEGER?, mean :: FLOAT?)¦¦true¦ -¦procedure¦apoc.systemdb.execute¦apoc.systemdb.execute(DDL commands :: STRING?, params = {} :: MAP?) :: (row :: MAP?)¦¦false¦xref::database-introspection/systemdb.adoc -¦procedure¦apoc.systemdb.export.metadata¦apoc.systemdb.export.metadata(config = {} :: MAP?) :: (file :: STRING?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, batches :: INTEGER?, done :: BOOLEAN?, data :: STRING?)¦¦true¦ -¦procedure¦apoc.systemdb.graph¦apoc.systemdb.graph() :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?)¦¦false¦xref::database-introspection/systemdb.adoc -¦procedure¦apoc.text.doubleMetaphone¦apoc.text.doubleMetaphone(value :: ANY?) :: (value :: STRING?)¦apoc.text.doubleMetaphone(value) yield value - Compute the Double Metaphone phonetic encoding of all words of the text value which can be a single string or a list of strings¦true¦xref::misc/text-functions.adoc -¦procedure¦apoc.text.phonetic¦apoc.text.phonetic(value :: ANY?) :: (value :: STRING?)¦apoc.text.phonetic(value) yield value - Compute the US_ENGLISH phonetic soundex encoding of all words of the text value which can be a single string or a list of strings¦true¦xref::misc/text-functions.adoc -¦procedure¦apoc.text.phoneticDelta¦apoc.text.phoneticDelta(text1 :: STRING?, text2 :: STRING?) :: (phonetic1 :: STRING?, phonetic2 :: STRING?, delta :: INTEGER?)¦apoc.text.phoneticDelta(text1, text2) yield phonetic1, phonetic2, delta - Compute the US_ENGLISH soundex character difference between two given strings¦true¦xref::misc/text-functions.adoc -¦procedure¦apoc.trigger.add¦apoc.trigger.add(name :: STRING?, kernelTransaction :: STRING?, selector :: MAP?, config = {} :: MAP?) :: (name :: STRING?, query :: STRING?, selector :: MAP?, params :: MAP?, installed :: BOOLEAN?, paused :: BOOLEAN?)¦add a trigger kernelTransaction under a name, in the kernelTransaction you can use \{createdNodes}, \{deletedNodes} etc., the selector is {phase:'before/after/rollback'} returns previous and new trigger information. Takes in an optional configuration.¦true¦xref::background-operations/triggers.adoc +¦procedure¦apoc.systemdb.execute¦apoc.systemdb.execute(DDL commands, either a string or a list of strings :: ANY?, params = {} :: MAP?) :: (row :: MAP?)¦¦false¦ +¦procedure¦apoc.systemdb.export.metadata¦apoc.systemdb.export.metadata(config = {} :: MAP?) :: (file :: STRING?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, batches :: INTEGER?, done :: BOOLEAN?, data :: ANY?)¦¦false¦ +¦procedure¦apoc.systemdb.graph¦apoc.systemdb.graph() :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?)¦¦false¦ +¦procedure¦apoc.text.phoneticDelta¦apoc.text.phoneticDelta(text1 :: STRING?, text2 :: STRING?) :: (phonetic1 :: STRING?, phonetic2 :: STRING?, delta :: INTEGER?)¦apoc.text.phoneticDelta(text1, text2) yield phonetic1, phonetic2, delta - Compute the US_ENGLISH soundex character difference between two given strings¦true¦ +¦procedure¦apoc.trigger.add¦apoc.trigger.add(name :: STRING?, kernelTransaction :: STRING?, selector :: MAP?, config = {} :: MAP?) :: (name :: STRING?, query :: STRING?, selector :: MAP?, params :: MAP?, installed :: BOOLEAN?, paused :: BOOLEAN?)¦add a trigger kernelTransaction under a name, in the kernelTransaction you can use \{createdNodes}, \{deletedNodes} etc., the selector is {phase:'before/after/rollback/afterAsync'} returns previous and new trigger information. Takes in an optional configuration.¦true¦xref::background-operations/triggers.adoc ¦procedure¦apoc.trigger.list¦apoc.trigger.list() :: (name :: STRING?, query :: STRING?, selector :: MAP?, params :: MAP?, installed :: BOOLEAN?, paused :: BOOLEAN?)¦list all installed triggers¦true¦xref::background-operations/triggers.adoc ¦procedure¦apoc.trigger.pause¦apoc.trigger.pause(name :: STRING?) :: (name :: STRING?, query :: STRING?, selector :: MAP?, params :: MAP?, installed :: BOOLEAN?, paused :: BOOLEAN?)¦CALL apoc.trigger.pause(name) | it pauses the trigger¦true¦xref::background-operations/triggers.adoc ¦procedure¦apoc.trigger.remove¦apoc.trigger.remove(name :: STRING?) :: (name :: STRING?, query :: STRING?, selector :: MAP?, params :: MAP?, installed :: BOOLEAN?, paused :: BOOLEAN?)¦remove previously added trigger, returns trigger information¦true¦xref::background-operations/triggers.adoc @@ -298,9 +277,7 @@ for the provided `label` and `uuidProperty`, in case the UUID handler is already ¦procedure¦apoc.uuid.list¦apoc.uuid.list() :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)¦CALL apoc.uuid.list() yield label, installed, properties | provides a list of all the uuid handlers installed with the related configuration¦false¦xref::graph-updates/uuid.adoc ¦procedure¦apoc.uuid.remove¦apoc.uuid.remove(label :: STRING?) :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)¦CALL apoc.uuid.remove(label) yield label, installed, properties | remove previously added uuid handler and returns uuid information. All the existing uuid properties are left as-is¦false¦xref::graph-updates/uuid.adoc ¦procedure¦apoc.uuid.removeAll¦apoc.uuid.removeAll() :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)¦CALL apoc.uuid.removeAll() yield label, installed, properties | it removes all previously added uuid handlers and returns uuids information. All the existing uuid properties are left as-is¦false¦xref::graph-updates/uuid.adoc -¦procedure¦apoc.warmup.run¦apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?)¦apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time¦true¦ ¦procedure¦apoc.when¦apoc.when(condition :: BOOLEAN?, ifQuery :: STRING?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)¦apoc.when(condition, ifQuery, elseQuery:'', params:{}) yield value - based on the conditional, executes read-only ifQuery or elseQuery with the given parameters¦true¦xref::cypher-execution/conditionals.adoc -¦procedure¦apoc.xml.import¦apoc.xml.import(url :: STRING?, config = {} :: MAP?) :: (node :: NODE?)¦Deprecated by apoc.import.xml¦true¦ ¦function¦apoc.agg.first¦apoc.agg.first(value :: ANY?) :: (ANY?)¦apoc.agg.first(value) - returns first value¦true¦ ¦function¦apoc.agg.graph¦apoc.agg.graph(element :: ANY?) :: (MAP?)¦apoc.agg.graph(path) - returns map of graph {nodes, relationships} of all distinct nodes and relationships¦true¦ ¦function¦apoc.agg.last¦apoc.agg.last(value :: ANY?) :: (ANY?)¦apoc.agg.last(value) - returns last value¦true¦ @@ -347,7 +324,6 @@ for the provided `label` and `uuidProperty`, in case the UUID handler is already ¦function¦apoc.coll.randomItems¦apoc.coll.randomItems(coll :: LIST? OF ANY?, itemCount :: INTEGER?, allowRepick = false :: BOOLEAN?) :: (LIST? OF ANY?)¦apoc.coll.randomItems(coll, itemCount, allowRepick: false) - returns a list of itemCount random items from the original list, optionally allowing picked elements to be picked again¦true¦ ¦function¦apoc.coll.remove¦apoc.coll.remove(coll :: LIST? OF ANY?, index :: INTEGER?, length = 1 :: INTEGER?) :: (LIST? OF ANY?)¦apoc.coll.remove(coll, index, [length=1]) | remove range of values from index to length¦true¦ ¦function¦apoc.coll.removeAll¦apoc.coll.removeAll(first :: LIST? OF ANY?, second :: LIST? OF ANY?) :: (LIST? OF ANY?)¦apoc.coll.removeAll(first, second) - returns first list with all elements of second list removed¦true¦ -¦function¦apoc.coll.reverse¦apoc.coll.reverse(coll :: LIST? OF ANY?) :: (LIST? OF ANY?)¦apoc.coll.reverse(coll) - returns reversed list¦true¦ ¦function¦apoc.coll.runningTotal¦apoc.coll.runningTotal(list :: LIST? OF NUMBER?) :: (LIST? OF ANY?)¦apoc.coll.runningTotal(list1) - returns an accumulative array. For example apoc.coll.runningTotal([1,2,3.5]) return [1,3,6.5]¦true¦ ¦function¦apoc.coll.set¦apoc.coll.set(coll :: LIST? OF ANY?, index :: INTEGER?, value :: ANY?) :: (LIST? OF ANY?)¦apoc.coll.set(coll, index, value) | set index to value¦true¦ ¦function¦apoc.coll.shuffle¦apoc.coll.shuffle(coll :: LIST? OF ANY?) :: (LIST? OF ANY?)¦apoc.coll.shuffle(coll) - returns the shuffled list¦true¦ @@ -387,10 +363,8 @@ for the provided `label` and `uuidProperty`, in case the UUID handler is already ¦function¦apoc.create.vNode¦apoc.create.vNode(label :: LIST? OF STRING?, props = {} :: MAP?) :: (NODE?)¦apoc.create.vNode(['Label'], {key:value,...}) returns a virtual node¦true¦xref::virtual/virtual-nodes-rels.adoc ¦function¦apoc.create.vRelationship¦apoc.create.vRelationship(from :: NODE?, relType :: STRING?, props :: MAP?, to :: NODE?) :: (RELATIONSHIP?)¦apoc.create.vRelationship(nodeFrom,'KNOWS',{key:value,...}, nodeTo) returns a virtual relationship¦true¦xref::virtual/virtual-nodes-rels.adoc ¦function¦apoc.create.virtual.fromNode¦apoc.create.virtual.fromNode(node :: NODE?, propertyNames :: LIST? OF STRING?) :: (NODE?)¦apoc.create.virtual.fromNode(node, [propertyNames]) returns a virtual node built from an existing node with only the requested properties¦true¦xref::virtual/virtual-nodes-rels.adoc -¦function¦apoc.cypher.runFirstColumn¦apoc.cypher.runFirstColumn(cypher :: STRING?, params :: MAP?, expectMultipleValues = true :: BOOLEAN?) :: (ANY?)¦use either apoc.cypher.runFirstColumnMany for a list return or apoc.cypher.runFirstColumnSingle for returning the first row of the first column¦true¦xref::cypher-execution/index.adoc ¦function¦apoc.cypher.runFirstColumnMany¦apoc.cypher.runFirstColumnMany(cypher :: STRING?, params :: MAP?) :: (LIST? OF ANY?)¦apoc.cypher.runFirstColumnMany(statement, params) - executes statement with given parameters, returns first column only collected into a list, params are available as identifiers¦true¦xref::cypher-execution/index.adoc ¦function¦apoc.cypher.runFirstColumnSingle¦apoc.cypher.runFirstColumnSingle(cypher :: STRING?, params :: MAP?) :: (ANY?)¦apoc.cypher.runFirstColumnSingle(statement, params) - executes statement with given parameters, returns first element of the first column only, params are available as identifiers¦true¦xref::cypher-execution/index.adoc -¦function¦apoc.data.domain¦apoc.data.domain(url_or_email_address :: STRING?) :: (STRING?)¦apoc.data.domain('url_or_email_address') YIELD domain - extract the domain name from a url or an email address. If nothing was found, yield null.¦true¦ ¦function¦apoc.data.email¦apoc.data.email(email_address :: STRING?) :: (MAP?)¦apoc.data.email('email_address') as {personal,user,domain} - extract the personal name, user and domain as a map¦false¦ ¦function¦apoc.data.url¦apoc.data.url(url :: STRING?) :: (MAP?)¦apoc.data.url('url') as {protocol,host,port,path,query,file,anchor,user} | turn URL into map structure¦true¦ ¦function¦apoc.date.add¦apoc.date.add(time :: INTEGER?, unit :: STRING?, addValue :: INTEGER?, addUnit :: STRING?) :: (INTEGER?)¦apoc.date.add(12345, 'ms', -365, 'd') - given a timestamp in one time unit, adds a value of the specified time unit¦true¦ @@ -402,7 +376,6 @@ for the provided `label` and `uuidProperty`, in case the UUID handler is already ¦function¦apoc.date.format¦apoc.date.format(time :: INTEGER?, unit = ms :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = :: STRING?) :: (STRING?)¦apoc.date.format(12345,('ms|s|m|h|d'),('yyyy-MM-dd HH:mm:ss zzz'),('TZ')) - get string representation of time value optionally using the specified unit (default ms) using specified format (default ISO) and specified time zone (default current TZ)¦true¦ ¦function¦apoc.date.fromISO8601¦apoc.date.fromISO8601(time :: STRING?) :: (INTEGER?)¦apoc.date.fromISO8601('yyyy-MM-ddTHH:mm:ss.SSSZ') - return number representation of time in EPOCH format¦true¦ ¦function¦apoc.date.parse¦apoc.date.parse(time :: STRING?, unit = ms :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = :: STRING?) :: (INTEGER?)¦apoc.date.parse('2012-12-23','ms|s|m|h|d','yyyy-MM-dd') - parse date string using the specified format into the specified time unit¦true¦ -¦function¦apoc.date.parseAsZonedDateTime¦apoc.date.parseAsZonedDateTime(time :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = UTC :: STRING?) :: (DATETIME?)¦apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') - parse date string using the specified format to specified timezone¦true¦ ¦function¦apoc.date.systemTimezone¦apoc.date.systemTimezone() :: (STRING?)¦apoc.date.systemTimezone() - returns the system timezone display name¦true¦ ¦function¦apoc.date.toISO8601¦apoc.date.toISO8601(time :: INTEGER?, unit = ms :: STRING?) :: (STRING?)¦apoc.date.toISO8601(12345,('ms|s|m|h|d') - return string representation of time in ISO8601 format¦true¦ ¦function¦apoc.date.toYears¦apoc.date.toYears(value :: ANY?, format = yyyy-MM-dd HH:mm:ss :: STRING?) :: (FLOAT?)¦toYears(timestamp) or toYears(date[,format]) - converts timestamp into floating point years¦true¦ @@ -444,7 +417,6 @@ for the provided `label` and `uuidProperty`, in case the UUID handler is already ¦function¦apoc.math.minDouble¦apoc.math.minDouble() :: (FLOAT?)¦apoc.math.minDouble() | return the smallest positive nonzero value of type double¦true¦xref::mathematical/math-functions.adoc ¦function¦apoc.math.minInt¦apoc.math.minInt() :: (INTEGER?)¦apoc.math.minInt() | return the minimum value an int can have¦true¦xref::mathematical/math-functions.adoc ¦function¦apoc.math.minLong¦apoc.math.minLong() :: (INTEGER?)¦apoc.math.minLong() | return the minimum value a long can have¦true¦xref::mathematical/math-functions.adoc -¦function¦apoc.math.round¦apoc.math.round(value :: FLOAT?, precision = 0 :: INTEGER?, mode = HALF_UP :: STRING?) :: (FLOAT?)¦apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY])¦true¦xref::mathematical/math-functions.adoc ¦function¦apoc.math.sech¦apoc.math.sech(value :: FLOAT?) :: (FLOAT?)¦apoc.math.sech(val) | returns the hyperbolic secant¦true¦xref::mathematical/math-functions.adoc ¦function¦apoc.math.sigmoid¦apoc.math.sigmoid(value :: FLOAT?) :: (FLOAT?)¦apoc.math.sigmoid(val) | returns the sigmoid value¦true¦xref::mathematical/math-functions.adoc ¦function¦apoc.math.sigmoidPrime¦apoc.math.sigmoidPrime(value :: FLOAT?) :: (FLOAT?)¦apoc.math.sigmoidPrime(val) | returns the sigmoid prime [ sigmoid(val) * (1 - sigmoid(val)) ]¦true¦xref::mathematical/math-functions.adoc @@ -453,10 +425,7 @@ for the provided `label` and `uuidProperty`, in case the UUID handler is already ¦function¦apoc.meta.cypher.isType¦apoc.meta.cypher.isType(value :: ANY?, type :: STRING?) :: (BOOLEAN?)¦apoc.meta.cypher.isType(value,type) - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,MAP,LIST OF ,POINT,DATE,DATE_TIME,LOCAL_TIME,LOCAL_DATE_TIME,TIME,DURATION)¦true¦ ¦function¦apoc.meta.cypher.type¦apoc.meta.cypher.type(value :: ANY?) :: (STRING?)¦apoc.meta.cypher.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,MAP,LIST OF ,POINT,DATE,DATE_TIME,LOCAL_TIME,LOCAL_DATE_TIME,TIME,DURATION)¦true¦ ¦function¦apoc.meta.cypher.types¦apoc.meta.cypher.types(properties :: ANY?) :: (MAP?)¦apoc.meta.cypher.types(node-relationship-map) - returns a map of keys to types¦true¦ -¦function¦apoc.meta.isType¦apoc.meta.isType(value :: ANY?, type :: STRING?) :: (BOOLEAN?)¦apoc.meta.isType(value,type) - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST)¦true¦ -¦function¦apoc.meta.type¦apoc.meta.type(value :: ANY?) :: (STRING?)¦apoc.meta.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST)¦true¦ -¦function¦apoc.meta.typeName¦apoc.meta.typeName(value :: ANY?) :: (STRING?)¦apoc.meta.typeName(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST)¦true¦ -¦function¦apoc.meta.types¦apoc.meta.types(properties :: ANY?) :: (MAP?)¦apoc.meta.types(node-relationship-map) - returns a map of keys to types¦true¦ +¦function¦apoc.meta.nodes.count¦apoc.meta.nodes.count(nodes = [] :: LIST? OF STRING?, config = {} :: MAP?) :: (INTEGER?)¦apoc.meta.nodes.count([labels], $config) - Returns the sum of the nodes with a label present in the list.¦true¦ ¦function¦apoc.node.degree¦apoc.node.degree(node :: NODE?, types = :: STRING?) :: (INTEGER?)¦apoc.node.degree(node, rel-direction-pattern) - returns total degrees of the given relationships in the pattern, can use '>' or '<' for all outgoing or incoming relationships¦true¦xref::graph-querying/node-querying.adoc ¦function¦apoc.node.degree.in¦apoc.node.degree.in(node :: NODE?, types = :: STRING?) :: (INTEGER?)¦apoc.node.degree.in(node, relationshipName) - returns total number number of incoming relationships¦true¦xref::graph-querying/node-querying.adoc ¦function¦apoc.node.degree.out¦apoc.node.degree.out(node :: NODE?, types = :: STRING?) :: (INTEGER?)¦apoc.node.degree.out(node, relationshipName) - returns total number number of outgoing relationships¦true¦xref::graph-querying/node-querying.adoc diff --git a/docs/asciidoc/modules/ROOT/nav.adoc b/docs/asciidoc/modules/ROOT/nav.adoc index efc7a18131..f13e2cff78 100644 --- a/docs/asciidoc/modules/ROOT/nav.adoc +++ b/docs/asciidoc/modules/ROOT/nav.adoc @@ -42,7 +42,6 @@ include::partial$generated-documentation/nav.adoc[] ** xref::database-integration/load-jdbc.adoc[] ** xref::database-integration/database-modeling.adoc[] ** xref::database-integration/elasticsearch.adoc[] - ** xref::database-integration/mongodb.adoc[] ** xref::database-integration/couchbase.adoc[] ** xref::database-integration/bolt-neo4j.adoc[] ** xref::database-integration/load-ldap.adoc[] @@ -139,7 +138,6 @@ include::partial$generated-documentation/nav.adoc[] * xref:operational/index.adoc[] ** xref::operational/init-script.adoc[] - ** xref::operational/warmup.adoc[] ** xref::operational/log.adoc[] * xref:misc/index.adoc[] diff --git a/docs/asciidoc/modules/ROOT/pages/algorithms/path-finding-procedures.adoc b/docs/asciidoc/modules/ROOT/pages/algorithms/path-finding-procedures.adoc index 80e43a3534..dc51e489e7 100644 --- a/docs/asciidoc/modules/ROOT/pages/algorithms/path-finding-procedures.adoc +++ b/docs/asciidoc/modules/ROOT/pages/algorithms/path-finding-procedures.adoc @@ -9,7 +9,6 @@ APOC exposes some built in path-finding functions that Neo4j brings along. [cols="3m,3"] |=== | apoc.algo.dijkstra(startNode, endNode, 'KNOWS\|', 'distance') YIELD path, weight | run dijkstra with relationship property name as cost function -| apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS\|', 'distance', 10) YIELD path, weight | run dijkstra with relationship property name as cost function and a default weight if the property does not exist | apoc.algo.aStar(startNode, endNode, 'KNOWS\|', 'distance','lat','lon') YIELD path, weight | run A* with relationship property name as cost function | label:apoc-full[] apoc.algo.aStarWithPoint(startNode, endNode, 'relTypesAndDirs', 'weightPropertyName','pointPropertyName') - equivalent to apoc.algo.aStar but accept a Point type as a pointProperty instead of Number types as latitude and longitude properties | apoc.algo.aStarConfig(startNode, endNode, 'KNOWS|', {weight:'dist',default:10, x:'lon',y:'lat',pointPropName:'point'}) YIELD path, weight - run A* with relationship property name as cost function diff --git a/docs/asciidoc/modules/ROOT/pages/background-operations/triggers.adoc b/docs/asciidoc/modules/ROOT/pages/background-operations/triggers.adoc index 3199f3bf5f..3028e253cf 100644 --- a/docs/asciidoc/modules/ROOT/pages/background-operations/triggers.adoc +++ b/docs/asciidoc/modules/ROOT/pages/background-operations/triggers.adoc @@ -313,7 +313,7 @@ For this example, we would like that all the `reference` node properties are of ---- CALL apoc.trigger.add("forceStringType", "UNWIND apoc.trigger.propertiesByKey($assignedNodeProperties, 'reference') AS prop -CALL apoc.util.validate(apoc.meta.type(prop) <> 'STRING', 'expected string property type, got %s', [apoc.meta.type(prop)]) RETURN null", {phase:'before'}) +CALL apoc.util.validate(apoc.meta.cypher.type(prop) <> 'STRING', 'expected string property type, got %s', [apoc.meta.type(prop)]) RETURN null", {phase:'before'}) ---- [source,cypher] diff --git a/docs/asciidoc/modules/ROOT/pages/cypher-execution/cypher-based-procedures-functions.adoc b/docs/asciidoc/modules/ROOT/pages/cypher-execution/cypher-based-procedures-functions.adoc index 5e3551cb56..e47e615f97 100644 --- a/docs/asciidoc/modules/ROOT/pages/cypher-execution/cypher-based-procedures-functions.adoc +++ b/docs/asciidoc/modules/ROOT/pages/cypher-execution/cypher-based-procedures-functions.adoc @@ -7,14 +7,14 @@ I wanted for a long time to be able to register Cypher statements as proper procedures and functions, so that they become callable in a standalone way. -You can achieve that with the `apoc.custom.asProcedure` and `apoc.custom.asFunction` procedure calls. +You can achieve that with the `apoc.custom.declareProcedure` and `apoc.custom.dclareFunction` procedure calls. Those register a given Cypher statement, prefixed with the `custom.*` namespace, overriding potentially existing ones, so you can redefine them as needed. Here is a simple example: [source,cypher] ---- -CALL apoc.custom.asProcedure('answer','RETURN 42 as answer') +CALL apoc.custom.declareProcedure('answer() :: INT','RETURN 42 as answer') ---- This registers the statement as procedure `custom.answer` that you then can call. @@ -22,36 +22,31 @@ As no information on parameter and return types is given, it just returns a stre [source,cypher] ---- -CALL custom.answer YIELD row -RETURN row.answer +CALL custom.answer() YIELD row +RETURN row.answer() ---- The same is possible as a function: [source,cypher] ---- -CALL apoc.custom.asFunction('answer','RETURN 42') +CALL apoc.custom.declareFunction('answer() :: (result::INT)','RETURN 42') ---- -NOTE: If you override procedures or functions you might need to call `call dbms.clearQueryCaches()` as lookups to internal id's are kept in compiled query plans. +NOTE: If you override procedures or functions you might need to call `call dbms.clearQueryCaches()` as lookups to internal ids are kept in compiled query plans. -== Custom Procedures with `apoc.custom.asProcedure` +== Custom Procedures with `apoc.custom.declareProcedure` -Given statement will be registered as a procedure, the results will be turned into a stream of records. +The given statement will be registered as a procedure, the results will be turned into a stream of records. -.Parameters -[%autowidth,opts=header,cols="m,m,a"] +== Input parameters +[.procedures, opts=header] |=== -| name -| default -| description - -| name | none | dot-separated name, will be prefixed with `custom` -| statement | none | cypher statement to run, can use $parameters -| mode | read | execution mode of the procedure: read, write, or schema -| outputs | [["row","MAP"]] | List of pairs of name-type to be used as output columns, need to be in-order with the cypher statement, the default is a special case, that will collect all columns of the statement result into a map -| inputs | [["params","MAP","{}"]] | Pairs or triples of name-type-default, to be used as input parameters. The default just takes an optional map, otherwise they will become proper paramters in order -| description | "" | A general description about the business rules implemented into the procedure +| Name | Type | Default +|signature|STRING?|null +|statement|STRING?|null +|mode|STRING?|read +|description|STRING?| |=== The type names are what you would expect and see in outputs of `SHOW PROCEDURES` or `apoc.help` just without the `?`. @@ -71,34 +66,28 @@ The default values are parsed as JSON. .Find neighbours of a node by name [source,cypher] ---- -CALL apoc.custom.asProcedure('neighbours', +CALL apoc.custom.declareProcedure('neighbours(name::STRING) :: NODE', 'MATCH (n:Person {name:$name})-->(nb) RETURN nb as neighbour','read', - [['neighbour','NODE']],[['name','STRING']], 'get neighbours of a person'); + 'get neighbours of a person'); CALL custom.neighbours('Keanu Reeves') YIELD neighbour; ---- -== Custom Functions with `apoc.custom.asFunction` +== Custom Functions with `apoc.custom.declareFunction` Given statement will be registered as a statement, the results into a single value. If the given output type is a list, results will be collected into a list, otherwise the first row will be used. The statement needs to return a single column, otherwise an error is thrown. -.Parameters -[%autowidth,opts=header, cols="m,m,a"] +== Input parameters +[.procedures, opts=header] |=== -| name -| default -| description - -| name | none | dot-separated name, will be prefixed with `custom` -| statement | none | cypher statement to run, can use $parameters -| outputs | "LIST OF MAP" | Output type for single output, if the type is a list, then all rows will be collected, otherwise just the first row. Only single column results are allowed. -If your single row result is a list you can force a single row by setting the last parameter to `true` -| inputs | [["params","MAP","{}"]] | Pairs or triples of name-type-default, to be used as input parameters. The default just takes an optional map, otherwise they will become proper paramters in order -| singleRow | false | If set to true, the statement is treated as single row even with the list result type, then your statement has to return a list. -| description | "" | A general description about the business rules implemented into the function +| Name | Type | Default +|signature|STRING?|null +|statement|STRING?|null +|forceSingle|BOOLEAN?|false +|description|STRING?| |=== The type names are what you would expect and see in outputs of `SHOW PROCEDURES` or `apoc.help` just without the `?`. @@ -108,7 +97,7 @@ The default values are parsed as JSON. == List of registered procedures/function with `apoc.custom.list` The procedure `apoc.custom.list` provide a list of all registered procedures/function via -`apoc.custom.asProcedure` and `apoc.custom.asFunction` +`apoc.custom.declareProcedure` and `apoc.custom.declareFunction` Given the this call: diff --git a/docs/asciidoc/modules/ROOT/pages/cypher-execution/running-cypher.adoc b/docs/asciidoc/modules/ROOT/pages/cypher-execution/running-cypher.adoc index 906789e6f4..e4b255f2dc 100644 --- a/docs/asciidoc/modules/ROOT/pages/cypher-execution/running-cypher.adoc +++ b/docs/asciidoc/modules/ROOT/pages/cypher-execution/running-cypher.adoc @@ -23,7 +23,6 @@ include::example$generated-documentation/apoc.cypher.parallel.adoc[] include::example$generated-documentation/apoc.cypher.parallel2.adoc[] include::example$generated-documentation/apoc.cypher.mapParallel.adoc[] include::example$generated-documentation/apoc.cypher.mapParallel2.adoc[] -include::example$generated-documentation/apoc.cypher.runFirstColumn.adoc[] include::example$generated-documentation/apoc.cypher.runFirstColumnMany.adoc[] include::example$generated-documentation/apoc.cypher.runFirstColumnSingle.adoc[] |=== diff --git a/docs/asciidoc/modules/ROOT/pages/data-structures/collection-list-functions.adoc b/docs/asciidoc/modules/ROOT/pages/data-structures/collection-list-functions.adoc index 07dda03726..aa9f4e8046 100644 --- a/docs/asciidoc/modules/ROOT/pages/data-structures/collection-list-functions.adoc +++ b/docs/asciidoc/modules/ROOT/pages/data-structures/collection-list-functions.adoc @@ -28,7 +28,6 @@ include::example$generated-documentation/apoc.coll.toSet.adoc[] include::example$generated-documentation/apoc.coll.sort.adoc[] include::example$generated-documentation/apoc.coll.sortNodes.adoc[] include::example$generated-documentation/apoc.coll.sortMaps.adoc[] -include::example$generated-documentation/apoc.coll.reverse.adoc[] include::example$generated-documentation/apoc.coll.contains.adoc[] include::example$generated-documentation/apoc.coll.containsAll.adoc[] include::example$generated-documentation/apoc.coll.containsSorted.adoc[] diff --git a/docs/asciidoc/modules/ROOT/pages/database-integration/index.adoc b/docs/asciidoc/modules/ROOT/pages/database-integration/index.adoc index e509948b30..1069b58e21 100644 --- a/docs/asciidoc/modules/ROOT/pages/database-integration/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/database-integration/index.adoc @@ -13,7 +13,6 @@ For more information on how to use these procedures, see: * xref::database-integration/database-modeling.adoc[] * xref::database-integration/elasticsearch.adoc[] * xref::database-integration/mongo.adoc[] -* xref::database-integration/mongodb.adoc[] * xref::database-integration/couchbase.adoc[] * xref::database-integration/bolt-neo4j.adoc[] * xref::database-integration/load-ldap.adoc[] diff --git a/docs/asciidoc/modules/ROOT/pages/database-integration/load-jdbc.adoc b/docs/asciidoc/modules/ROOT/pages/database-integration/load-jdbc.adoc index 6d3e4f38a5..b882d7b3d2 100644 --- a/docs/asciidoc/modules/ROOT/pages/database-integration/load-jdbc.adoc +++ b/docs/asciidoc/modules/ROOT/pages/database-integration/load-jdbc.adoc @@ -138,19 +138,6 @@ image::apoc-load-jdbc.jpg[width=800] // apoc.load.jdbc('jdbc:derby:derbyDB/key','PERSON' || 'SELECT * FROM PERSON WHERE AGE > 18') YIELD row CREATE (:Person {name:row.name}) load from relational database, either a full table or a sql statement -== Load JDBC with params Examples - -[source,cypher] ----- -WITH "select firstname, lastname from employees where firstname like ? and lastname like ?" as sql -CALL apoc.load.jdbcParams("northwind", sql, ['F%', '%w']) -YIELD row -RETURN row ----- - -JDBC pretends positional "?" for parameters, so the third apoc parameter has to be an array with values coherent with that positions. -In case of 2 parameters, firstname and lastname ['firstname-position','lastname-position'] - == Load data in transactional batches You can load data from jdbc and create/update the graph using the query results in batches (and in parallel). diff --git a/docs/asciidoc/modules/ROOT/pages/database-integration/mongo.adoc b/docs/asciidoc/modules/ROOT/pages/database-integration/mongo.adoc index f816da2b3d..ce7149593f 100644 --- a/docs/asciidoc/modules/ROOT/pages/database-integration/mongo.adoc +++ b/docs/asciidoc/modules/ROOT/pages/database-integration/mongo.adoc @@ -82,7 +82,7 @@ we can run the following procedures. [source,cypher] ---- -CALL apoc.mongodb.aggregate('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', [{`$match`: {foo: 'bar'}}, {`$set`: {aggrField: 'Y'} }]) +CALL apoc.mongo.aggregate('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', [{`$match`: {foo: 'bar'}}, {`$set`: {aggrField: 'Y'} }]) ---- .Results @@ -126,7 +126,7 @@ CALL apoc.mongodb.aggregate('mongodb://user:pass@localhost:27017/myDb.Person?aut [source,cypher] ---- -CALL apoc.mongodb.count('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin') +CALL apoc.mongo.count('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin') ---- .Results @@ -140,7 +140,7 @@ We can also pass the collection name through the config parameter: [source,cypher] ---- -CALL apoc.mongodb.count('mongodb://user:pass@localhost:27017/myDb?authSource=admin', {collection: 'Person'}) +CALL apoc.mongo.count('mongodb://user:pass@localhost:27017/myDb?authSource=admin', {collection: 'Person'}) ---- .Results @@ -158,7 +158,7 @@ If we want to extract the all `Person`s with default parameter: [source,cypher] ---- -CALL apoc.mongodb.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin') +CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin') ---- .Results @@ -213,7 +213,7 @@ In addition, we can pass the query param like: [source,cypher] ---- -CALL apoc.mongodb.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'bar*', `$options`: ''}}) +CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'bar*', `$options`: ''}}) ---- .Results @@ -243,7 +243,7 @@ If we want to extract `bought` references, through config parameter: [source,cypher] ---- -CALL apoc.mongodb.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'foo*', `$options`: ''}}, {extractReferences: true}) +CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'foo*', `$options`: ''}}, {extractReferences: true}) ---- .Results @@ -291,7 +291,7 @@ Moreover, we can retrieve the `ObjectId` s with theirs `HexString` representatio [source,cypher] ---- -CALL apoc.mongodb.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'foo*', `$options`: ''}}, {objectIdAsMap: false, extractReferences: true}) +CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {expr: {`$regex`: 'foo*', `$options`: ''}}, {objectIdAsMap: false, extractReferences: true}) ---- .Results @@ -379,7 +379,7 @@ CALL apoc.mongo.first('mongodb://user:pass@localhost:27017/myDb.Person?authSourc Furthermore, we can use the `limit` parameter, for example: ---- -CALL apoc.mongodb.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {skip: 1, limit: 1, project: {age: 1}}) +CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {skip: 1, limit: 1, project: {age: 1}}) ---- .Results @@ -404,7 +404,7 @@ Furthermore, we can pass a `sort` parameter, for example: [source,cypher] ---- -CALL apoc.mongodb.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {sort: {name: -1}, objectIdAsMap: false, project: {name: 1}}) +CALL apoc.mongo.find('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', null, {sort: {name: -1}, objectIdAsMap: false, project: {name: 1}}) ---- .Results @@ -439,7 +439,7 @@ To update the `age` property of the `John` document: [source,cypher] ---- -CALL apoc.mongodb.update('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {name: "John"}, {`$set`: {age:99}}) +CALL apoc.mongo.update('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {name: "John"}, {`$set`: {age:99}}) ---- with the number of row affected as result: @@ -459,7 +459,7 @@ To delete the `John` document: [source,cypher] ---- -CALL apoc.mongodb.update('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {name: "John"}) +CALL apoc.mongo.update('mongodb://user:pass@localhost:27017/myDb.Person?authSource=admin', {name: "John"}) ---- with the number of row affected as result: diff --git a/docs/asciidoc/modules/ROOT/pages/database-integration/redis.adoc b/docs/asciidoc/modules/ROOT/pages/database-integration/redis.adoc index 1545d349d0..6c44529207 100644 --- a/docs/asciidoc/modules/ROOT/pages/database-integration/redis.adoc +++ b/docs/asciidoc/modules/ROOT/pages/database-integration/redis.adoc @@ -159,7 +159,7 @@ CALL apoc.redis.incrby($uri, 'myKey', 2) [source,cypher] ---- -CALL apoc.mongodb.push($uri, 'myListKey', ['foo','bar','baz']) +CALL apoc.redis.push($uri, 'myListKey', ['foo','bar','baz']) ---- .Results diff --git a/docs/asciidoc/modules/ROOT/pages/database-introspection/meta.adoc b/docs/asciidoc/modules/ROOT/pages/database-introspection/meta.adoc index 20487850c4..b07fff6030 100644 --- a/docs/asciidoc/modules/ROOT/pages/database-introspection/meta.adoc +++ b/docs/asciidoc/modules/ROOT/pages/database-introspection/meta.adoc @@ -48,22 +48,4 @@ include::example$generated-documentation/apoc.meta.cypher.types.adoc[] In the case of `LIST` you may have many results, depending on the content. In the event that all contents are of the same type, will you have the `LIST OF `, otherwise if the type is different, will you get `LIST OF ANY` -If no type was found, the function return name of the class. - -.Functions Deprecated -[cols="5m,5"] -|=== -| apoc.meta.type(value) | type name of a value (`INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,MAP,LIST`) -| apoc.meta.isType(value,type) | returns a row if type name matches none if not -| apoc.meta.types(node or relationship or map) | returns a a map of property-keys to their names -|=== - -If no type was found, the function return name of the class. - - -.isType example -[source,cypher] ----- -MATCH (n:Person) -RETURN apoc.meta.isType(n.age,"INTEGER") as ageType ----- +If no type was found, the function return name of the class. \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/pages/graph-updates/graph-refactoring/clone-nodes.adoc b/docs/asciidoc/modules/ROOT/pages/graph-updates/graph-refactoring/clone-nodes.adoc index e6adf19e3c..3a7c92dd14 100644 --- a/docs/asciidoc/modules/ROOT/pages/graph-updates/graph-refactoring/clone-nodes.adoc +++ b/docs/asciidoc/modules/ROOT/pages/graph-updates/graph-refactoring/clone-nodes.adoc @@ -9,11 +9,8 @@ The available procedures are described in the table below: |=== ¦Qualified Name¦Type¦Release include::example$generated-documentation/apoc.refactor.cloneNodes.adoc[] -include::example$generated-documentation/apoc.refactor.cloneNodesWithRelationships.adoc[] |=== -NOTE: The `apoc.refactor.cloneNodesWithRelationships()` has been deprecated in favor of `apoc.refactor.cloneNodes(, true)`. - == Example Usage The examples below will help us learn how to use these procedures. @@ -75,37 +72,6 @@ getting as a result: | "Node() already exists with label `UniqueLabel` and property `key` = 1" | null |=== - -=== Clone nodes with relationships - -.The following creates a graph containing two different nodes of type `Actor` connected with other two different node of type `Movie` - -[source,cypher] ----- -CREATE (k:Actor {name:'Keanu Reeves'})-[:ACTED_IN {role:'Neo'}]->(m:Movie {title:'The Matrix'}), - (t:Actor {name:'Tom Hanks'})-[:ACTED_IN {role:'Forrest'}]->(f:Movie {title:'Forrest Gump'}) -RETURN * ----- - -image::apoc.refactor.cloneNodesWithRelationships.dataset.png[scaledwidth="100%"] - -.The following creates copies of both of these nodes and their relationships: - -[source,cypher] ----- -MATCH (k:Actor {name:'Keanu Reeves'}) -MATCH (t:Actor {name:'Tom Hanks'}) -CALL apoc.refactor.cloneNodes([k,t], true) -YIELD output -MATCH p=(output)--() -RETURN * ----- - -As result we have a copy of the nodes and relationships - -image::apoc.refactor.cloneNodesWithRelationships.png[scaledwidth="100%"] - - === Clone nodes skipping properties We can clone nodes excluding some properties, by specifying the `propertyKey`s list as the third parameter diff --git a/docs/asciidoc/modules/ROOT/pages/graph-updates/periodic-execution.adoc b/docs/asciidoc/modules/ROOT/pages/graph-updates/periodic-execution.adoc index 4076523d3a..d06e5fc6e4 100644 --- a/docs/asciidoc/modules/ROOT/pages/graph-updates/periodic-execution.adoc +++ b/docs/asciidoc/modules/ROOT/pages/graph-updates/periodic-execution.adoc @@ -18,24 +18,14 @@ The table below describes the available procedures: ¦Qualified Name¦Type¦Release include::example$generated-documentation/apoc.periodic.iterate.adoc[] include::example$generated-documentation/apoc.periodic.commit.adoc[] -include::example$generated-documentation/apoc.periodic.rock_n_roll.adoc[] |=== include::partial$periodic-iterate.adoc[leveloffset=+1] include::partial$periodic-commit.adoc[leveloffset=+1] -[[periodic-rock-n-roll]] -== Periodic Rock 'n' Roll - -.copies over the `name` property of each person to `lastname` -[source,cypher] ----- -CALL apoc.periodic.rock_n_roll('match (p:Person) return id(p) as id_p', 'MATCH (p) where id(p)={id_p} SET p.lastname =p.name', 20000) ----- - === Progress logs -To visualize verbose progresses' logs of `apoc.periodic.iterate`, `apoc.periodic.commit`, `apoc.periodic.rock_n_roll`, `apoc.periodic.rock_n_roll_while`, please set `dbms.logs.debug.level=DEBUG` in `neo4j.conf`. +To visualize verbose progresses' logs of `apoc.periodic.iterate` or `apoc.periodic.commit` please set `dbms.logs.debug.level=DEBUG` in `neo4j.conf`. As example, with this query: diff --git a/docs/asciidoc/modules/ROOT/pages/mathematical/math-functions.adoc b/docs/asciidoc/modules/ROOT/pages/mathematical/math-functions.adoc index 54c6d36e29..650e9e4421 100644 --- a/docs/asciidoc/modules/ROOT/pages/mathematical/math-functions.adoc +++ b/docs/asciidoc/modules/ROOT/pages/mathematical/math-functions.adoc @@ -5,7 +5,6 @@ [separator=¦,opts=header,cols="5,1m,1m"] |=== ¦Qualified Name¦Type¦Release -include::example$generated-documentation/apoc.math.round.adoc[] include::example$generated-documentation/apoc.math.maxLong.adoc[] include::example$generated-documentation/apoc.math.minLong.adoc[] include::example$generated-documentation/apoc.math.maxDouble.adoc[] diff --git a/docs/asciidoc/modules/ROOT/pages/misc/static-values.adoc b/docs/asciidoc/modules/ROOT/pages/misc/static-values.adoc index 0e1ba21c6c..009cddf964 100644 --- a/docs/asciidoc/modules/ROOT/pages/misc/static-values.adoc +++ b/docs/asciidoc/modules/ROOT/pages/misc/static-values.adoc @@ -14,9 +14,6 @@ include::example$generated-documentation/apoc.static.getAll.adoc[] include::example$generated-documentation/apoc.static.set.adoc[] |=== - -NOTE: `apoc.static.get` and `apoc.static.getAll` have been migrated to functions, the procedures have been deprecated. - This section includes the following sub sections: * <> diff --git a/docs/asciidoc/modules/ROOT/pages/misc/text-functions.adoc b/docs/asciidoc/modules/ROOT/pages/misc/text-functions.adoc index 51eae626e9..500776190b 100644 --- a/docs/asciidoc/modules/ROOT/pages/misc/text-functions.adoc +++ b/docs/asciidoc/modules/ROOT/pages/misc/text-functions.adoc @@ -63,7 +63,6 @@ The `replace`, `split` and `regexGroups` functions work with regular expressions |=== | apoc.data.url('url') as {protocol,user,host,port,path,query,file,anchor} | turn URL into map structure | apoc.data.email('email_address') as {personal,user,domain} | extract the personal name, user and domain as a map (needs javax.mail jar) -| apoc.data.domain(email_or_url) | *deprecated* returns domain part of the value |=== [[text-functions-text-similarity]] @@ -385,24 +384,6 @@ The `valid` parameter will accept the following regex patterns, alternatively yo RETURN apoc.text.random(10, "A-Z0-9.$") ---- -[[text-functions-extract-domain]] -== Extract Domain - -The User Function `apoc.data.domain` will take a url or email address and try to determine the domain name. -This can be useful to make easier correlations and equality tests between differently formatted email addresses, and between urls to the same domains but specifying different locations. - -[source,cypher] ----- -WITH 'foo@bar.com' AS email -RETURN apoc.data.domain(email) // will return 'bar.com' ----- - -[source,cypher] ----- -WITH 'http://www.example.com/all-the-things' AS url -RETURN apoc.data.domain(url) // will return 'www.example.com' ----- - [[text-functions-hashing]] == Hashing Functions diff --git a/docs/asciidoc/modules/ROOT/pages/operational/index.adoc b/docs/asciidoc/modules/ROOT/pages/operational/index.adoc index 8f89545d70..8c1dad667f 100644 --- a/docs/asciidoc/modules/ROOT/pages/operational/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/operational/index.adoc @@ -7,5 +7,4 @@ For more information on how to use these procedures, see: * xref::operational/init-script.adoc[] -* xref::operational/warmup.adoc[] * xref::operational/log.adoc[] diff --git a/docs/asciidoc/modules/ROOT/pages/operational/warmup.adoc b/docs/asciidoc/modules/ROOT/pages/operational/warmup.adoc deleted file mode 100644 index bd2c8e0e62..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/operational/warmup.adoc +++ /dev/null @@ -1,10 +0,0 @@ -[[warmup]] -= Warmup -:description: This section describes a procedure that can be used to warm up the database. - - -[separator=¦,opts=header,cols="5,1m,1m"] -|=== -¦Qualified Name¦Type¦Release -include::example$generated-documentation/apoc.warmup.run.adoc[] -|=== diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.algo/apoc.algo.dijkstraWithDefaultWeight.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.algo/apoc.algo.dijkstraWithDefaultWeight.adoc deleted file mode 100644 index 8486651a78..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.algo/apoc.algo.dijkstraWithDefaultWeight.adoc +++ /dev/null @@ -1,40 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.algo.dijkstraWithDefaultWeight -:description: This section contains reference documentation for the apoc.algo.dijkstraWithDefaultWeight procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS|', 'distance', 10) YIELD path, weight - run dijkstra with relationship property name as cost function and a default weight if the property does not exist - -== Signature - -[source] ----- -apoc.algo.dijkstraWithDefaultWeight(startNode :: NODE?, endNode :: NODE?, relationshipTypesAndDirections :: STRING?, weightPropertyName :: STRING?, defaultWeight :: FLOAT?) :: (path :: PATH?, weight :: FLOAT?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|startNode|NODE?|null -|endNode|NODE?|null -|relationshipTypesAndDirections|STRING?|null -|weightPropertyName|STRING?|null -|defaultWeight|FLOAT?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|path|PATH? -|weight|FLOAT? -|=== - -xref::algorithms/path-finding-procedures.adoc[More documentation of apoc.algo.dijkstraWithDefaultWeight,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.cluster/apoc.cluster.graph.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.cluster/apoc.cluster.graph.adoc deleted file mode 100644 index 1c726693b5..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.cluster/apoc.cluster.graph.adoc +++ /dev/null @@ -1,24 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.cluster.graph -:description: This section contains reference documentation for the apoc.cluster.graph procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -== Signature - -[source] ----- -apoc.cluster.graph() :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?) ----- - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|nodes|LIST? OF NODE? -|relationships|LIST? OF RELATIONSHIP? -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.cluster/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.cluster/index.adoc deleted file mode 100644 index a804fa922b..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.cluster/index.adoc +++ /dev/null @@ -1,17 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.cluster -:description: This section contains reference documentation for the apoc.cluster procedures. - -[.procedures, opts=header, cols='5a,1a,1a'] -|=== -| Qualified Name | Type | Release -|xref::overview/apoc.cluster/apoc.cluster.graph.adoc[apoc.cluster.graph icon:book[]] - - -|label:procedure[] -|label:apoc-full[] -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.coll/apoc.coll.reverse.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.coll/apoc.coll.reverse.adoc deleted file mode 100644 index 919f5f6cf0..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.coll/apoc.coll.reverse.adoc +++ /dev/null @@ -1,30 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.coll.reverse -:description: This section contains reference documentation for the apoc.coll.reverse function. - -label:function[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.coll.reverse(coll) - returns reversed list - -== Signature - -[source] ----- -apoc.coll.reverse(coll :: LIST? OF ANY?) :: (LIST? OF ANY?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|coll|LIST? OF ANY?|null -|=== - -[[usage-apoc.coll.reverse]] -== Usage Examples -include::partial$usage/apoc.coll.reverse.adoc[] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.create/apoc.create.vPattern.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.create/apoc.create.vPattern.adoc deleted file mode 100644 index e24865ba87..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.create/apoc.create.vPattern.adoc +++ /dev/null @@ -1,44 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.create.vPattern -:description: This section contains reference documentation for the apoc.create.vPattern procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,...}, {_labels:['LabelB'],key:value}) returns a virtual pattern - -== Signature - -[source] ----- -apoc.create.vPattern(from :: MAP?, relType :: STRING?, props :: MAP?, to :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|from|MAP?|null -|relType|STRING?|null -|props|MAP?|null -|to|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|from|NODE? -|rel|RELATIONSHIP? -|to|NODE? -|=== - -[[usage-apoc.create.vPattern]] -== Usage Examples -include::partial$usage/apoc.create.vPattern.adoc[] - -xref::virtual/virtual-nodes-rels.adoc[More documentation of apoc.create.vPattern,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.create/apoc.create.vPatternFull.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.create/apoc.create.vPatternFull.adoc deleted file mode 100644 index 149ec00e0b..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.create/apoc.create.vPatternFull.adoc +++ /dev/null @@ -1,46 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.create.vPatternFull -:description: This section contains reference documentation for the apoc.create.vPatternFull procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual pattern - -== Signature - -[source] ----- -apoc.create.vPatternFull(labelsN :: LIST? OF STRING?, n :: MAP?, relType :: STRING?, props :: MAP?, labelsM :: LIST? OF STRING?, m :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|labelsN|LIST? OF STRING?|null -|n|MAP?|null -|relType|STRING?|null -|props|MAP?|null -|labelsM|LIST? OF STRING?|null -|m|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|from|NODE? -|rel|RELATIONSHIP? -|to|NODE? -|=== - -[[usage-apoc.create.vPatternFull]] -== Usage Examples -include::partial$usage/apoc.create.vPatternFull.adoc[] - -xref::virtual/virtual-nodes-rels.adoc[More documentation of apoc.create.vPatternFull,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/apoc.custom.asFunction.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/apoc.custom.asFunction.adoc deleted file mode 100644 index 6ac25c8ec5..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/apoc.custom.asFunction.adoc +++ /dev/null @@ -1,37 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.custom.asFunction -:description: This section contains reference documentation for the apoc.custom.asFunction procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description) - register a custom cypher function - -== Signature - -[source] ----- -apoc.custom.asFunction(name :: STRING?, statement :: STRING?, outputs = :: STRING?, inputs = null :: LIST? OF LIST? OF STRING?, forceSingle = false :: BOOLEAN?, description = :: STRING?) :: VOID ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|name|STRING?|null -|statement|STRING?|null -|outputs|STRING?| -|inputs|LIST? OF LIST? OF STRING?|null -|forceSingle|BOOLEAN?|false -|description|STRING?| -|=== - -[[usage-apoc.custom.asFunction]] -== Usage Examples -include::partial$usage/apoc.custom.asFunction.adoc[] - -xref::cypher-execution/cypher-based-procedures-functions.adoc[More documentation of apoc.custom.asFunction,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/apoc.custom.asProcedure.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/apoc.custom.asProcedure.adoc deleted file mode 100644 index e3e777be5d..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/apoc.custom.asProcedure.adoc +++ /dev/null @@ -1,37 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.custom.asProcedure -:description: This section contains reference documentation for the apoc.custom.asProcedure procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description) - register a custom cypher procedure - -== Signature - -[source] ----- -apoc.custom.asProcedure(name :: STRING?, statement :: STRING?, mode = read :: STRING?, outputs = null :: LIST? OF LIST? OF STRING?, inputs = null :: LIST? OF LIST? OF STRING?, description = :: STRING?) :: VOID ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|name|STRING?|null -|statement|STRING?|null -|mode|STRING?|read -|outputs|LIST? OF LIST? OF STRING?|null -|inputs|LIST? OF LIST? OF STRING?|null -|description|STRING?| -|=== - -[[usage-apoc.custom.asProcedure]] -== Usage Examples -include::partial$usage/apoc.custom.asProcedure.adoc[] - -xref::cypher-execution/cypher-based-procedures-functions.adoc[More documentation of apoc.custom.asProcedure,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/index.adoc index a829b59147..2da58a0193 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.custom/index.adoc @@ -8,16 +8,6 @@ This file is generated by DocsTest, so don't change it! [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.custom/apoc.custom.asFunction.adoc[apoc.custom.asFunction icon:book[]] - -apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description) - register a custom cypher function -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.custom/apoc.custom.asProcedure.adoc[apoc.custom.asProcedure icon:book[]] - -apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description) - register a custom cypher procedure -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.custom/apoc.custom.declareFunction.adoc[apoc.custom.declareFunction icon:book[]] apoc.custom.declareFunction(signature, statement, forceSingle, description) - register a custom cypher function diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.cypher/apoc.cypher.runFirstColumn.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.cypher/apoc.cypher.runFirstColumn.adoc deleted file mode 100644 index 1231e4f5ab..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.cypher/apoc.cypher.runFirstColumn.adoc +++ /dev/null @@ -1,30 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.cypher.runFirstColumn -:description: This section contains reference documentation for the apoc.cypher.runFirstColumn function. - -label:function[] label:apoc-core[] label:deprecated[] - -[.emphasis] -use either apoc.cypher.runFirstColumnMany for a list return or apoc.cypher.runFirstColumnSingle for returning the first row of the first column - -== Signature - -[source] ----- -apoc.cypher.runFirstColumn(cypher :: STRING?, params :: MAP?, expectMultipleValues = true :: BOOLEAN?) :: (ANY?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|cypher|STRING?|null -|params|MAP?|null -|expectMultipleValues|BOOLEAN?|true -|=== - -xref::cypher-execution/index.adoc[More documentation of apoc.cypher.runFirstColumn,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.cypher/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.cypher/index.adoc index cf90bc727d..c469b9b7c7 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.cypher/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.cypher/index.adoc @@ -83,11 +83,6 @@ apoc.cypher.runTimeboxed('cypherStatement',\{params}, timeout) - abort kernelTra apoc.cypher.runWrite(statement, params) yield value - alias for apoc.cypher.doIt |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.cypher/apoc.cypher.runFirstColumn.adoc[apoc.cypher.runFirstColumn icon:book[]] - -use either apoc.cypher.runFirstColumnMany for a list return or apoc.cypher.runFirstColumnSingle for returning the first row of the first column -|label:function[] -|label:apoc-core[] |xref::overview/apoc.cypher/apoc.cypher.runFirstColumnMany.adoc[apoc.cypher.runFirstColumnMany icon:book[]] apoc.cypher.runFirstColumnMany(statement, params) - executes statement with given parameters, returns first column only collected into a list, params are available as identifiers diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.data/apoc.data.domain.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.data/apoc.data.domain.adoc deleted file mode 100644 index 581242abba..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.data/apoc.data.domain.adoc +++ /dev/null @@ -1,30 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.data.domain -:description: This section contains reference documentation for the apoc.data.domain function. - -label:function[] label:apoc-core[] - -[.emphasis] -apoc.data.domain('url_or_email_address') YIELD domain - extract the domain name from a url or an email address. If nothing was found, yield null. - -== Signature - -[source] ----- -apoc.data.domain(url_or_email_address :: STRING?) :: (STRING?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|url_or_email_address|STRING?|null -|=== - -[[usage-apoc.data.domain]] -== Usage Examples -include::partial$usage/apoc.data.domain.adoc[] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.data/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.data/index.adoc index fd3a5a14c9..8e64865c0d 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.data/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.data/index.adoc @@ -8,11 +8,6 @@ This file is generated by DocsTest, so don't change it! [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.data/apoc.data.domain.adoc[apoc.data.domain icon:book[]] - -apoc.data.domain('url_or_email_address') YIELD domain - extract the domain name from a url or an email address. If nothing was found, yield null. -|label:function[] -|label:apoc-core[] |xref::overview/apoc.data/apoc.data.email.adoc[apoc.data.email icon:book[]] apoc.data.email('email_address') as {personal,user,domain} - extract the personal name, user and domain as a map diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.expire.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.expire.adoc deleted file mode 100644 index 52004cb993..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.expire.adoc +++ /dev/null @@ -1,28 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.date.expire -:description: This section contains reference documentation for the apoc.date.expire procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -CALL apoc.date.expire(node,time,'time-unit') - expire node at specified time by setting :TTL label and `ttl` property - -== Signature - -[source] ----- -apoc.date.expire(node :: NODE?, time :: INTEGER?, timeUnit :: STRING?) :: VOID ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|node|NODE?|null -|time|INTEGER?|null -|timeUnit|STRING?|null -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.expireIn.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.expireIn.adoc deleted file mode 100644 index 53acad622d..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.expireIn.adoc +++ /dev/null @@ -1,28 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.date.expireIn -:description: This section contains reference documentation for the apoc.date.expireIn procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -CALL apoc.date.expireIn(node,time,'time-unit') - expire node after specified length of time time by setting :TTL label and `ttl` property - -== Signature - -[source] ----- -apoc.date.expireIn(node :: NODE?, timeDelta :: INTEGER?, timeUnit :: STRING?) :: VOID ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|node|NODE?|null -|timeDelta|INTEGER?|null -|timeUnit|STRING?|null -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.parseAsZonedDateTime.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.parseAsZonedDateTime.adoc deleted file mode 100644 index 1872d12d42..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/apoc.date.parseAsZonedDateTime.adoc +++ /dev/null @@ -1,28 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.date.parseAsZonedDateTime -:description: This section contains reference documentation for the apoc.date.parseAsZonedDateTime function. - -label:function[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') - parse date string using the specified format to specified timezone - -== Signature - -[source] ----- -apoc.date.parseAsZonedDateTime(time :: STRING?, format = yyyy-MM-dd HH:mm:ss :: STRING?, timezone = UTC :: STRING?) :: (DATETIME?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|time|STRING?|null -|format|STRING?|yyyy-MM-dd HH:mm:ss -|timezone|STRING?|UTC -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/index.adoc index cc89242c35..6ff2df184b 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.date/index.adoc @@ -8,16 +8,6 @@ This file is generated by DocsTest, so don't change it! [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.date/apoc.date.expire.adoc[apoc.date.expire icon:book[]] - -CALL apoc.date.expire(node,time,'time-unit') - expire node at specified time by setting :TTL label and `ttl` property -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.date/apoc.date.expireIn.adoc[apoc.date.expireIn icon:book[]] - -CALL apoc.date.expireIn(node,time,'time-unit') - expire node after specified length of time time by setting :TTL label and `ttl` property -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.date/apoc.date.add.adoc[apoc.date.add icon:book[]] apoc.date.add(12345, 'ms', -365, 'd') - given a timestamp in one time unit, adds a value of the specified time unit @@ -63,11 +53,6 @@ apoc.date.fromISO8601('yyyy-MM-ddTHH:mm:ss.SSSZ') - return number representation apoc.date.parse('2012-12-23','ms\|s\|m\|h\|d','yyyy-MM-dd') - parse date string using the specified format into the specified time unit |label:function[] |label:apoc-core[] -|xref::overview/apoc.date/apoc.date.parseAsZonedDateTime.adoc[apoc.date.parseAsZonedDateTime icon:book[]] - -apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') - parse date string using the specified format to specified timezone -|label:function[] -|label:apoc-core[] |xref::overview/apoc.date/apoc.date.systemTimezone.adoc[apoc.date.systemTimezone icon:book[]] apoc.date.systemTimezone() - returns the system timezone display name diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherAll.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherAll.adoc deleted file mode 100644 index 5e984f0f45..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherAll.adoc +++ /dev/null @@ -1,50 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.export.cypherAll -:description: This section contains reference documentation for the apoc.export.cypherAll procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.export.cypherAll(file,config) - exports whole database incl. indexes as cypher statements to the provided file - -== Signature - -[source] ----- -apoc.export.cypherAll(file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|file|STRING?|null -|config|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|file|STRING? -|batches|INTEGER? -|source|STRING? -|format|STRING? -|nodes|INTEGER? -|relationships|INTEGER? -|properties|INTEGER? -|time|INTEGER? -|rows|INTEGER? -|batchSize|INTEGER? -|cypherStatements|STRING? -|nodeStatements|STRING? -|relationshipStatements|STRING? -|schemaStatements|STRING? -|cleanupStatements|STRING? -|=== - -xref::export/cypher.adoc[More documentation of apoc.export.cypherAll,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherData.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherData.adoc deleted file mode 100644 index 2652535c01..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherData.adoc +++ /dev/null @@ -1,52 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.export.cypherData -:description: This section contains reference documentation for the apoc.export.cypherData procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.export.cypherData(nodes,rels,file,config) - exports given nodes and relationships incl. indexes as cypher statements to the provided file - -== Signature - -[source] ----- -apoc.export.cypherData(nodes :: LIST? OF NODE?, rels :: LIST? OF RELATIONSHIP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|nodes|LIST? OF NODE?|null -|rels|LIST? OF RELATIONSHIP?|null -|file|STRING?|null -|config|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|file|STRING? -|batches|INTEGER? -|source|STRING? -|format|STRING? -|nodes|INTEGER? -|relationships|INTEGER? -|properties|INTEGER? -|time|INTEGER? -|rows|INTEGER? -|batchSize|INTEGER? -|cypherStatements|STRING? -|nodeStatements|STRING? -|relationshipStatements|STRING? -|schemaStatements|STRING? -|cleanupStatements|STRING? -|=== - -xref::export/cypher.adoc[More documentation of apoc.export.cypherData,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherGraph.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherGraph.adoc deleted file mode 100644 index 1a51a8697b..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherGraph.adoc +++ /dev/null @@ -1,51 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.export.cypherGraph -:description: This section contains reference documentation for the apoc.export.cypherGraph procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.export.cypherGraph(graph,file,config) - exports given graph object incl. indexes as cypher statements to the provided file - -== Signature - -[source] ----- -apoc.export.cypherGraph(graph :: MAP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|graph|MAP?|null -|file|STRING?|null -|config|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|file|STRING? -|batches|INTEGER? -|source|STRING? -|format|STRING? -|nodes|INTEGER? -|relationships|INTEGER? -|properties|INTEGER? -|time|INTEGER? -|rows|INTEGER? -|batchSize|INTEGER? -|cypherStatements|STRING? -|nodeStatements|STRING? -|relationshipStatements|STRING? -|schemaStatements|STRING? -|cleanupStatements|STRING? -|=== - -xref::export/cypher.adoc[More documentation of apoc.export.cypherGraph,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherQuery.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherQuery.adoc deleted file mode 100644 index 935198d287..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.export/apoc.export.cypherQuery.adoc +++ /dev/null @@ -1,51 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.export.cypherQuery -:description: This section contains reference documentation for the apoc.export.cypherQuery procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.export.cypherQuery(query,file,config) - exports nodes and relationships from the cypher kernelTransaction incl. indexes as cypher statements to the provided file - -== Signature - -[source] ----- -apoc.export.cypherQuery(query :: STRING?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|query|STRING?|null -|file|STRING?|null -|config|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|file|STRING? -|batches|INTEGER? -|source|STRING? -|format|STRING? -|nodes|INTEGER? -|relationships|INTEGER? -|properties|INTEGER? -|time|INTEGER? -|rows|INTEGER? -|batchSize|INTEGER? -|cypherStatements|STRING? -|nodeStatements|STRING? -|relationshipStatements|STRING? -|schemaStatements|STRING? -|cleanupStatements|STRING? -|=== - -xref::export/cypher.adoc[More documentation of apoc.export.cypherQuery,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.load/apoc.load.jdbcParams.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.load/apoc.load.jdbcParams.adoc deleted file mode 100644 index ecb1d2ab39..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.load/apoc.load.jdbcParams.adoc +++ /dev/null @@ -1,38 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.load.jdbcParams -:description: This section contains reference documentation for the apoc.load.jdbcParams procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -deprecated - please use: apoc.load.jdbc('key or url','',[params]) YIELD row - load from relational database, from a sql statement with parameters - -== Signature - -[source] ----- -apoc.load.jdbcParams(jdbc :: STRING?, sql :: STRING?, params :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|jdbc|STRING?|null -|sql|STRING?|null -|params|LIST? OF ANY?|null -|config|MAP?|{} -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|row|MAP? -|=== - -xref::database-integration/load-jdbc.adoc[More documentation of apoc.load.jdbcParams,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.math/apoc.math.round.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.math/apoc.math.round.adoc deleted file mode 100644 index 84ac0b4f7f..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.math/apoc.math.round.adoc +++ /dev/null @@ -1,34 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.math.round -:description: This section contains reference documentation for the apoc.math.round function. - -label:function[] label:apoc-core[] - -[.emphasis] -apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY]) - -== Signature - -[source] ----- -apoc.math.round(value :: FLOAT?, precision = 0 :: INTEGER?, mode = HALF_UP :: STRING?) :: (FLOAT?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|value|FLOAT?|null -|precision|INTEGER?|0 -|mode|STRING?|HALF_UP -|=== - -[[usage-apoc.math.round]] -== Usage Examples -include::partial$usage/apoc.math.round.adoc[] - -xref::mathematical/math-functions.adoc[More documentation of apoc.math.round,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.math/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.math/index.adoc index aa02d4f931..b535614dfa 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.math/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.math/index.adoc @@ -68,11 +68,6 @@ apoc.math.minInt() \| return the minimum value an int can have apoc.math.minLong() \| return the minimum value a long can have |label:function[] |label:apoc-core[] -|xref::overview/apoc.math/apoc.math.round.adoc[apoc.math.round icon:book[]] - -apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY]) -|label:function[] -|label:apoc-core[] |xref::overview/apoc.math/apoc.math.sech.adoc[apoc.math.sech icon:book[]] apoc.math.sech(val) \| returns the hyperbolic secant diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.isType.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.isType.adoc deleted file mode 100644 index 034eb7c1fc..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.isType.adoc +++ /dev/null @@ -1,27 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.meta.isType -:description: This section contains reference documentation for the apoc.meta.isType function. - -label:function[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.meta.isType(value,type) - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) - -== Signature - -[source] ----- -apoc.meta.isType(value :: ANY?, type :: STRING?) :: (BOOLEAN?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|value|ANY?|null -|type|STRING?|null -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.type.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.type.adoc deleted file mode 100644 index 999d511a0f..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.type.adoc +++ /dev/null @@ -1,26 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.meta.type -:description: This section contains reference documentation for the apoc.meta.type function. - -label:function[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.meta.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) - -== Signature - -[source] ----- -apoc.meta.type(value :: ANY?) :: (STRING?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|value|ANY?|null -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.typeName.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.typeName.adoc deleted file mode 100644 index 70ad60f211..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.typeName.adoc +++ /dev/null @@ -1,26 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.meta.typeName -:description: This section contains reference documentation for the apoc.meta.typeName function. - -label:function[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.meta.typeName(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) - -== Signature - -[source] ----- -apoc.meta.typeName(value :: ANY?) :: (STRING?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|value|ANY?|null -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.types.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.types.adoc deleted file mode 100644 index 345413ab25..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/apoc.meta.types.adoc +++ /dev/null @@ -1,26 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.meta.types -:description: This section contains reference documentation for the apoc.meta.types function. - -label:function[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.meta.types(node-relationship-map) - returns a map of keys to types - -== Signature - -[source] ----- -apoc.meta.types(properties :: ANY?) :: (MAP?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|properties|ANY?|null -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/index.adoc index 1488e5bb1c..43e9d814c8 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.meta/index.adoc @@ -73,30 +73,10 @@ apoc.meta.cypher.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEA apoc.meta.cypher.types(node-relationship-map) - returns a map of keys to types |label:function[] |label:apoc-core[] -|xref::overview/apoc.meta/apoc.meta.isType.adoc[apoc.meta.isType icon:book[]] - -apoc.meta.isType(value,type) - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -|label:function[] -|label:apoc-core[] |xref::overview/apoc.meta/apoc.meta.nodes.count.adoc[apoc.meta.nodes.count icon:book[]] apoc.meta.nodes.count([labels], $config) - Returns the sum of the nodes with a label present in the list. |label:function[] |label:apoc-core[] -|xref::overview/apoc.meta/apoc.meta.type.adoc[apoc.meta.type icon:book[]] - -apoc.meta.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -|label:function[] -|label:apoc-core[] -|xref::overview/apoc.meta/apoc.meta.typeName.adoc[apoc.meta.typeName icon:book[]] - -apoc.meta.typeName(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -|label:function[] -|label:apoc-core[] -|xref::overview/apoc.meta/apoc.meta.types.adoc[apoc.meta.types icon:book[]] - -apoc.meta.types(node-relationship-map) - returns a map of keys to types -|label:function[] -|label:apoc-core[] |=== diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.count.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.count.adoc deleted file mode 100644 index 90f0a7e5fa..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.count.adoc +++ /dev/null @@ -1,45 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.mongodb.count -:description: This section contains reference documentation for the apoc.mongodb.count procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.mongodb.count(host-or-key,db,collection,query) yield value - perform a find operation on mongodb collection - -== Signature - -[source] ----- -apoc.mongodb.count(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|host|STRING?|null -|db|STRING?|null -|collection|STRING?|null -|query|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|value|INTEGER? -|=== - -== Install Dependencies -include::partial$mongodb-dependencies.adoc[] - -[[usage-apoc.mongodb.count]] -== Usage Examples -include::partial$usage/apoc.mongodb.count.adoc[] - -xref::database-integration/mongodb.adoc[More documentation of apoc.mongodb.count,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.delete.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.delete.adoc deleted file mode 100644 index 8378203907..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.delete.adoc +++ /dev/null @@ -1,45 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.mongodb.delete -:description: This section contains reference documentation for the apoc.mongodb.delete procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.mongodb.delete(host-or-key,db,collection,query) - delete the given documents from the mongodb collection and returns the number of affected documents - -== Signature - -[source] ----- -apoc.mongodb.delete(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|host|STRING?|null -|db|STRING?|null -|collection|STRING?|null -|query|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|value|INTEGER? -|=== - -== Install Dependencies -include::partial$mongodb-dependencies.adoc[] - -[[usage-apoc.mongodb.delete]] -== Usage Examples -include::partial$usage/apoc.mongodb.delete.adoc[] - -xref::database-integration/mongodb.adoc[More documentation of apoc.mongodb.delete,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.find.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.find.adoc deleted file mode 100644 index 76f52171b5..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.find.adoc +++ /dev/null @@ -1,52 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.mongodb.find -:description: This section contains reference documentation for the apoc.mongodb.find procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.mongodb.find(host-or-key,db,collection,query,projection,sort,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a find,project,sort operation on mongodb collection - -== Signature - -[source] ----- -apoc.mongodb.find(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, project :: MAP?, sort :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|host|STRING?|null -|db|STRING?|null -|collection|STRING?|null -|query|MAP?|null -|project|MAP?|null -|sort|MAP?|null -|compatibleValues|BOOLEAN?|false -|skip|INTEGER?|0 -|limit|INTEGER?|0 -|extractReferences|BOOLEAN?|false -|objectIdAsMap|BOOLEAN?|true -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|value|MAP? -|=== - -== Install Dependencies -include::partial$mongodb-dependencies.adoc[] - -[[usage-apoc.mongodb.find]] -== Usage Examples -include::partial$usage/apoc.mongodb.find.adoc[] - -xref::database-integration/mongodb.adoc[More documentation of apoc.mongodb.find,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.first.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.first.adoc deleted file mode 100644 index ebd485f4e4..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.first.adoc +++ /dev/null @@ -1,48 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.mongodb.first -:description: This section contains reference documentation for the apoc.mongodb.first procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.mongodb.first(host-or-key,db,collection,query,[compatibleValues=false|true],[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a first operation on mongodb collection - -== Signature - -[source] ----- -apoc.mongodb.first(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = true :: BOOLEAN?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|host|STRING?|null -|db|STRING?|null -|collection|STRING?|null -|query|MAP?|null -|compatibleValues|BOOLEAN?|true -|extractReferences|BOOLEAN?|false -|objectIdAsMap|BOOLEAN?|true -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|value|MAP? -|=== - -== Install Dependencies -include::partial$mongodb-dependencies.adoc[] - -[[usage-apoc.mongodb.first]] -== Usage Examples -include::partial$usage/apoc.mongodb.first.adoc[] - -xref::database-integration/mongodb.adoc[More documentation of apoc.mongodb.first,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.get.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.get.adoc deleted file mode 100644 index e98b5ca726..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.get.adoc +++ /dev/null @@ -1,50 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.mongodb.get -:description: This section contains reference documentation for the apoc.mongodb.get procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.mongodb.get(host-or-key,db,collection,query,[compatibleValues=false|true],skip-or-null,limit-or-null,[extractReferences=false|true],[objectIdAsMap=true|false]) yield value - perform a find operation on mongodb collection - -== Signature - -[source] ----- -apoc.mongodb.get(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?, extractReferences = false :: BOOLEAN?, objectIdAsMap = true :: BOOLEAN?) :: (value :: MAP?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|host|STRING?|null -|db|STRING?|null -|collection|STRING?|null -|query|MAP?|null -|compatibleValues|BOOLEAN?|false -|skip|INTEGER?|0 -|limit|INTEGER?|0 -|extractReferences|BOOLEAN?|false -|objectIdAsMap|BOOLEAN?|true -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|value|MAP? -|=== - -== Install Dependencies -include::partial$mongodb-dependencies.adoc[] - -[[usage-apoc.mongodb.get]] -== Usage Examples -include::partial$usage/apoc.mongodb.get.adoc[] - -xref::database-integration/mongodb.adoc[More documentation of apoc.mongodb.get,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.insert.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.insert.adoc deleted file mode 100644 index 78095712e9..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.insert.adoc +++ /dev/null @@ -1,38 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.mongodb.insert -:description: This section contains reference documentation for the apoc.mongodb.insert procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.mongodb.insert(host-or-key,db,collection,documents) - inserts the given documents into the mongodb collection - -== Signature - -[source] ----- -apoc.mongodb.insert(host :: STRING?, db :: STRING?, collection :: STRING?, documents :: LIST? OF MAP?) :: VOID ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|host|STRING?|null -|db|STRING?|null -|collection|STRING?|null -|documents|LIST? OF MAP?|null -|=== - -== Install Dependencies -include::partial$mongodb-dependencies.adoc[] - -[[usage-apoc.mongodb.insert]] -== Usage Examples -include::partial$usage/apoc.mongodb.insert.adoc[] - -xref::database-integration/mongodb.adoc[More documentation of apoc.mongodb.insert,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.update.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.update.adoc deleted file mode 100644 index c8ebaf3fb8..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/apoc.mongodb.update.adoc +++ /dev/null @@ -1,46 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.mongodb.update -:description: This section contains reference documentation for the apoc.mongodb.update procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.mongodb.update(host-or-key,db,collection,query,update) - updates the given documents from the mongodb collection and returns the number of affected documents - -== Signature - -[source] ----- -apoc.mongodb.update(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, update :: MAP?) :: (value :: INTEGER?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|host|STRING?|null -|db|STRING?|null -|collection|STRING?|null -|query|MAP?|null -|update|MAP?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|value|INTEGER? -|=== - -== Install Dependencies -include::partial$mongodb-dependencies.adoc[] - -[[usage-apoc.mongodb.update]] -== Usage Examples -include::partial$usage/apoc.mongodb.update.adoc[] - -xref::database-integration/mongodb.adoc[More documentation of apoc.mongodb.update,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/index.adoc index 3bc67a9ea7..7431f0722f 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.mongodb/index.adoc @@ -8,45 +8,10 @@ This file is generated by DocsTest, so don't change it! [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.mongodb/apoc.mongodb.count.adoc[apoc.mongodb.count icon:book[]] - -apoc.mongodb.count(host-or-key,db,collection,query) yield value - perform a find operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.delete.adoc[apoc.mongodb.delete icon:book[]] - -apoc.mongodb.delete(host-or-key,db,collection,query) - delete the given documents from the mongodb collection and returns the number of affected documents -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.find.adoc[apoc.mongodb.find icon:book[]] - -apoc.mongodb.find(host-or-key,db,collection,query,projection,sort,[compatibleValues=false\|true],skip-or-null,limit-or-null,[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a find,project,sort operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.first.adoc[apoc.mongodb.first icon:book[]] - -apoc.mongodb.first(host-or-key,db,collection,query,[compatibleValues=false\|true],[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a first operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.get.adoc[apoc.mongodb.get icon:book[]] - -apoc.mongodb.get(host-or-key,db,collection,query,[compatibleValues=false\|true],skip-or-null,limit-or-null,[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a find operation on mongodb collection -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.mongodb/apoc.mongodb.get.byObjectId.adoc[apoc.mongodb.get.byObjectId icon:book[]] apoc.mongodb.get.byObjectId(hostOrKey, db, collection, objectIdValue, config(default:{})) - get the document by Object id value |label:procedure[] |label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.insert.adoc[apoc.mongodb.insert icon:book[]] - -apoc.mongodb.insert(host-or-key,db,collection,documents) - inserts the given documents into the mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.update.adoc[apoc.mongodb.update icon:book[]] - -apoc.mongodb.update(host-or-key,db,collection,query,update) - updates the given documents from the mongodb collection and returns the number of affected documents -|label:procedure[] -|label:apoc-full[] |=== diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/apoc.periodic.rock_n_roll.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/apoc.periodic.rock_n_roll.adoc deleted file mode 100644 index ff70004e97..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/apoc.periodic.rock_n_roll.adoc +++ /dev/null @@ -1,49 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.periodic.rock_n_roll -:description: This section contains reference documentation for the apoc.periodic.rock_n_roll procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows - -== Signature - -[source] ----- -apoc.periodic.rock_n_roll(cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?, updateStatistics :: MAP?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|cypherIterate|STRING?|null -|cypherAction|STRING?|null -|batchSize|INTEGER?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|batches|INTEGER? -|total|INTEGER? -|timeTaken|INTEGER? -|committedOperations|INTEGER? -|failedOperations|INTEGER? -|failedBatches|INTEGER? -|retries|INTEGER? -|errorMessages|MAP? -|batch|MAP? -|operations|MAP? -|wasTerminated|BOOLEAN? -|failedParams|MAP? -|updateStatistics|MAP? -|=== - -xref::graph-updates/periodic-execution.adoc#periodic-rock-n-roll[More documentation of apoc.periodic.rock_n_roll,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/apoc.periodic.rock_n_roll_while.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/apoc.periodic.rock_n_roll_while.adoc deleted file mode 100644 index 9f08b064f9..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/apoc.periodic.rock_n_roll_while.adoc +++ /dev/null @@ -1,38 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.periodic.rock_n_roll_while -:description: This section contains reference documentation for the apoc.periodic.rock_n_roll_while procedure. - -label:procedure[] label:apoc-full[] label:deprecated[] - -[.emphasis] -apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows - -== Signature - -[source] ----- -apoc.periodic.rock_n_roll_while(cypherLoop :: STRING?, cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (loop :: ANY?, batches :: INTEGER?, total :: INTEGER?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|cypherLoop|STRING?|null -|cypherIterate|STRING?|null -|cypherAction|STRING?|null -|batchSize|INTEGER?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|loop|ANY? -|batches|INTEGER? -|total|INTEGER? -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/index.adoc index db1b4e4358..c034125198 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.periodic/index.adoc @@ -38,16 +38,6 @@ apoc.periodic.list - list all jobs apoc.periodic.repeat('name',statement,repeat-rate-in-seconds, config) submit a repeatedly-called background statement. Fourth parameter 'config' is optional and can contain 'params' entry for nested statement. |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.periodic/apoc.periodic.rock_n_roll.adoc[apoc.periodic.rock_n_roll icon:book[]] - -apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.periodic/apoc.periodic.rock_n_roll_while.adoc[apoc.periodic.rock_n_roll_while icon:book[]] - -apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.periodic/apoc.periodic.submit.adoc[apoc.periodic.submit icon:book[]] apoc.periodic.submit('name',statement,params) - submit a one-off background statement; parameter 'params' is optional and can contain query parameters for Cypher statement diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.refactor/apoc.refactor.cloneNodesWithRelationships.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.refactor/apoc.refactor.cloneNodesWithRelationships.adoc deleted file mode 100644 index d73fae05a1..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.refactor/apoc.refactor.cloneNodesWithRelationships.adoc +++ /dev/null @@ -1,37 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.refactor.cloneNodesWithRelationships -:description: This section contains reference documentation for the apoc.refactor.cloneNodesWithRelationships procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) clone nodes with their labels, properties and relationships - -== Signature - -[source] ----- -apoc.refactor.cloneNodesWithRelationships(nodes :: LIST? OF NODE?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|nodes|LIST? OF NODE?|null -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|input|INTEGER? -|output|NODE? -|error|STRING? -|=== - -xref::graph-updates/graph-refactoring/clone-nodes.adoc[More documentation of apoc.refactor.cloneNodesWithRelationships,role=more information] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.refactor/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.refactor/index.adoc index 31ba0f8764..c92532a51c 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.refactor/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.refactor/index.adoc @@ -18,11 +18,6 @@ apoc.refactor.categorize(sourceKey, type, outgoing, label, targetKey, copiedKeys apoc.refactor.cloneNodes([node1,node2,...]) clone nodes with their labels and properties |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.refactor/apoc.refactor.cloneNodesWithRelationships.adoc[apoc.refactor.cloneNodesWithRelationships icon:book[]] - -apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) clone nodes with their labels, properties and relationships -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.refactor/apoc.refactor.cloneSubgraph.adoc[apoc.refactor.cloneSubgraph icon:book[]] apoc.refactor.cloneSubgraph([node1,node2,...], [rel1,rel2,...]:[], {standinNodes:[], skipProperties:[]}) YIELD input, output, error \| clone nodes with their labels and properties (optionally skipping any properties in the skipProperties list via the config map), and clone the given relationships (will exist between cloned nodes only). If no relationships are provided, all relationships between the given nodes will be cloned. Relationships can be optionally redirected according to standinNodes node pairings (this is a list of list-pairs of nodes), so given a node in the original subgraph (first of the pair), an existing node (second of the pair) can act as a standin for it within the cloned subgraph. Cloned relationships will be redirected to the standin. diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.static/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.static/index.adoc index 03d57a3227..9b7fc84f08 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.static/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.static/index.adoc @@ -8,11 +8,6 @@ This file is generated by DocsTest, so don't change it! [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.static/apoc.static.get.adoc[apoc.static.get icon:book[]] - -apoc.static.get(name) - returns statically stored value from config (apoc.static.) or server lifetime storage -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.static/apoc.static.list.adoc[apoc.static.list icon:book[]] apoc.static.list(prefix) - returns statically stored values from config (apoc.static..*) or server lifetime storage diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.text/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.text/index.adoc index fbb5b182c7..cbe6e2b8f1 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.text/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.text/index.adoc @@ -8,16 +8,6 @@ This file is generated by DocsTest, so don't change it! [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.text/apoc.text.doubleMetaphone.adoc[apoc.text.doubleMetaphone icon:book[]] - -apoc.text.doubleMetaphone(value) yield value - Compute the Double Metaphone phonetic encoding of all words of the text value which can be a single string or a list of strings -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.text/apoc.text.phonetic.adoc[apoc.text.phonetic icon:book[]] - -apoc.text.phonetic(value) yield value - Compute the US_ENGLISH phonetic soundex encoding of all words of the text value which can be a single string or a list of strings -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.text/apoc.text.phoneticDelta.adoc[apoc.text.phoneticDelta icon:book[]] apoc.text.phoneticDelta(text1, text2) yield phonetic1, phonetic2, delta - Compute the US_ENGLISH soundex character difference between two given strings diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/apoc.warmup.run.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/apoc.warmup.run.adoc deleted file mode 100644 index 52249464a8..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/apoc.warmup.run.adoc +++ /dev/null @@ -1,70 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.warmup.run -:description: This section contains reference documentation for the apoc.warmup.run procedure. - -label:procedure[] label:apoc-core[] - -[.emphasis] -apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time - -== Signature - -[source] ----- -apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|loadProperties|BOOLEAN?|false -|loadDynamicProperties|BOOLEAN?|false -|loadIndexes|BOOLEAN?|false -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|pageSize|INTEGER? -|totalTime|INTEGER? -|transactionWasTerminated|BOOLEAN? -|nodesPerPage|INTEGER? -|nodesTotal|INTEGER? -|nodePages|INTEGER? -|nodesTime|INTEGER? -|relsPerPage|INTEGER? -|relsTotal|INTEGER? -|relPages|INTEGER? -|relsTime|INTEGER? -|relGroupsPerPage|INTEGER? -|relGroupsTotal|INTEGER? -|relGroupPages|INTEGER? -|relGroupsTime|INTEGER? -|propertiesLoaded|BOOLEAN? -|dynamicPropertiesLoaded|BOOLEAN? -|propsPerPage|INTEGER? -|propRecordsTotal|INTEGER? -|propPages|INTEGER? -|propsTime|INTEGER? -|stringPropsPerPage|INTEGER? -|stringPropRecordsTotal|INTEGER? -|stringPropPages|INTEGER? -|stringPropsTime|INTEGER? -|arrayPropsPerPage|INTEGER? -|arrayPropRecordsTotal|INTEGER? -|arrayPropPages|INTEGER? -|arrayPropsTime|INTEGER? -|indexesLoaded|BOOLEAN? -|indexPages|INTEGER? -|indexTime|INTEGER? -|=== - -[[usage-apoc.warmup.run]] -== Usage Examples -include::partial$usage/apoc.warmup.run.adoc[] - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/index.adoc deleted file mode 100644 index 752bbb4b8d..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/index.adoc +++ /dev/null @@ -1,17 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.warmup -:description: This section contains reference documentation for the apoc.warmup procedures. - -[.procedures, opts=header, cols='5a,1a,1a'] -|=== -| Qualified Name | Type | Release -|xref::overview/apoc.warmup/apoc.warmup.run.adoc[apoc.warmup.run icon:book[]] - -apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time -|label:procedure[] -|label:apoc-core[] -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.xml/apoc.xml.import.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.xml/apoc.xml.import.adoc deleted file mode 100644 index 98d7e66ebf..0000000000 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.xml/apoc.xml.import.adoc +++ /dev/null @@ -1,34 +0,0 @@ -//// -This file is generated by DocsTest, so don't change it! -//// - -= apoc.xml.import -:description: This section contains reference documentation for the apoc.xml.import procedure. - -label:procedure[] label:apoc-core[] label:deprecated[] - -[.emphasis] -Deprecated by apoc.import.xml - -== Signature - -[source] ----- -apoc.xml.import(url :: STRING?, config = {} :: MAP?) :: (node :: NODE?) ----- - -== Input parameters -[.procedures, opts=header] -|=== -| Name | Type | Default -|url|STRING?|null -|config|MAP?|{} -|=== - -== Output parameters -[.procedures, opts=header] -|=== -| Name | Type -|node|NODE? -|=== - diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.xml/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.xml/index.adoc index 4fbf0cfa2e..778885c585 100644 --- a/docs/asciidoc/modules/ROOT/pages/overview/apoc.xml/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.xml/index.adoc @@ -8,11 +8,6 @@ This file is generated by DocsTest, so don't change it! [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.xml/apoc.xml.import.adoc[apoc.xml.import icon:book[]] - -Deprecated by apoc.import.xml -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.xml/apoc.xml.parse.adoc[apoc.xml.parse icon:book[]] RETURN apoc.xml.parse(, , config, false) AS value diff --git a/docs/asciidoc/modules/ROOT/pages/temporal/datetime-conversions.adoc b/docs/asciidoc/modules/ROOT/pages/temporal/datetime-conversions.adoc index 0ecb023918..79c6a55743 100644 --- a/docs/asciidoc/modules/ROOT/pages/temporal/datetime-conversions.adoc +++ b/docs/asciidoc/modules/ROOT/pages/temporal/datetime-conversions.adoc @@ -38,7 +38,6 @@ include::example$generated-documentation/apoc.date.fields.adoc[] include::example$generated-documentation/apoc.date.format.adoc[] include::example$generated-documentation/apoc.date.fromISO8601.adoc[] include::example$generated-documentation/apoc.date.parse.adoc[] -include::example$generated-documentation/apoc.date.parseAsZonedDateTime.adoc[] include::example$generated-documentation/apoc.date.systemTimezone.adoc[] include::example$generated-documentation/apoc.date.toISO8601.adoc[] include::example$generated-documentation/apoc.date.toYears.adoc[] @@ -266,17 +265,6 @@ It accepts the following parameters: xref::overview/apoc.date/apoc.date.parse.adoc#usage-apoc.date.parse[View usage examples,role=more information] -[[datetime-available-procedures-apoc.date.parseAsZonedDateTime]] -=== `apoc.date.parseAsZonedDateTime` - -This function parses a date string in a specified format and converts it to a Neo4j-supported temporal type with date, time, and timezone. - -[NOTE] -==== -This function has been deprecated by `apoc.temporal.toZonedTemporal`, therefore it's recommended to use that one instead. -See xref::temporal/temporal-conversions.adoc[]. -==== - [[datetime-available-procedures-apoc.date.systemTimezone]] === `apoc.date.systemTimezone` diff --git a/docs/asciidoc/modules/ROOT/pages/transaction/index.adoc b/docs/asciidoc/modules/ROOT/pages/transaction/index.adoc index 3fb9fce7d8..77dd175ebf 100644 --- a/docs/asciidoc/modules/ROOT/pages/transaction/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/transaction/index.adoc @@ -18,8 +18,6 @@ The list of procedures that start their own transaction: * apoc.nodes.delete * apoc.nodes.group * apoc.periodic.iterate -* apoc.periodic.rock_n_roll -* apoc.periodic.rock_n_roll_while * apoc.refactor.categorize * apoc.schema.properties.distinctCount * apoc.stats.degrees diff --git a/docs/asciidoc/modules/ROOT/pages/virtual/virtual-nodes-rels.adoc b/docs/asciidoc/modules/ROOT/pages/virtual/virtual-nodes-rels.adoc index b15fcbc24e..ae2a28e53d 100644 --- a/docs/asciidoc/modules/ROOT/pages/virtual/virtual-nodes-rels.adoc +++ b/docs/asciidoc/modules/ROOT/pages/virtual/virtual-nodes-rels.adoc @@ -168,9 +168,6 @@ CALL apoc.create.virtualPath([labelA],{name: aName},rel_type,{since:2009},[label RETURN *; ---- -//update image once procedure is created -//image::apoc.create.vPatternFullTwo.png[scaledwidth="100%"] - [NOTE] ==== To update a virtual node you can use the xref::overview/apoc.create/apoc.create.setProperty.adoc[apoc.create.setProperty] or diff --git a/docs/asciidoc/modules/ROOT/partials/generated-documentation/documentation.adoc b/docs/asciidoc/modules/ROOT/partials/generated-documentation/documentation.adoc index 12111800a3..475fbfe81c 100644 --- a/docs/asciidoc/modules/ROOT/partials/generated-documentation/documentation.adoc +++ b/docs/asciidoc/modules/ROOT/partials/generated-documentation/documentation.adoc @@ -121,11 +121,6 @@ apoc.algo.cover(nodes) yield rel - returns all relationships between this set of apoc.algo.dijkstra(startNode, endNode, 'KNOWS\|', 'distance', defaultValue, numberOfWantedResults) YIELD path, weight - run dijkstra with relationship property name as cost function |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.algo/apoc.algo.dijkstraWithDefaultWeight.adoc[apoc.algo.dijkstraWithDefaultWeight icon:book[]] - -apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS\|', 'distance', 10) YIELD path, weight - run dijkstra with relationship property name as cost function and a default weight if the property does not exist -|label:procedure[] -|label:apoc-core[] |=== [discrete] @@ -215,19 +210,6 @@ apoc.bolt.load(url-or-key, kernelTransaction, params, config) - access to other |xref::overview/apoc.bolt/apoc.bolt.load.fromLocal.adoc[apoc.bolt.load.fromLocal icon:book[]] -|label:procedure[] -|label:apoc-full[] -|=== - -[discrete] -== xref::overview/apoc.cluster/index.adoc[] - -[.procedures, opts=header, cols='5a,1a,1a'] -|=== -| Qualified Name | Type | Release -|xref::overview/apoc.cluster/apoc.cluster.graph.adoc[apoc.cluster.graph icon:book[]] - - |label:procedure[] |label:apoc-full[] |=== @@ -417,11 +399,6 @@ apoc.coll.remove(coll, index, [length=1]) \| remove range of values from index t apoc.coll.removeAll(first, second) - returns first list with all elements of second list removed |label:function[] |label:apoc-core[] -|xref::overview/apoc.coll/apoc.coll.reverse.adoc[apoc.coll.reverse icon:book[]] - -apoc.coll.reverse(coll) - returns reversed list -|label:function[] -|label:apoc-core[] |xref::overview/apoc.coll/apoc.coll.runningTotal.adoc[apoc.coll.runningTotal icon:book[]] apoc.coll.runningTotal(list1) - returns an accumulative array. For example apoc.coll.runningTotal([1,2,3.5]) return [1,3,6.5] @@ -781,26 +758,6 @@ apoc.create.vNode(['Label'], {key:value,...}) returns a virtual node apoc.create.vNodes(['Label'], [{key:value,...}]) returns virtual nodes |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.create/apoc.create.clonePathToVirtual.adoc[apoc.create.clonePathToVirtual icon:book[]] - -apoc.create.clonePathToVirtual -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.create/apoc.create.clonePathsToVirtual.adoc[apoc.create.clonePathsToVirtual icon:book[]] - -apoc.create.clonePathsToVirtual -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.create/apoc.create.vPattern.adoc[apoc.create.vPattern icon:book[]] - -apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,...}, {_labels:['LabelB'],key:value}) returns a virtual pattern -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.create/apoc.create.vPatternFull.adoc[apoc.create.vPatternFull icon:book[]] - -apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual pattern -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.create/apoc.create.vRelationship.adoc[apoc.create.vRelationship icon:book[]] apoc.create.vRelationship(nodeFrom,'KNOWS',{key:value,...}, nodeTo) returns a virtual relationship @@ -838,16 +795,6 @@ apoc.create.virtual.fromNode(node, [propertyNames]) returns a virtual node built [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.custom/apoc.custom.asFunction.adoc[apoc.custom.asFunction icon:book[]] - -apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description) - register a custom cypher function -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.custom/apoc.custom.asProcedure.adoc[apoc.custom.asProcedure icon:book[]] - -apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description) - register a custom cypher procedure -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.custom/apoc.custom.declareFunction.adoc[apoc.custom.declareFunction icon:book[]] apoc.custom.declareFunction(signature, statement, forceSingle, description) - register a custom cypher function @@ -955,11 +902,6 @@ apoc.cypher.runTimeboxed('cypherStatement',\{params}, timeout) - abort kernelTra apoc.cypher.runWrite(statement, params) yield value - alias for apoc.cypher.doIt |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.cypher/apoc.cypher.runFirstColumn.adoc[apoc.cypher.runFirstColumn icon:book[]] - -use either apoc.cypher.runFirstColumnMany for a list return or apoc.cypher.runFirstColumnSingle for returning the first row of the first column -|label:function[] -|label:apoc-core[] |xref::overview/apoc.cypher/apoc.cypher.runFirstColumnMany.adoc[apoc.cypher.runFirstColumnMany icon:book[]] apoc.cypher.runFirstColumnMany(statement, params) - executes statement with given parameters, returns first column only collected into a list, params are available as identifiers @@ -972,16 +914,12 @@ apoc.cypher.runFirstColumnSingle(statement, params) - executes statement with gi |label:apoc-core[] |=== +[discrete] == xref::overview/apoc.data/index.adoc[] [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.data/apoc.data.domain.adoc[apoc.data.domain icon:book[]] - -apoc.data.domain('url_or_email_address') YIELD domain - extract the domain name from a url or an email address. If nothing was found, yield null. -|label:function[] -|label:apoc-core[] |xref::overview/apoc.data/apoc.data.email.adoc[apoc.data.email icon:book[]] apoc.data.email('email_address') as {personal,user,domain} - extract the personal name, user and domain as a map @@ -999,16 +937,6 @@ apoc.data.url('url') as {protocol,host,port,path,query,file,anchor,user} \| turn [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.date/apoc.date.expire.adoc[apoc.date.expire icon:book[]] - -CALL apoc.date.expire(node,time,'time-unit') - expire node at specified time by setting :TTL label and `ttl` property -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.date/apoc.date.expireIn.adoc[apoc.date.expireIn icon:book[]] - -CALL apoc.date.expireIn(node,time,'time-unit') - expire node after specified length of time time by setting :TTL label and `ttl` property -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.date/apoc.date.add.adoc[apoc.date.add icon:book[]] apoc.date.add(12345, 'ms', -365, 'd') - given a timestamp in one time unit, adds a value of the specified time unit @@ -1054,11 +982,6 @@ apoc.date.fromISO8601('yyyy-MM-ddTHH:mm:ss.SSSZ') - return number representation apoc.date.parse('2012-12-23','ms\|s\|m\|h\|d','yyyy-MM-dd') - parse date string using the specified format into the specified time unit |label:function[] |label:apoc-core[] -|xref::overview/apoc.date/apoc.date.parseAsZonedDateTime.adoc[apoc.date.parseAsZonedDateTime icon:book[]] - -apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') - parse date string using the specified format to specified timezone -|label:function[] -|label:apoc-core[] |xref::overview/apoc.date/apoc.date.systemTimezone.adoc[apoc.date.systemTimezone icon:book[]] apoc.date.systemTimezone() - returns the system timezone display name @@ -1244,26 +1167,6 @@ apoc.export.cypher.query(query,file,config) - exports nodes and relationships fr apoc.export.cypher.schema(file,config) - exports all schema indexes and constraints to cypher |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.export/apoc.export.cypherAll.adoc[apoc.export.cypherAll icon:book[]] - -apoc.export.cypherAll(file,config) - exports whole database incl. indexes as cypher statements to the provided file -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.export/apoc.export.cypherData.adoc[apoc.export.cypherData icon:book[]] - -apoc.export.cypherData(nodes,rels,file,config) - exports given nodes and relationships incl. indexes as cypher statements to the provided file -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.export/apoc.export.cypherGraph.adoc[apoc.export.cypherGraph icon:book[]] - -apoc.export.cypherGraph(graph,file,config) - exports given graph object incl. indexes as cypher statements to the provided file -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.export/apoc.export.cypherQuery.adoc[apoc.export.cypherQuery icon:book[]] - -apoc.export.cypherQuery(query,file,config) - exports nodes and relationships from the cypher kernelTransaction incl. indexes as cypher statements to the provided file -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.export/apoc.export.graphml.all.adoc[apoc.export.graphml.all icon:book[]] apoc.export.graphml.all(file,config) - exports whole database as graphml to the provided file @@ -1573,11 +1476,6 @@ apoc.load.htmlPlainText('urlOrHtml',{name: jquery, name2: jquery}, config) YIELD apoc.load.jdbc('key or url','table or statement', params, config) YIELD row - load from relational database, from a full table or a sql statement |label:procedure[] |label:apoc-full[] -|xref::overview/apoc.load/apoc.load.jdbcParams.adoc[apoc.load.jdbcParams icon:book[]] - -deprecated - please use: apoc.load.jdbc('key or url','',[params]) YIELD row - load from relational database, from a sql statement with parameters -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.load/apoc.load.jdbcUpdate.adoc[apoc.load.jdbcUpdate icon:book[]] apoc.load.jdbcUpdate('key or url','statement',[params],config) YIELD row - update relational database, from a SQL statement with optional parameters @@ -1872,11 +1770,6 @@ apoc.math.minInt() \| return the minimum value an int can have apoc.math.minLong() \| return the minimum value a long can have |label:function[] |label:apoc-core[] -|xref::overview/apoc.math/apoc.math.round.adoc[apoc.math.round icon:book[]] - -apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY]) -|label:function[] -|label:apoc-core[] |xref::overview/apoc.math/apoc.math.sech.adoc[apoc.math.sech icon:book[]] apoc.math.sech(val) \| returns the hyperbolic secant @@ -2001,31 +1894,11 @@ apoc.meta.cypher.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEA apoc.meta.cypher.types(node-relationship-map) - returns a map of keys to types |label:function[] |label:apoc-core[] -|xref::overview/apoc.meta/apoc.meta.isType.adoc[apoc.meta.isType icon:book[]] - -apoc.meta.isType(value,type) - returns a row if type name matches none if not (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -|label:function[] -|label:apoc-core[] |xref::overview/apoc.meta/apoc.meta.nodes.count.adoc[apoc.meta.nodes.count icon:book[]] apoc.meta.nodes.count([labels], $config) - Returns the sum of the nodes with a label present in the list. |label:function[] |label:apoc-core[] -|xref::overview/apoc.meta/apoc.meta.type.adoc[apoc.meta.type icon:book[]] - -apoc.meta.type(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -|label:function[] -|label:apoc-core[] -|xref::overview/apoc.meta/apoc.meta.typeName.adoc[apoc.meta.typeName icon:book[]] - -apoc.meta.typeName(value) - type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST) -|label:function[] -|label:apoc-core[] -|xref::overview/apoc.meta/apoc.meta.types.adoc[apoc.meta.types icon:book[]] - -apoc.meta.types(node-relationship-map) - returns a map of keys to types -|label:function[] -|label:apoc-core[] |=== == xref::overview/apoc.metrics/index.adoc[] @@ -2105,46 +1978,11 @@ apoc.mongo.update(uri, query, update, $config) - updates the given documents fro [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.mongodb/apoc.mongodb.count.adoc[apoc.mongodb.count icon:book[]] - -apoc.mongodb.count(host-or-key,db,collection,query) yield value - perform a find operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.delete.adoc[apoc.mongodb.delete icon:book[]] - -apoc.mongodb.delete(host-or-key,db,collection,query) - delete the given documents from the mongodb collection and returns the number of affected documents -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.find.adoc[apoc.mongodb.find icon:book[]] - -apoc.mongodb.find(host-or-key,db,collection,query,projection,sort,[compatibleValues=false\|true],skip-or-null,limit-or-null,[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a find,project,sort operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.first.adoc[apoc.mongodb.first icon:book[]] - -apoc.mongodb.first(host-or-key,db,collection,query,[compatibleValues=false\|true],[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a first operation on mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.get.adoc[apoc.mongodb.get icon:book[]] - -apoc.mongodb.get(host-or-key,db,collection,query,[compatibleValues=false\|true],skip-or-null,limit-or-null,[extractReferences=false\|true],[objectIdAsMap=true\|false]) yield value - perform a find operation on mongodb collection -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.mongodb/apoc.mongodb.get.byObjectId.adoc[apoc.mongodb.get.byObjectId icon:book[]] apoc.mongodb.get.byObjectId(hostOrKey, db, collection, objectIdValue, config(default:{})) - get the document by Object id value |label:procedure[] |label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.insert.adoc[apoc.mongodb.insert icon:book[]] - -apoc.mongodb.insert(host-or-key,db,collection,documents) - inserts the given documents into the mongodb collection -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.mongodb/apoc.mongodb.update.adoc[apoc.mongodb.update icon:book[]] - -apoc.mongodb.update(host-or-key,db,collection,query,update) - updates the given documents from the mongodb collection and returns the number of affected documents -|label:procedure[] -|label:apoc-full[] |=== == xref::overview/apoc.monitor/index.adoc[] @@ -2561,16 +2399,6 @@ apoc.periodic.list - list all jobs apoc.periodic.repeat('name',statement,repeat-rate-in-seconds, config) submit a repeatedly-called background statement. Fourth parameter 'config' is optional and can contain 'params' entry for nested statement. |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.periodic/apoc.periodic.rock_n_roll.adoc[apoc.periodic.rock_n_roll icon:book[]] - -apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows -|label:procedure[] -|label:apoc-full[] -|xref::overview/apoc.periodic/apoc.periodic.rock_n_roll_while.adoc[apoc.periodic.rock_n_roll_while icon:book[]] - -apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total - run the action statement in batches over the iterator statement's results in a separate thread. Returns number of batches and total processed rows -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.periodic/apoc.periodic.submit.adoc[apoc.periodic.submit icon:book[]] apoc.periodic.submit('name',statement,params) - submit a one-off background statement; parameter 'params' is optional and can contain query parameters for Cypher statement @@ -2703,11 +2531,6 @@ apoc.redis.sadd(uri, key, members, \{config}) \| Execute the 'SADD key members' apoc.redis.scard(uri, key, \{config}) \| Execute the 'SCARD key' command |label:procedure[] |label:apoc-full[] -|xref::overview/apoc.redis/apoc.redis.getSet.adoc[apoc.redis.getSet icon:book[]] - -apoc.redis.getSet(uri, key, value, \{config}) \| Execute the 'SET key value' command and return old value stored (or null if did not exists) -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.redis/apoc.redis.smembers.adoc[apoc.redis.smembers icon:book[]] apoc.redis.smembers(uri, key, \{config}) \| Execute the 'SMEMBERS key' command @@ -2760,11 +2583,6 @@ apoc.refactor.categorize(sourceKey, type, outgoing, label, targetKey, copiedKeys apoc.refactor.cloneNodes([node1,node2,...]) clone nodes with their labels and properties |label:procedure[] |label:apoc-core[] -|xref::overview/apoc.refactor/apoc.refactor.cloneNodesWithRelationships.adoc[apoc.refactor.cloneNodesWithRelationships icon:book[]] - -apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) clone nodes with their labels, properties and relationships -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.refactor/apoc.refactor.cloneSubgraph.adoc[apoc.refactor.cloneSubgraph icon:book[]] apoc.refactor.cloneSubgraph([node1,node2,...], [rel1,rel2,...]:[], {standinNodes:[], skipProperties:[]}) YIELD input, output, error \| clone nodes with their labels and properties (optionally skipping any properties in the skipProperties list via the config map), and clone the given relationships (will exist between cloned nodes only). If no relationships are provided, all relationships between the given nodes will be cloned. Relationships can be optionally redirected according to standinNodes node pairings (this is a list of list-pairs of nodes), so given a node in the original subgraph (first of the pair), an existing node (second of the pair) can act as a standin for it within the cloned subgraph. Cloned relationships will be redirected to the standin. @@ -3008,11 +2826,6 @@ apoc.spatial.sortByDistance(List) sort the given paths based on the geo in [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.static/apoc.static.get.adoc[apoc.static.get icon:book[]] - -apoc.static.get(name) - returns statically stored value from config (apoc.static.) or server lifetime storage -|label:procedure[] -|label:apoc-full[] |xref::overview/apoc.static/apoc.static.list.adoc[apoc.static.list icon:book[]] apoc.static.list(prefix) - returns statically stored values from config (apoc.static..*) or server lifetime storage @@ -3098,16 +2911,6 @@ apoc.temporal.toZonedTemporal('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC- [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.text/apoc.text.doubleMetaphone.adoc[apoc.text.doubleMetaphone icon:book[]] - -apoc.text.doubleMetaphone(value) yield value - Compute the Double Metaphone phonetic encoding of all words of the text value which can be a single string or a list of strings -|label:procedure[] -|label:apoc-core[] -|xref::overview/apoc.text/apoc.text.phonetic.adoc[apoc.text.phonetic icon:book[]] - -apoc.text.phonetic(value) yield value - Compute the US_ENGLISH phonetic soundex encoding of all words of the text value which can be a single string or a list of strings -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.text/apoc.text.phoneticDelta.adoc[apoc.text.phoneticDelta icon:book[]] apoc.text.phoneticDelta(text1, text2) yield phonetic1, phonetic2, delta - Compute the US_ENGLISH soundex character difference between two given strings @@ -3499,30 +3302,12 @@ CALL apoc.uuid.removeAll() yield label, installed, properties \| it removes all |label:apoc-full[] |=== -[discrete] -== xref::overview/apoc.warmup/index.adoc[] - -[.procedures, opts=header, cols='5a,1a,1a'] -|=== -| Qualified Name | Type | Release -|xref::overview/apoc.warmup/apoc.warmup.run.adoc[apoc.warmup.run icon:book[]] - -apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time -|label:procedure[] -|label:apoc-core[] -|=== - [discrete] == xref::overview/apoc.xml/index.adoc[] [.procedures, opts=header, cols='5a,1a,1a'] |=== | Qualified Name | Type | Release -|xref::overview/apoc.xml/apoc.xml.import.adoc[apoc.xml.import icon:book[]] - -Deprecated by apoc.import.xml -|label:procedure[] -|label:apoc-core[] |xref::overview/apoc.xml/apoc.xml.parse.adoc[apoc.xml.parse icon:book[]] RETURN apoc.xml.parse(, , config, false) AS value diff --git a/docs/asciidoc/modules/ROOT/partials/generated-documentation/nav.adoc b/docs/asciidoc/modules/ROOT/partials/generated-documentation/nav.adoc index e4c6ccad3a..3ba1658b8f 100644 --- a/docs/asciidoc/modules/ROOT/partials/generated-documentation/nav.adoc +++ b/docs/asciidoc/modules/ROOT/partials/generated-documentation/nav.adoc @@ -25,7 +25,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.algo/apoc.algo.allSimplePaths.adoc[] *** xref::overview/apoc.algo/apoc.algo.cover.adoc[] *** xref::overview/apoc.algo/apoc.algo.dijkstra.adoc[] -*** xref::overview/apoc.algo/apoc.algo.dijkstraWithDefaultWeight.adoc[] ** xref::overview/apoc.any/index.adoc[] *** xref::overview/apoc.any/apoc.any.properties.adoc[] *** xref::overview/apoc.any/apoc.any.property.adoc[] @@ -42,8 +41,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.bolt/apoc.bolt.execute.adoc[] *** xref::overview/apoc.bolt/apoc.bolt.load.adoc[] *** xref::overview/apoc.bolt/apoc.bolt.load.fromLocal.adoc[] -** xref::overview/apoc.cluster/index.adoc[] -*** xref::overview/apoc.cluster/apoc.cluster.graph.adoc[] ** xref::overview/apoc.coll/index.adoc[] *** xref::overview/apoc.coll/apoc.coll.elements.adoc[] *** xref::overview/apoc.coll/apoc.coll.partition.adoc[] @@ -81,7 +78,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.coll/apoc.coll.randomItems.adoc[] *** xref::overview/apoc.coll/apoc.coll.remove.adoc[] *** xref::overview/apoc.coll/apoc.coll.removeAll.adoc[] -*** xref::overview/apoc.coll/apoc.coll.reverse.adoc[] *** xref::overview/apoc.coll/apoc.coll.runningTotal.adoc[] *** xref::overview/apoc.coll/apoc.coll.set.adoc[] *** xref::overview/apoc.coll/apoc.coll.shuffle.adoc[] @@ -152,10 +148,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.create/apoc.create.uuids.adoc[] *** xref::overview/apoc.create/apoc.create.vNode.adoc[] *** xref::overview/apoc.create/apoc.create.vNodes.adoc[] -*** xref::overview/apoc.create/apoc.create.clonePathToVirtual.adoc[] -*** xref::overview/apoc.create/apoc.create.clonePathsToVirtual.adoc[] -*** xref::overview/apoc.create/apoc.create.vPattern.adoc[] -*** xref::overview/apoc.create/apoc.create.vPatternFull.adoc[] *** xref::overview/apoc.create/apoc.create.vRelationship.adoc[] *** xref::overview/apoc.create/apoc.create.virtualPath.adoc[] *** xref::overview/apoc.create/apoc.create.uuid.adoc[] @@ -163,8 +155,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.create/apoc.create.vRelationship.adoc[] *** xref::overview/apoc.create/apoc.create.virtual.fromNode.adoc[] ** xref::overview/apoc.custom/index.adoc[] -*** xref::overview/apoc.custom/apoc.custom.asFunction.adoc[] -*** xref::overview/apoc.custom/apoc.custom.asProcedure.adoc[] *** xref::overview/apoc.custom/apoc.custom.declareFunction.adoc[] *** xref::overview/apoc.custom/apoc.custom.declareProcedure.adoc[] *** xref::overview/apoc.custom/apoc.custom.list.adoc[] @@ -186,16 +176,12 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.cypher/apoc.cypher.runSchemaFiles.adoc[] *** xref::overview/apoc.cypher/apoc.cypher.runTimeboxed.adoc[] *** xref::overview/apoc.cypher/apoc.cypher.runWrite.adoc[] -*** xref::overview/apoc.cypher/apoc.cypher.runFirstColumn.adoc[] *** xref::overview/apoc.cypher/apoc.cypher.runFirstColumnMany.adoc[] *** xref::overview/apoc.cypher/apoc.cypher.runFirstColumnSingle.adoc[] ** xref::overview/apoc.data/index.adoc[] -*** xref::overview/apoc.data/apoc.data.domain.adoc[] *** xref::overview/apoc.data/apoc.data.email.adoc[] *** xref::overview/apoc.data/apoc.data.url.adoc[] ** xref::overview/apoc.date/index.adoc[] -*** xref::overview/apoc.date/apoc.date.expire.adoc[] -*** xref::overview/apoc.date/apoc.date.expireIn.adoc[] *** xref::overview/apoc.date/apoc.date.add.adoc[] *** xref::overview/apoc.date/apoc.date.convert.adoc[] *** xref::overview/apoc.date/apoc.date.convertFormat.adoc[] @@ -205,7 +191,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.date/apoc.date.format.adoc[] *** xref::overview/apoc.date/apoc.date.fromISO8601.adoc[] *** xref::overview/apoc.date/apoc.date.parse.adoc[] -*** xref::overview/apoc.date/apoc.date.parseAsZonedDateTime.adoc[] *** xref::overview/apoc.date/apoc.date.systemTimezone.adoc[] *** xref::overview/apoc.date/apoc.date.toISO8601.adoc[] *** xref::overview/apoc.date/apoc.date.toYears.adoc[] @@ -240,10 +225,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.export/apoc.export.cypher.graph.adoc[] *** xref::overview/apoc.export/apoc.export.cypher.query.adoc[] *** xref::overview/apoc.export/apoc.export.cypher.schema.adoc[] -*** xref::overview/apoc.export/apoc.export.cypherAll.adoc[] -*** xref::overview/apoc.export/apoc.export.cypherData.adoc[] -*** xref::overview/apoc.export/apoc.export.cypherGraph.adoc[] -*** xref::overview/apoc.export/apoc.export.cypherQuery.adoc[] *** xref::overview/apoc.export/apoc.export.graphml.all.adoc[] *** xref::overview/apoc.export/apoc.export.graphml.data.adoc[] *** xref::overview/apoc.export/apoc.export.graphml.graph.adoc[] @@ -301,7 +282,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.load/apoc.load.html.adoc[] *** xref::overview/apoc.load/apoc.load.htmlPlainText.adoc[] *** xref::overview/apoc.load/apoc.load.jdbc.adoc[] -*** xref::overview/apoc.load/apoc.load.jdbcParams.adoc[] *** xref::overview/apoc.load/apoc.load.jdbcUpdate.adoc[] *** xref::overview/apoc.load/apoc.load.json.adoc[] *** xref::overview/apoc.load/apoc.load.jsonArray.adoc[] @@ -359,7 +339,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.math/apoc.math.minDouble.adoc[] *** xref::overview/apoc.math/apoc.math.minInt.adoc[] *** xref::overview/apoc.math/apoc.math.minLong.adoc[] -*** xref::overview/apoc.math/apoc.math.round.adoc[] *** xref::overview/apoc.math/apoc.math.sech.adoc[] *** xref::overview/apoc.math/apoc.math.sigmoid.adoc[] *** xref::overview/apoc.math/apoc.math.sigmoidPrime.adoc[] @@ -388,11 +367,7 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.meta/apoc.meta.cypher.isType.adoc[] *** xref::overview/apoc.meta/apoc.meta.cypher.type.adoc[] *** xref::overview/apoc.meta/apoc.meta.cypher.types.adoc[] -*** xref::overview/apoc.meta/apoc.meta.isType.adoc[] *** xref::overview/apoc.meta/apoc.meta.nodes.count.adoc[] -*** xref::overview/apoc.meta/apoc.meta.type.adoc[] -*** xref::overview/apoc.meta/apoc.meta.typeName.adoc[] -*** xref::overview/apoc.meta/apoc.meta.types.adoc[] ** xref::overview/apoc.metrics/index.adoc[] *** xref::overview/apoc.metrics/apoc.metrics.get.adoc[] *** xref::overview/apoc.metrics/apoc.metrics.list.adoc[] @@ -407,14 +382,7 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.mongo/apoc.mongo.insert.adoc[] *** xref::overview/apoc.mongo/apoc.mongo.update.adoc[] ** xref::overview/apoc.mongodb/index.adoc[] -*** xref::overview/apoc.mongodb/apoc.mongodb.count.adoc[] -*** xref::overview/apoc.mongodb/apoc.mongodb.delete.adoc[] -*** xref::overview/apoc.mongodb/apoc.mongodb.find.adoc[] -*** xref::overview/apoc.mongodb/apoc.mongodb.first.adoc[] -*** xref::overview/apoc.mongodb/apoc.mongodb.get.adoc[] *** xref::overview/apoc.mongodb/apoc.mongodb.get.byObjectId.adoc[] -*** xref::overview/apoc.mongodb/apoc.mongodb.insert.adoc[] -*** xref::overview/apoc.mongodb/apoc.mongodb.update.adoc[] ** xref::overview/apoc.monitor/index.adoc[] *** xref::overview/apoc.monitor/apoc.monitor.ids.adoc[] *** xref::overview/apoc.monitor/apoc.monitor.kernel.adoc[] @@ -495,8 +463,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.periodic/apoc.periodic.iterate.adoc[] *** xref::overview/apoc.periodic/apoc.periodic.list.adoc[] *** xref::overview/apoc.periodic/apoc.periodic.repeat.adoc[] -*** xref::overview/apoc.periodic/apoc.periodic.rock_n_roll.adoc[] -*** xref::overview/apoc.periodic/apoc.periodic.rock_n_roll_while.adoc[] *** xref::overview/apoc.periodic/apoc.periodic.submit.adoc[] *** xref::overview/apoc.periodic/apoc.periodic.truncate.adoc[] ** xref::overview/apoc.redis/index.adoc[] @@ -523,7 +489,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.redis/apoc.redis.push.adoc[] *** xref::overview/apoc.redis/apoc.redis.sadd.adoc[] *** xref::overview/apoc.redis/apoc.redis.scard.adoc[] -*** xref::overview/apoc.redis/apoc.redis.getSet.adoc[] *** xref::overview/apoc.redis/apoc.redis.smembers.adoc[] *** xref::overview/apoc.redis/apoc.redis.spop.adoc[] *** xref::overview/apoc.redis/apoc.redis.sunion.adoc[] @@ -534,7 +499,6 @@ This file is generated by DocsTest, so don't change it! ** xref::overview/apoc.refactor/index.adoc[] *** xref::overview/apoc.refactor/apoc.refactor.categorize.adoc[] *** xref::overview/apoc.refactor/apoc.refactor.cloneNodes.adoc[] -*** xref::overview/apoc.refactor/apoc.refactor.cloneNodesWithRelationships.adoc[] *** xref::overview/apoc.refactor/apoc.refactor.cloneSubgraph.adoc[] *** xref::overview/apoc.refactor/apoc.refactor.cloneSubgraphFromPaths.adoc[] *** xref::overview/apoc.refactor/apoc.refactor.collapseNode.adoc[] @@ -581,7 +545,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.spatial/apoc.spatial.reverseGeocode.adoc[] *** xref::overview/apoc.spatial/apoc.spatial.sortByDistance.adoc[] ** xref::overview/apoc.static/index.adoc[] -*** xref::overview/apoc.static/apoc.static.get.adoc[] *** xref::overview/apoc.static/apoc.static.list.adoc[] *** xref::overview/apoc.static/apoc.static.set.adoc[] *** xref::overview/apoc.static/apoc.static.get.adoc[] @@ -597,8 +560,6 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.temporal/apoc.temporal.formatDuration.adoc[] *** xref::overview/apoc.temporal/apoc.temporal.toZonedTemporal.adoc[] ** xref::overview/apoc.text/index.adoc[] -*** xref::overview/apoc.text/apoc.text.doubleMetaphone.adoc[] -*** xref::overview/apoc.text/apoc.text.phonetic.adoc[] *** xref::overview/apoc.text/apoc.text.phoneticDelta.adoc[] *** xref::overview/apoc.text/apoc.text.base64Decode.adoc[] *** xref::overview/apoc.text/apoc.text.base64Encode.adoc[] @@ -675,8 +636,5 @@ This file is generated by DocsTest, so don't change it! *** xref::overview/apoc.uuid/apoc.uuid.list.adoc[] *** xref::overview/apoc.uuid/apoc.uuid.remove.adoc[] *** xref::overview/apoc.uuid/apoc.uuid.removeAll.adoc[] -** xref::overview/apoc.warmup/index.adoc[] -*** xref::overview/apoc.warmup/apoc.warmup.run.adoc[] ** xref::overview/apoc.xml/index.adoc[] -*** xref::overview/apoc.xml/apoc.xml.import.adoc[] *** xref::overview/apoc.xml/apoc.xml.parse.adoc[] diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.coll.reverse.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.coll.reverse.adoc deleted file mode 100644 index e94d1ce988..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.coll.reverse.adoc +++ /dev/null @@ -1,13 +0,0 @@ -The following reverses a collection: - -[source,cypher] ----- -RETURN apoc.coll.reverse([5,4,3,2,1]) AS output; ----- - -.Results -[opts="header",cols="1"] -|=== -| Output -| [1, 2, 3, 4, 5] -|=== diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.create.vPattern.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.create.vPattern.adoc deleted file mode 100644 index bc9f58be6a..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.create.vPattern.adoc +++ /dev/null @@ -1,55 +0,0 @@ -The examples in this section are based on the following graph: - -[source,cypher] ----- -CREATE (s1:Student:TA:Graduate {name: 'Priya', score: 87, grade: 'B'}) -CREATE (s2:Student:Graduate {name: 'Joachim', score: 90, grade: 'A'}) -CREATE (s3:Student:TA:Graduate {name: 'Dominic', score: 78, grade: 'C'}) -CREATE (s4:Student:Undergraduate {name: 'Amir', score: 84, grade: 'B'}) -CREATE (s5:Student:Undergraduate {name: 'Natasha', score: 76, grade: 'C'}) -CREATE (s6:Student:Undergraduate {name: 'Elena', score: 92, grade: 'A'}); ----- - -The apoc.create.vPattern and apoc.create.vPatternFull are procedures that allow us to create a virtual graph - both nodes and relationships at once. Both procedures have the same functionality, but slightly different syntax for specifying the nodes and relationships to create. - -As an example, all of our data is in the `Student` nodes, but we can separate some of the data into other nodes and relationships with the query below. - -.apoc.create.vPattern -[source,cypher] ----- -MATCH (s:Student) -CALL apoc.create.vPattern( - {_labels:['Student'],name:s.name}, - 'FINISHED_COURSE_WITH', - {score: s.score}, - {_labels:['Grade'], letter: s.grade} -) -YIELD from, rel, to -RETURN from, rel, to; ----- - -.Results -image::apoc.create.vPattern.png[scaledwidth="100%"] - -Note that the statement above does a `CREATE` (not `MERGE`), so it creates multiple nodes with the same grade letters. - -Let's do the same thing with the apoc.create.vPatternFull procedure to see the syntax differences and that the result is the same. - -.apoc.create.vPatternFull -[source,cypher] ----- -MATCH (s:Student) -CALL apoc.create.vPatternFull( - ['Student'], - {name: s.name}, - 'FINISHED_COURSE_WITH', - {score: s.score}, - ['Grade'], - {letter: s.grade} -) -YIELD from, rel, to -RETURN from, rel, to; ----- - -.Results -image::apoc.create.vPatternFull.png[scaledwidth="100%"] \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.create.vPatternFull.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.create.vPatternFull.adoc deleted file mode 100644 index 35b5e36635..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.create.vPatternFull.adoc +++ /dev/null @@ -1,55 +0,0 @@ -The examples in this section are based on the following graph: - -[source,cypher] ----- -CREATE (s1:Student:TA:Graduate {name: 'Priya', score: 87, grade: 'B'}) -CREATE (s2:Student:Graduate {name: 'Joachim', score: 90, grade: 'A'}) -CREATE (s3:Student:TA:Graduate {name: 'Dominic', score: 78, grade: 'C'}) -CREATE (s4:Student:Undergraduate {name: 'Amir', score: 84, grade: 'B'}) -CREATE (s5:Student:Undergraduate {name: 'Natasha', score: 76, grade: 'C'}) -CREATE (s6:Student:Undergraduate {name: 'Elena', score: 92, grade: 'A'}); ----- - -The apoc.create.vPattern and apoc.create.vPatternFull are procedures that allow us to create a virtual graph - both nodes and relationships at once. Both procedures have the same functionality, but slightly different syntax for specifying the nodes and relationships to create. - -As an example, all of our data is in the `Student` nodes, but we can separate some of the data into other nodes and relationships with the query below. - -.apoc.create.vPattern -[source,cypher] ----- -MATCH (s:Student) -CALL apoc.create.vPattern( - {_labels:['Student'],name:s.name}, - 'FINISHED_COURSE_WITH', - {score: s.score}, - {_labels:['Grade'],letter: s.grade} -) -YIELD from, rel, to -RETURN from, rel, to; ----- - -.Results -image::apoc.create.vPattern.png[scaledwidth="100%"] - -Note that the statement above does a `CREATE` (not `MERGE`), so it creates multiple nodes with the same grade letters. - -Let's do the same thing with the apoc.create.vPatternFull procedure to see the syntax differences and that the result is the same. - -.apoc.create.vPatternFull -[source,cypher] ----- -MATCH (s:Student) -CALL apoc.create.vPatternFull( - ['Student'], - {name: s.name}, - 'FINISHED_COURSE_WITH', - {score: s.score}, - ['Grade'], - {letter: s.grade} -) -YIELD from, rel, to -RETURN from, rel, to; ----- - -.Results -image::apoc.create.vPatternFull.png[scaledwidth="100%"] \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.asFunction.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.asFunction.adoc deleted file mode 100644 index bd5a0171b0..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.asFunction.adoc +++ /dev/null @@ -1,25 +0,0 @@ -We can create the function `custom.double`, that doubles the provided value, by running the following function: - -[source,cypher] ----- -CALL apoc.custom.asFunction( - 'double', - 'RETURN $input*2 as answer', - 'long', - [['input','number']] -); ----- - -We can use this function, as shown in the query below: - -[source,cypher] ----- -RETURN custom.double(12) AS value; ----- - -.Results -[opts="header"] -|=== -| value -| 24 -|=== \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.asProcedure.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.asProcedure.adoc deleted file mode 100644 index 3e9a1d50c9..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.asProcedure.adoc +++ /dev/null @@ -1,30 +0,0 @@ -We can create the function `custom.powers` that returns a stream of the powers of the first parameter, up to and including the power provided by the second parameter: - -[source,cypher] ----- -CALL apoc.custom.asProcedure( - 'powers', - 'UNWIND range(0, $power) AS power - RETURN $input ^ power AS answer', - 'read', - [['answer', 'long']], - [['input','long'], ['power', 'long']] -); ----- - -We can use this function, to return 9°, 9¹, 9², and 9³, as shown in the query below: - -[source,cypher] ----- -CALL custom.powers(9, 3); ----- - -.Results -[opts="header"] -|=== -| answer -| 1.0 -| 9.0 -| 81.0 -| 729.0 -|=== \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.declareFunction.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.declareFunction.adoc index 4eae2ef456..4fe80c0b52 100644 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.declareFunction.adoc +++ b/docs/asciidoc/modules/ROOT/partials/usage/apoc.custom.declareFunction.adoc @@ -23,5 +23,3 @@ RETURN custom.double(83) AS value; | value | 166 |=== - -If we don't need fine grained control over our function's signature, see xref::overview/apoc.custom/apoc.custom.asFunction.adoc[]. \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.data.domain.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.data.domain.adoc deleted file mode 100644 index d71f695511..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.data.domain.adoc +++ /dev/null @@ -1,25 +0,0 @@ -[source,cypher] ----- -RETURN apoc.data.domain('http://www.example.com/all-the-things') AS output; ----- - -.Results -[opts="header"] -|=== -| output -| "www.example.com" -|=== - - - -[source,cypher] ----- -RETURN apoc.data.domain('foo@bar.com' ) AS output; ----- - -.Results -[opts="header"] -|=== -| output -| "bar.com" -|=== diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.math.round.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.math.round.adoc deleted file mode 100644 index 35f1a9d485..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.math.round.adoc +++ /dev/null @@ -1,28 +0,0 @@ -[source,cypher] ----- -RETURN apoc.math.round(1.783, 0, "HALF_UP") AS output; ----- - -.Results -[opts="header"] -|=== -| output -| 2.0 -|=== - -[source,cypher] ----- -RETURN apoc.math.round(1.783, 0, "DOWN") AS output; ----- - -.Results -[opts="header"] -|=== -| output -| 1.0 -|=== - -[NOTE] -==== -This function has been deprecated and will be removed in version 5.0. Use Neo4j's `round()` function, which has the same signature since Neo4j 4.2, instead. -==== \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.count.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.count.adoc deleted file mode 100644 index 006de14fd4..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.count.adoc +++ /dev/null @@ -1,20 +0,0 @@ -The examples in this section are based on a Mongo DB instance with a pre-populate twitter dataset. -You can find instructions for setting this up at https://github.com/neo4j-examples/mongo-example[github.com/neo4j-examples/mongo-example^]. - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.count('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {}); ----- - -.Results -[opts="header"] -|=== - -| value -| 966 -|=== - - - - diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.delete.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.delete.adoc deleted file mode 100644 index 7d8fdc009f..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.delete.adoc +++ /dev/null @@ -1,52 +0,0 @@ -The examples in this section are based on a Mongo DB instance with a pre-populate twitter dataset. -You can find instructions for setting this up at https://github.com/neo4j-examples/mongo-example[github.com/neo4j-examples/mongo-example^]. - -We're going to delete the document with an `id` of `591999465512382500`. -We can check it exists, by running the following query using xref::overview/apoc.mongodb/apoc.mongodb.find.adoc[]. - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.find('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {id: 591999465512382500.0}, null, null) -YIELD value -RETURN value; ----- - -.Results -[opts="header"] -|=== -| value -| {possibly_sensitive_appealable: FALSE, extended_entities: {media: [{display_url: "pic.twitter.com/cyN1ZZNsSx", indices: [118.0, 140.0], sizes: {small: {h: 507.0, resize: "fit", w: 296.0}, medium: {h: 507.0, resize: "fit", w: 296.0}, large: {h: 507.0, resize: "fit", w: 296.0}, thumb: {h: 150.0, resize: "crop", w: 150.0}}, id_str: "591999465080295424", expanded_url: "http://twitter.com/FCBarcelona/status/591999465512382464/photo/1", media_url_https: "https://pbs.twimg.com/media/CDc0YH9VEAA-h7I.png", id: 5.9199946508029542E17, type: "photo", media_url: "http://pbs.twimg.com/media/CDc0YH9VEAA-h7I.png", url: "http://t.co/cyN1ZZNsSx"}]}, in_reply_to_status_id_str: NULL, in_reply_to_status_id: NULL, created_at: "Sat Apr 25 16:17:26 +0000 2015", in_reply_to_user_id_str: NULL, source: "Hootsuite", retweet_count: 96.0, retweeted: FALSE, geo: NULL, in_reply_to_screen_name: NULL, id_str: "591999465512382464", in_reply_to_user_id: NULL, favorite_count: 82.0, id: 5.9199946551238246E17, text: "[CALENDAR] Barça have 5 league games left, 2 #UCL semi-final games, and the Spanish Cup final: http://t.co/mWKOzNEWFo http://t.co/cyN1ZZNsSx", place: NULL, lang: "fr", favorited: FALSE, possibly_sensitive: FALSE, coordinates: NULL, truncated: FALSE, entities: {urls: [{expanded_url: "http://ow.ly/M6RsY", display_url: "ow.ly/M6RsY", indices: [95.0, 117.0], url: "http://t.co/mWKOzNEWFo"}], media: [{display_url: "pic.twitter.com/cyN1ZZNsSx", indices: [118.0, 140.0], sizes: {small: {h: 507.0, resize: "fit", w: 296.0}, medium: {h: 507.0, resize: "fit", w: 296.0}, large: {h: 507.0, resize: "fit", w: 296.0}, thumb: {h: 150.0, resize: "crop", w: 150.0}}, id_str: "591999465080295424", expanded_url: "http://twitter.com/FCBarcelona/status/591999465512382464/photo/1", media_url_https: "https://pbs.twimg.com/media/CDc0YH9VEAA-h7I.png", id: 5.9199946508029542E17, type: "photo", media_url: "http://pbs.twimg.com/media/CDc0YH9VEAA-h7I.png", url: "http://t.co/cyN1ZZNsSx"}], hashtags: [{indices: [45.0, 49.0], text: "UCL"}], user_mentions: [], symbols: []}, _id: "553bbecae8f1e57878b72a1e", contributors: NULL, user: {utc_offset: 7200.0, friends_count: 52.0, profile_image_url_https: "https://pbs.twimg.com/profile_images/562256323253788673/-j8H-E87_normal.jpeg", profile_background_image_url: "http://pbs.twimg.com/profile_background_images/533286076765306881/Bh7wB5M8.jpeg", listed_count: 26154.0, default_profile_image: FALSE, favourites_count: 21.0, is_translator: FALSE, created_at: "Tue Dec 15 09:53:50 +0000 2009", description: "Official account. Also follow us at @fcbarcelona_cat, @fcbarcelona_es, @fcbarcelona_br, @fcbarcelona_jap @fcbarcelona_id, @fcbarcelona_ara, @fcbarcelona_fra", profile_background_image_url_https: "https://pbs.twimg.com/profile_background_images/533286076765306881/Bh7wB5M8.jpeg", protected: FALSE, screen_name: "FCBarcelona", id_str: "96951800", profile_link_color: "9B0034", is_translation_enabled: TRUE, geo_enabled: FALSE, id: 9.69518E7, profile_background_color: "000000", lang: "en", profile_sidebar_border_color: "FFFFFF", profile_location: NULL, profile_text_color: "333333", verified: TRUE, profile_image_url: "http://pbs.twimg.com/profile_images/562256323253788673/-j8H-E87_normal.jpeg", time_zone: "Paris", url: "http://t.co/tLKuK0LXBC", contributors_enabled: FALSE, profile_background_tile: FALSE, profile_banner_url: "https://pbs.twimg.com/profile_banners/96951800/1427297556", entities: {description: {urls: []}, url: {urls: [{expanded_url: "http://www.fcbarcelona.com", display_url: "fcbarcelona.com", indices: [0.0, 22.0], url: "http://t.co/tLKuK0LXBC"}]}}, statuses_count: 61196.0, follow_request_sent: FALSE, profile_use_background_image: FALSE, followers_count: 1.4798695E7, default_profile: FALSE, following: TRUE, name: "FC Barcelona", profile_sidebar_fill_color: "CBC9C4", location: "Barcelona", notifications: FALSE}} -|=== - -Now let's delete the document, by running the following query: - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.delete('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {id: 591999465512382500.0}); ----- - -.Results -[opts="header"] -|=== -| value -| 1 -|=== - -And now let's query it again: - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.find('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {id: 591999465512382500.0}, null, null) -YIELD value -RETURN value._id, value.text, value.retweet_count -LIMIT 1; ----- - -.Results -[opts="header"] -|=== -| value -|=== \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.find.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.find.adoc deleted file mode 100644 index 9e978b304b..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.find.adoc +++ /dev/null @@ -1,33 +0,0 @@ -The examples in this section are based on a Mongo DB instance with a pre-populate twitter dataset. -You can find instructions for setting this up at https://github.com/neo4j-examples/mongo-example[github.com/neo4j-examples/mongo-example^]. - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.find('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {`user.name`: "FC Barcelona"}, null, null) YIELD value -RETURN value.created_at, value.text, [item in value.entities.hashtags | item.text] AS hashtags -LIMIT 10; ----- - -.Results -[opts="header"] -|=== - -| value.created_at | value.text | hashtags -| "Sat Apr 25 16:17:26 +0000 2015" | "[CALENDAR] Barça have 5 league games left, 2 #UCL semi-final games, and the Spanish Cup final: http://t.co/mWKOzNEWFo http://t.co/cyN1ZZNsSx" | ["UCL"] -| "Sat Apr 25 16:13:58 +0000 2015" | "\"The players understand the difficulty of every game we have left,\" says Luis Enrique. #FCBLive http://t.co/iASWBXiV8D" | ["FCBLive"] -| "Sat Apr 25 16:12:09 +0000 2015" | "Luis Enrique says, \"That was the best first half we've played.\" #FCBLive #EspanyolFCB http://t.co/rhvaFNgmf6" | ["FCBLive", "EspanyolFCB"] -| "Sat Apr 25 16:09:15 +0000 2015" | "[#MESSI, NEYMAR, SUÁREZ] Heat map of Barça's Big 3 for all 90 minutes! http://t.co/Z5zYu82WLH #FCBLive #FCBLive http://t.co/3b3c2sHY59" | ["MESSI", "FCBLive", "FCBLive"] -| "Sat Apr 25 16:05:30 +0000 2015" | "[MVP] Who do you think was the best player of the match? Vote for the MVP! http://t.co/JSHYGY8o1s http://t.co/oRjHwZQRCd" | [] -| "Sat Apr 25 16:04:27 +0000 2015" | "[LA LIGA TABLE] Barça move 5 points clear with today's 2–0 win at Espanyol: http://t.co/jkqeVh52wX #FCBLive http://t.co/9yeP00ZL62" | ["FCBLive"] -| "Sat Apr 25 15:58:45 +0000 2015" | "[STATISTICS] All the stats and more from the full 90 minutes of Barça's 2–0 win at Espanyol! http://t.co/micLdI7xsk http://t.co/68Lw8F9hYU" | [] -| "Sat Apr 25 15:59:54 +0000 2015" | "Andrés Iniesta says \"We knew that to win this derby we had to play a complete game, and we did.\" #FCBLive #EspanyolFCB" | ["FCBLive", "EspanyolFCB"] -| "Sat Apr 25 15:55:28 +0000 2015" | "[CALENDAR] Fixture list. These are the next games for Barça http://t.co/m9MF2YNOhG http://t.co/ZEbmbzNVyB" | [] -| "Sat Apr 25 15:59:35 +0000 2015" | "[STATS] Xavi makes 500th @LaLiga appearance. RT to support him! #Xavi500 #FCBLive http://t.co/ewuAlKcQDr" | ["Xavi500", "FCBLive"] - - -|=== - - - - diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.first.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.first.adoc deleted file mode 100644 index 81afd8c25d..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.first.adoc +++ /dev/null @@ -1,25 +0,0 @@ -The examples in this section are based on a Mongo DB instance with a pre-populate twitter dataset. -You can find instructions for setting this up at https://github.com/neo4j-examples/mongo-example[github.com/neo4j-examples/mongo-example^]. - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.first('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {}) -YIELD value -RETURN value; ----- - -.Results -[opts="header"] -|=== -| value -| {possibly_sensitive_appealable: FALSE, in_reply_to_status_id_str: NULL, in_reply_to_status_id: NULL, created_at: "Sat Apr 25 16:19:03 +0000 2015", in_reply_to_user_id_str: NULL, source: "A Mean Magazine Bot", retweeted_status: {possibly_sensitive_appealable: FALSE, in_reply_to_status_id_str: NULL, in_reply_to_status_id: NULL, in_reply_to_user_id_str: NULL, created_at: "Sat Apr 25 16:19:01 +0000 2015", source: "IFTTT", retweet_count: 1.0, retweeted: FALSE, geo: NULL, in_reply_to_screen_name: NULL, id_str: "591999864562655232", in_reply_to_user_id: NULL, favorite_count: 0.0, text: "RT: http://t.co/tgxDJSOrHb #webinar #TrueTwit #TechTip. -A Node.js API development webinar: -https://t.co/nBjkk4MnuN", place: NULL, id: 5.9199986456265523E17, lang: "en", favorited: FALSE, possibly_sensitive: FALSE, coordinates: NULL, truncated: FALSE, entities: {urls: [{expanded_url: "http://ift.tt/1brKQNC", display_url: "ift.tt/1brKQNC", indices: [4.0, 26.0], url: "http://t.co/tgxDJSOrHb"}, {expanded_url: "https://strongloop.com/node-js/node-js-webinar-series/", display_url: "strongloop.com/node-js/node-j…", indices: [91.0, 114.0], url: "https://t.co/nBjkk4MnuN"}], hashtags: [{indices: [27.0, 35.0], text: "webinar"}, {indices: [36.0, 45.0], text: "TrueTwit"}, {indices: [46.0, 54.0], text: "TechTip"}], user_mentions: [], symbols: []}, contributors: NULL, user: {utc_offset: NULL, friends_count: 8.0, profile_image_url_https: "https://pbs.twimg.com/profile_images/1238925920/logo_color_twitter_normal.png", profile_background_image_url: "http://pbs.twimg.com/profile_background_images/558932945889533952/6F0HO93x.jpeg", listed_count: 1442.0, default_profile_image: FALSE, favourites_count: 595.0, created_at: "Thu Aug 19 18:34:03 +0000 2010", is_translator: FALSE, description: "http://t.co/l4dBH8blSB (launching soon) posts and promote webinars from around the world, follow us for instant updates. We will invite you when launched.", profile_background_image_url_https: "https://pbs.twimg.com/profile_background_images/558932945889533952/6F0HO93x.jpeg", protected: FALSE, screen_name: "webinara", id_str: "180473434", profile_link_color: "1E667C", is_translation_enabled: FALSE, id: 1.80473434E8, geo_enabled: FALSE, profile_background_color: "8D9FA8", lang: "en", profile_sidebar_border_color: "C0DEED", profile_location: NULL, profile_text_color: "333333", verified: FALSE, profile_image_url: "http://pbs.twimg.com/profile_images/1238925920/logo_color_twitter_normal.png", time_zone: NULL, url: "http://t.co/l4dBH8blSB", contributors_enabled: FALSE, profile_background_tile: FALSE, profile_banner_url: "https://pbs.twimg.com/profile_banners/180473434/1422095245", entities: {description: {urls: [{expanded_url: "http://www.webinara.com", display_url: "webinara.com", indices: [0.0, 22.0], url: "http://t.co/l4dBH8blSB"}]}, url: {urls: [{expanded_url: "http://www.webinara.com", display_url: "webinara.com", indices: [0.0, 22.0], url: "http://t.co/l4dBH8blSB"}]}}, statuses_count: 176504.0, follow_request_sent: FALSE, default_profile: FALSE, profile_use_background_image: TRUE, following: FALSE, followers_count: 920.0, name: "webinara", profile_sidebar_fill_color: "DDEEF6", location: "Worldwide", notifications: FALSE}}, retweet_count: 1.0, retweeted: FALSE, geo: NULL, in_reply_to_screen_name: NULL, id_str: "591999874540904448", in_reply_to_user_id: NULL, favorite_count: 0.0, id: 5.9199987454090445E17, text: "RT @webinara: RT: http://t.co/tgxDJSOrHb #webinar #TrueTwit #TechTip. -A Node.js API development webinar: -https://t.co/nBjkk4MnuN", place: NULL, lang: "en", favorited: FALSE, possibly_sensitive: FALSE, coordinates: NULL, truncated: FALSE, entities: {urls: [{expanded_url: "http://ift.tt/1brKQNC", display_url: "ift.tt/1brKQNC", indices: [18.0, 40.0], url: "http://t.co/tgxDJSOrHb"}, {expanded_url: "https://strongloop.com/node-js/node-js-webinar-series/", display_url: "strongloop.com/node-js/node-j…", indices: [105.0, 128.0], url: "https://t.co/nBjkk4MnuN"}], hashtags: [{indices: [41.0, 49.0], text: "webinar"}, {indices: [50.0, 59.0], text: "TrueTwit"}, {indices: [60.0, 68.0], text: "TechTip"}], user_mentions: [{name: "webinara", indices: [3.0, 12.0], id: 1.80473434E8, screen_name: "webinara", id_str: "180473434"}], symbols: []}, _id: {date: 1429978826000, machineIdentifier: 15266277, processIdentifier: 30840, counter: 12003868, time: 1429978826000, timestamp: 1429978826, timeSecond: 1429978826}, contributors: NULL, user: {utc_offset: NULL, friends_count: 1.0, profile_image_url_https: "https://pbs.twimg.com/profile_images/481334978161029120/iu3zZFEk_normal.png", profile_background_image_url: "http://abs.twimg.com/images/themes/theme1/bg.png", listed_count: 979.0, default_profile_image: FALSE, favourites_count: 93.0, description: "Non curated list of relevant tweets about the MEAN stack. For a curated one visit @ameanmagazine", is_translator: FALSE, created_at: "Tue Jun 24 07:14:01 +0000 2014", profile_background_image_url_https: "https://abs.twimg.com/images/themes/theme1/bg.png", protected: FALSE, screen_name: "ameanmbot", profile_link_color: "0084B4", id_str: "2585287004", is_translation_enabled: FALSE, geo_enabled: FALSE, id: 2.585287004E9, profile_background_color: "C0DEED", lang: "en", profile_sidebar_border_color: "C0DEED", profile_location: NULL, profile_text_color: "333333", verified: FALSE, profile_image_url: "http://pbs.twimg.com/profile_images/481334978161029120/iu3zZFEk_normal.png", time_zone: NULL, url: "http://t.co/HUvLnC0qar", contributors_enabled: FALSE, profile_banner_url: "https://pbs.twimg.com/profile_banners/2585287004/1403594236", profile_background_tile: FALSE, entities: {description: {urls: []}, url: {urls: [{expanded_url: "http://www.ameanmagazine.com", display_url: "ameanmagazine.com", indices: [0.0, 22.0], url: "http://t.co/HUvLnC0qar"}]}}, follow_request_sent: FALSE, statuses_count: 197348.0, default_profile: TRUE, following: TRUE, profile_use_background_image: TRUE, followers_count: 1676.0, name: "Mean Magazine Bot", location: "", profile_sidebar_fill_color: "DDEEF6", notifications: FALSE}} -|=== - - - - diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.get.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.get.adoc deleted file mode 100644 index 405e87a487..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.get.adoc +++ /dev/null @@ -1,33 +0,0 @@ -The examples in this section are based on a Mongo DB instance with a pre-populate twitter dataset. -You can find instructions for setting this up at https://github.com/neo4j-examples/mongo-example[github.com/neo4j-examples/mongo-example^]. - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.get('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {}, true) YIELD value -RETURN datetime({epochMillis:value._id.date}) AS date, value.user.name, value.text -LIMIT 10; ----- - -.Results -[opts="header"] -|=== -| date | value.user.name | value.text -| 2015-04-25T16:20:26Z | "Mean Magazine Bot" | "RT @webinara: RT: http://t.co/tgxDJSOrHb #webinar #TrueTwit #TechTip. -A Node.js API development webinar: -https://t.co/nBjkk4MnuN" -| 2015-04-25T16:20:26Z | "Mean Magazine Bot" | "RT @zhangtai_me: Starting Angularjs Essentials, by Rodrigo Branas http://t.co/b2HaUzVtKt" -| 2015-04-25T16:20:26Z | "FC Barcelona" | "[CALENDAR] Barça have 5 league games left, 2 #UCL semi-final games, and the Spanish Cup final: http://t.co/mWKOzNEWFo http://t.co/cyN1ZZNsSx" -| 2015-04-25T16:20:26Z | "Mean Magazine Bot" | "RT @YAPCNA: David Golden (@xdg) talks about working with both Perl and MongoDB http://t.co/BEVQB521Al http://t.co/DallwKNcR8" -| 2015-04-25T16:20:26Z | "Hootsuite" | "Do you like social media? If so, you'll LOVE this awesome list of movies: http://t.co/aUF2WUYudF http://t.co/T0ZtFaHoKJ" -| 2015-04-25T16:20:26Z | "Lemi Orhan Ergin" | "RT @serkanc: I'm going to @CraftSummit , who wants to join me? Some great speakers including @sandromancuso @alexboly @lemiorhan and @oezca…" -| 2015-04-25T16:20:26Z | "Mean Magazine Bot" | "RT @zhangtai_me: 25% done with Angularjs Essentials, by Rodrigo Branas http://t.co/wAMQJi7JoQ" -| 2015-04-25T16:20:26Z | "Hazelcast" | "Spring Integration Hazelcast Support 1.0 Milestone 1 is available http://t.co/kIu102CHKY" -| 2015-04-25T16:20:26Z | "Premier League" | "TEAM NEWS @MCFC are unchanged from the side that beat West Ham; Okore & Westwood replace Clark & Agbonlahor for @AVFCOfficial #MCIAVL" -| 2015-04-25T16:20:26Z | "Mean Magazine Bot" | "RT @Manjuics: Apply first: MNC looking for AngularJS in HYDERABAD, IND http://t.co/ijsnQWlgGb #job" - -|=== - - - - diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.insert.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.insert.adoc deleted file mode 100644 index 796c7fc85c..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.insert.adoc +++ /dev/null @@ -1,25 +0,0 @@ -The examples in this section are based on a Mongo DB instance with a pre-populate twitter dataset. -You can find instructions for setting this up at https://github.com/neo4j-examples/mongo-example[github.com/neo4j-examples/mongo-example^]. - -We're going to inser a document with the key `foo` with value `bar`: - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.insert('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets',[{foo:'bar'}]); ----- - -We can check that our document has been stored using xref::overview/apoc.mongodb/apoc.mongodb.find.adoc[], as shown below: - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.find('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {foo: "bar"}, null, null); ----- - -.Results -[opts="header"] -|=== -| value -| {foo: "bar", _id: "5fbbdbecb834740006b242dc"} -|=== \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.update.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.update.adoc deleted file mode 100644 index 5d49248eac..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.mongodb.update.adoc +++ /dev/null @@ -1,54 +0,0 @@ -The examples in this section are based on a Mongo DB instance with a pre-populate twitter dataset. -You can find instructions for setting this up at https://github.com/neo4j-examples/mongo-example[github.com/neo4j-examples/mongo-example^]. - -We're going to update the `retweet_count` for the document with an `id` of `591999465512382500`. -We can check its current value, by running the following query using xref::overview/apoc.mongodb/apoc.mongodb.find.adoc[]. - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.find('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {id: 591999465512382500.0}, null, null) -YIELD value -RETURN value._id, value.text, value.retweet_count -LIMIT 1; ----- - -.Results -[opts="header"] -|=== -| value._id | value.text | value.retweet_count -| "553bbecae8f1e57878b72a1e" | "[CALENDAR] Barça have 5 league games left, 2 #UCL semi-final games, and the Spanish Cup final: http://t.co/mWKOzNEWFo http://t.co/cyN1ZZNsSx" | 95.0 -|=== - -We can update that field, by running the following query: - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.update('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {id: 591999465512382500.0}, {`$set`:{retweet_count:96.0}}); ----- - -.Results -[opts="header"] -|=== -| value -| 1 -|=== - -And now let's query it again: - -.Cypher -[source,cypher] ----- -CALL apoc.mongodb.find('mongodb://mongo:neo4j@mongo:27017', 'test', 'tweets', {id: 591999465512382500.0}, null, null) -YIELD value -RETURN value._id, value.text, value.retweet_count -LIMIT 1; ----- - -.Results -[opts="header"] -|=== -| value._id | value.text | value.retweet_count -| "553bbecae8f1e57878b72a1e" | "[CALENDAR] Barça have 5 league games left, 2 #UCL semi-final games, and the Spanish Cup final: http://t.co/mWKOzNEWFo http://t.co/cyN1ZZNsSx" | 96.0 -|=== \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.warmup.run.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.warmup.run.adoc deleted file mode 100644 index 53ab5305b4..0000000000 --- a/docs/asciidoc/modules/ROOT/partials/usage/apoc.warmup.run.adoc +++ /dev/null @@ -1,51 +0,0 @@ -The examples in this section are based on the following sample graph: - -[source,cypher] ----- -MERGE (michael:Person {name: "Michael"}) -WITH michael -CALL { - WITH michael - UNWIND range(0, 10000) AS id - MERGE (p:Person {name: "Person" + id}) - MERGE (michael)-[:KNOWS]-(p) - RETURN count(*) AS friends -} -RETURN friends; ----- - -.Results -[opts="header"] -|=== -| friends -| 10001 -|=== - - -[source,cypher] ----- -CALL apoc.warmup.run() -YIELD nodesTotal, nodePages, relsTotal, relPages, propPages, propertiesLoaded -RETURN nodesTotal, nodePages, relsTotal, relPages, propPages, propertiesLoaded; ----- - -.Results -[opts="header"] -|=== -| nodesTotal | nodePages | relsTotal | relPages | propPages | propertiesLoaded -| 10002 | 184 | 10001 | 417 | 503 | FALSE -|=== - -[source,cypher] ----- -CALL apoc.warmup.run(true, true, false) -YIELD nodesTotal, nodePages, relsTotal, relPages, propPages, propertiesLoaded -RETURN nodesTotal, nodePages, relsTotal, relPages, propPages, propertiesLoaded; ----- - -.Results -[opts="header"] -|=== -| nodesTotal | nodePages | relsTotal | relPages | propPages | propertiesLoaded -| 10002 | 184 | 10001 | 417 | 503 | TRUE -|=== \ No newline at end of file diff --git a/docs/guide.html b/docs/guide.html index 62d3976023..9f2e96e9a5 100644 --- a/docs/guide.html +++ b/docs/guide.html @@ -479,28 +479,8 @@

Meta Graph

CALL apoc.meta.stats yield labelCount, relTypeCount, propertyKeyCount, nodeCount, relCount, labels, relTypes, stats

returns the information stored in the transactional database statistics

- -

CALL apoc.meta.type(value)

-

type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST)

- - -

CALL apoc.meta.isType(value,type)

-

returns a row if type name matches none if not

- - -

CALL apoc.meta.types(node or relationship or map) YIELD value

-

returns a a map of property-keys to their names

- -
-
isType example
-
-
MATCH (n:Person)
-CALL apoc.meta.isType(n.age,"INTEGER")
-RETURN n LIMIT 5
-
-
@@ -819,67 +799,6 @@

Interacting with Elastic Search

- -
-

Interacting with MongoDB

-
-
- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

CALL apoc.mongodb.get(host-or-port,db-or-null,collection-or-null,query-or-null) yield value

perform a find operation on mongodb collection

CALL apoc.mongodb.count(host-or-port,db-or-null,collection-or-null,query-or-null) yield value

perform a find operation on mongodb collection

CALL apoc.mongodb.first(host-or-port,db-or-null,collection-or-null,query-or-null) yield value

perform a first operation on mongodb collection

CALL apoc.mongodb.find(host-or-port,db-or-null,collection-or-null,query-or-null,projection-or-null,sort-or-null) yield value

perform a find,project,sort operation on mongodb collection

CALL apoc.mongodb.insert(host-or-port,db-or-null,collection-or-null,list-of-maps)

inserts the given documents into the mongodb collection

CALL apoc.mongodb.delete(host-or-port,db-or-null,collection-or-null,list-of-maps)

inserts the given documents into the mongodb collection

CALL apoc.mongodb.update(host-or-port,db-or-null,collection-or-null,list-of-maps)

inserts the given documents into the mongodb collection

-
-

Copy these jars into the plugins directory:

-
-
-
-
mvn dependency:copy-dependencies
-cp target/dependency/mongodb*.jar target/dependency/bson*.jar $NEO4J_HOME/plugins/
-
-
-
-
-
CALL apoc.mongodb.first('mongodb://localhost:27017','test','test',{name:'testDocument'})
-
-
-
-
-
- - -

Interacting with Couchbase

@@ -1091,14 +1010,6 @@

Virtual Nodes/Rels

CALL apoc.create.vRelationship(nodeFrom,'KNOWS',{key:value,…​}, nodeTo)

returns a virtual relationship

- -

CALL apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,…​}, {_labels:['LabelB'],key:value})

-

returns a virtual pattern

- - -

CALL apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,…​},['LabelB'],{key:value})

-

returns a virtual pattern

-
@@ -1219,32 +1130,6 @@

Generating Graphs

- -
-

Warmup

-
-
-
-

(thanks @SaschaPeukert)

-
- ---- - - - - - - -

CALL apoc.warmup.run()

Warmup the node and relationship page-caches by loading one page at a time

-
-
-
- - -

Monitoring

@@ -1401,10 +1286,6 @@

Job Management

submit a repeatedly-called background statement until it returns 0

-

CALL apoc.periodic.rock_n_roll(statementIteration, statementAction, batchSize) YIELD batches, total

-

iterate over first statement and apply action statement with given transaction batch size. Returns to numeric values holding the number of batches and the number of total processed rows. E.g.

- -

CALL apoc.periodic.iterate('statement returning items', 'statement per item', {batchSize:1000,parallel:true}) YIELD batches, total

run the second statement for each item returned by the first statement. Returns number of batches and total processed rows

@@ -1419,14 +1300,6 @@

Job Management

jobs list is checked / cleared every 10s for finished jobs

-
-
-
-
CALL apoc.periodic.rock_n_roll('match (p:Person) return id(p) as id_p', 'MATCH (p) where id(p)={id_p} SET p.lastname =p.name', 20000)
-
-
-
-

copies over the name property of each person to lastname.

@@ -1450,10 +1323,6 @@

Graph Refactoring

clone nodes with their labels and properties

-

call apoc.refactor.cloneNodesWithRelationships([node1,node2,…​])

-

clone nodes with their labels, properties and relationships

- -

call apoc.refactor.mergeNodes([node1,node2])

merge nodes onto first in list

@@ -1828,7 +1697,6 @@

Phonetic Comparisons

-

apoc.data.domain(email_or_url) yield value

returns domain part of the value

@@ -2243,10 +2111,6 @@

Graph Algorithms (work in progress)

run dijkstra with relationship property name as cost function

-

apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS|<WORKS_WITH|IS_MANAGER_OF>', 'distance', 10) YIELD path, weight

-

run dijkstra with relationship property name as cost function and a default weight if the property does not exist

- -

apoc.algo.aStar(startNode, endNode, 'KNOWS|<WORKS_WITH|IS_MANAGER_OF>', 'distance','lat','lon') YIELD path, weight

run A* with relationship property name as cost function

@@ -2856,28 +2720,6 @@

Phonetic Text Procedures

-

Extract Domain

-
-

The procedure apoc.data.domain will take a url or email address and try to determine the domain name. -This can be useful to make easier correlations and equality tests between differently formatted email addresses, and between urls to the same domains but specifying different locations.

-
-
-
-
WITH 'foo@bar.com' AS email
-CALL apoc.data.domain(email) YIELD domain
-RETURN domain // will return 'bar.com'
-
-
-
-
-
WITH 'http://www.example.com/all-the-things' AS url
-CALL apoc.data.domain(url) YIELD domain
-RETURN domain // will return 'www.example.com'
-
-
- - -

TimeToLive (TTL) - Expire Nodes

@@ -2912,15 +2754,6 @@

TimeToLive (TTL) - Expire Nodes

MATCH (n:Foo) WHERE n.bar SET n:TTL, n.ttl = timestamp() + 10000;
-
-
-

There is also a procedure that does the same:

-
-
-
-
CALL apoc.date.expire(node,time,'time-unit');
-CALL apoc.date.expire(n,100,'s');
-
diff --git a/docs/images/apoc.refactor.cloneNodesWithRelationships.dataset.png b/docs/images/apoc.refactor.cloneNodesWithRelationships.dataset.png deleted file mode 100644 index 454cec4817b942cbd2a78eaccfd5e230568cadbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44325 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
cY2#^hso`4Rc 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 n@wELqpTAo$(J=WC(Meta Graph - - ---- - - - - - - - - - - - - - - -
Table 2. Functions

apoc.meta.type(value)

type name of a value (INTEGER,FLOAT,STRING,BOOLEAN,RELATIONSHIP,NODE,PATH,NULL,UNKNOWN,MAP,LIST)

apoc.meta.isType(value,type)

returns a row if type name matches none if not

apoc.meta.types(node or relationship or map)

returns a a map of property-keys to their names

-
-
isType example
-
-
MATCH (n:Person)
-RETURN apoc.meta.isType(n.age,"INTEGER") as ageType
-
-

Schema

@@ -1526,81 +1498,6 @@
-

Interacting with Couchbase

@@ -1806,14 +1703,6 @@

Virtual

- - - - - - - -

apoc.create.vRelationship(nodeFrom,'KNOWS',{key:value,…​}, nodeTo)

returns a virtual relationship

CALL apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,…​}, {_labels:['LabelB'],key:value})

returns a virtual pattern

CALL apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,…​},['LabelB'],{key:value})

returns a virtual pattern

-

Warmup

-
-

(thanks @SaschaPeukert)

-
- ---- - - - - - - -

CALL apoc.warmup.run()

Warmup the node and relationship page-caches by loading one page at a time

-
-
-

Math Functions

- ---- - - - - - - -

apoc.math.round(value,[precision=0],mode=[HALF_UP,CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,DOWN,UNNECESSARY])

rounds value with optionally given precision (default 0) and optional rounding mode (default HALF_UP)

-
-

Text Functions

@@ -2532,10 +2374,6 @@

Text Functions<

- - - -

apoc.text.rpad(text,count,delim)

right pad the string to the given width

apoc.data.domain(email_or_url)

returns domain part of the value

@@ -2639,22 +2477,6 @@

Time to Liv SET n.ttl = timestamp() + 3600 - ---- - - - - - - - - - - -

CALL apoc.date.expire.in(node,time,'time-unit')

expire node in given time-delta by setting :TTL label and ttl property

CALL apoc.date.expire(node,time,'time-unit')

expire node at given time by setting :TTL label and ttl property

Optionally set apoc.ttl.schedule=5 as repeat frequency.

@@ -3184,10 +3006,6 @@

run dijkstra with relationship property name as cost function

-

apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS|<WORKS_WITH|IS_MANAGER_OF>', 'distance', 10) YIELD path, weight

-

run dijkstra with relationship property name as cost function and a default weight if the property does not exist

- -

apoc.algo.aStar(startNode, endNode, 'KNOWS|<WORKS_WITH|IS_MANAGER_OF>', 'distance','lat','lon') YIELD path, weight

run A* with relationship property name as cost function

@@ -3407,23 +3225,7 @@

apoc.convert.toMap(value)

- -
-
Table of Contents
-
-
-

type information and checking

-
-
-
Table of Contents
- -
-
-

4

-
-

apoc.meta.type(value)

-
-
-

Extract Domain

-
-

The procedure apoc.data.domain will take a url or email address and try to determine the domain name. -This can be useful to make easier correlations and equality tests between differently formatted email addresses, and between urls to the same domains but specifying different locations.

-
-
-
-
WITH 'foo@bar.com' AS email
-CALL apoc.data.domain(email) YIELD domain
-RETURN domain // will return 'bar.com'
-
-
-
-
-
WITH 'http://www.example.com/all-the-things' AS url
-CALL apoc.data.domain(url) YIELD domain
-RETURN domain // will return 'www.example.com'
-
-
-
-

There is also a procedure that does the same:

-
-
-
-
CALL apoc.date.expire(node,time,'time-unit');
-CALL apoc.date.expire(n,100,'s');
-
-
-
-
copies over the name property of each person to lastname
-
-
CALL apoc.periodic.rock_n_roll('match (p:Person) return id(p) as id_p', 'MATCH (p) where id(p)={id_p} SET p.lastname =p.name', 20000)
-
-
diff --git a/full/import/apoc-core-extended.csv b/full/import/apoc-core-extended.csv index 2602638488..2e8b9d87f1 100644 --- a/full/import/apoc-core-extended.csv +++ b/full/import/apoc-core-extended.csv @@ -16,7 +16,6 @@ apoc.algo.aStarConfig,CORE apoc.algo.cosineSimilarity,EXTENDED apoc.algo.cover,CORE apoc.algo.dijkstra,CORE -apoc.algo.dijkstraWithDefaultWeight,CORE apoc.algo.euclideanDistance,EXTENDED apoc.algo.euclideanSimilarity,EXTENDED apoc.any.properties,CORE @@ -31,7 +30,6 @@ apoc.bitwise.op,CORE apoc.bolt.execute,EXTENDED apoc.bolt.load,EXTENDED apoc.case,CORE -apoc.cluster.graph,EXTENDED apoc.coll.avg,CORE apoc.coll.combinations,CORE apoc.coll.contains,CORE @@ -64,7 +62,6 @@ apoc.coll.randomItem,CORE apoc.coll.randomItems,CORE apoc.coll.remove,CORE apoc.coll.removeAll,CORE -apoc.coll.reverse,CORE apoc.coll.set,CORE apoc.coll.shuffle,CORE apoc.coll.sort,CORE @@ -133,12 +130,8 @@ apoc.create.virtual.fromNode,CORE apoc.create.vNode,CORE apoc.create.vNode,CORE apoc.create.vNodes,CORE -apoc.create.vPattern,CORE -apoc.create.vPatternFull,CORE apoc.create.vRelationship,CORE apoc.create.vRelationship,CORE -apoc.custom.asFunction,EXTENDED -apoc.custom.asProcedure,EXTENDED apoc.custom.declareFunction,EXTENDED apoc.custom.declareProcedure,EXTENDED apoc.custom.list,EXTENDED @@ -152,28 +145,23 @@ apoc.cypher.parallel2,EXTENDED apoc.cypher.run,CORE apoc.cypher.runFile,EXTENDED apoc.cypher.runFiles,EXTENDED -apoc.cypher.runFirstColumn,CORE apoc.cypher.runFirstColumnMany,CORE apoc.cypher.runFirstColumnSingle,CORE apoc.cypher.runMany,CORE apoc.cypher.runSchemaFile,EXTENDED apoc.cypher.runSchemaFiles,EXTENDED apoc.cypher.runTimeboxed,CORE -apoc.data.domain,CORE apoc.data.email,CORE apoc.data.url,CORE apoc.date.add,CORE apoc.date.convert,CORE apoc.date.convertFormat,CORE apoc.date.currentTimestamp,CORE -apoc.date.expire,EXTENDED -apoc.date.expireIn,EXTENDED apoc.date.field,CORE apoc.date.fields,CORE apoc.date.format,CORE apoc.date.fromISO8601,CORE apoc.date.parse,CORE -apoc.date.parseAsZonedDateTime,CORE apoc.date.systemTimezone,CORE apoc.date.toISO8601,CORE apoc.date.toYears,CORE @@ -197,10 +185,6 @@ apoc.export.cypher.data,CORE apoc.export.cypher.graph,CORE apoc.export.cypher.query,CORE apoc.export.cypher.schema,CORE -apoc.export.cypherAll,CORE -apoc.export.cypherData,CORE -apoc.export.cypherGraph,CORE -apoc.export.cypherQuery,CORE apoc.export.graphml.all,CORE apoc.export.graphml.data,CORE apoc.export.graphml.graph,CORE @@ -242,7 +226,6 @@ apoc.load.csv,EXTENDED apoc.load.driver,EXTENDED apoc.load.html,EXTENDED apoc.load.jdbc,EXTENDED -apoc.load.jdbcParams,EXTENDED apoc.load.jdbcUpdate,EXTENDED apoc.load.json,CORE apoc.load.jsonArray,CORE @@ -292,7 +275,6 @@ apoc.math.minDouble,CORE apoc.math.minInt,CORE apoc.math.minLong,CORE apoc.math.regr,CORE -apoc.math.round,CORE apoc.merge.node,CORE apoc.merge.node.eager,CORE apoc.merge.relationship,CORE @@ -303,7 +285,6 @@ apoc.meta.cypher.types,CORE apoc.meta.data,CORE apoc.meta.graph,CORE apoc.meta.graphSample,CORE -apoc.meta.isType,CORE apoc.meta.nodeTypeProperties,CORE apoc.meta.nodeTypeProperties,CORE apoc.meta.relTypeProperties,CORE @@ -312,20 +293,10 @@ apoc.meta.schema,CORE apoc.meta.stats,CORE apoc.meta.stats,CORE apoc.meta.subGraph,CORE -apoc.meta.type,CORE -apoc.meta.typeName,CORE -apoc.meta.types,CORE apoc.metrics.get,EXTENDED apoc.metrics.list,EXTENDED apoc.metrics.storage,EXTENDED apoc.model.jdbc,EXTENDED -apoc.mongodb.count,EXTENDED -apoc.mongodb.delete,EXTENDED -apoc.mongodb.find,EXTENDED -apoc.mongodb.first,EXTENDED -apoc.mongodb.get,EXTENDED -apoc.mongodb.insert,EXTENDED -apoc.mongodb.update,EXTENDED apoc.monitor.ids,EXTENDED apoc.monitor.kernel,EXTENDED apoc.monitor.store,EXTENDED @@ -385,12 +356,9 @@ apoc.periodic.countdown,CORE apoc.periodic.iterate,CORE apoc.periodic.list,CORE apoc.periodic.repeat,CORE -apoc.periodic.rock_n_roll,EXTENDED -apoc.periodic.rock_n_roll_while,EXTENDED apoc.periodic.submit,CORE apoc.refactor.categorize,CORE apoc.refactor.cloneNodes,CORE -apoc.refactor.cloneNodesWithRelationships,CORE apoc.refactor.cloneSubgraph,CORE apoc.refactor.cloneSubgraphFromPaths,CORE apoc.refactor.collapseNode,CORE @@ -428,7 +396,6 @@ apoc.spatial.geocodeOnce,CORE apoc.spatial.reverseGeocode,CORE apoc.spatial.sortByDistance,CORE apoc.static.get,EXTENDED -apoc.static.get,EXTENDED apoc.static.getAll,EXTENDED apoc.static.list,EXTENDED apoc.static.set,EXTENDED @@ -454,7 +421,6 @@ apoc.text.decapitalize,CORE apoc.text.decapitalizeAll,CORE apoc.text.distance,CORE apoc.text.doubleMetaphone,CORE -apoc.text.doubleMetaphone,CORE apoc.text.format,CORE apoc.text.fuzzyMatch,CORE apoc.text.hammingDistance,CORE @@ -468,7 +434,6 @@ apoc.text.levenshteinDistance,CORE apoc.text.levenshteinSimilarity,CORE apoc.text.lpad,CORE apoc.text.phonetic,CORE -apoc.text.phonetic,CORE apoc.text.phoneticDelta,CORE apoc.text.random,CORE apoc.text.regexGroups,CORE @@ -509,9 +474,7 @@ apoc.uuid.remove,EXTENDED apoc.uuid.removeAll,EXTENDED apoc.version,CORE apoc.version,CORE -apoc.warmup.run,CORE apoc.when,CORE -apoc.xml.import,CORE apoc.xml.parse,CORE , , diff --git a/full/src/main/resources/extended.txt b/full/src/main/resources/extended.txt index 937c2dbd06..ea55a49d19 100644 --- a/full/src/main/resources/extended.txt +++ b/full/src/main/resources/extended.txt @@ -2,7 +2,6 @@ apoc.algo.aStarWithPoint apoc.bolt.execute apoc.bolt.load apoc.bolt.load.fromLocal -apoc.cluster.graph apoc.config.list apoc.config.map apoc.couchbase.append @@ -16,8 +15,6 @@ apoc.couchbase.query apoc.couchbase.remove apoc.couchbase.replace apoc.couchbase.upsert -apoc.custom.asFunction -apoc.custom.asProcedure apoc.custom.declareFunction apoc.custom.declareProcedure apoc.custom.list @@ -31,8 +28,6 @@ apoc.cypher.runFile apoc.cypher.runFiles apoc.cypher.runSchemaFile apoc.cypher.runSchemaFiles -apoc.date.expire -apoc.date.expireIn apoc.dv.catalog.add apoc.dv.catalog.list apoc.dv.catalog.remove @@ -68,7 +63,6 @@ apoc.load.driver apoc.load.html apoc.load.htmlPlainText apoc.load.jdbc -apoc.load.jdbcParams apoc.load.jdbcUpdate apoc.load.ldap apoc.load.xls @@ -86,14 +80,7 @@ apoc.mongo.delete apoc.mongo.find apoc.mongo.insert apoc.mongo.update -apoc.mongodb.count -apoc.mongodb.delete -apoc.mongodb.find -apoc.mongodb.first -apoc.mongodb.get apoc.mongodb.get.byObjectId -apoc.mongodb.insert -apoc.mongodb.update apoc.monitor.ids apoc.monitor.kernel apoc.monitor.store @@ -114,8 +101,6 @@ apoc.nlp.gcp.classify.graph apoc.nlp.gcp.classify.stream apoc.nlp.gcp.entities.graph apoc.nlp.gcp.entities.stream -apoc.periodic.rock_n_roll -apoc.periodic.rock_n_roll_while apoc.redis.append apoc.redis.configGet apoc.redis.configSet @@ -147,7 +132,6 @@ apoc.redis.zadd apoc.redis.zcard apoc.redis.zrangebyscore apoc.redis.zrem -apoc.static.get apoc.static.list apoc.static.set apoc.systemdb.execute diff --git a/full/src/test/java/DocsTest.java b/full/src/test/java/DocsTest.java index bba4ec2208..5a14d64464 100644 --- a/full/src/test/java/DocsTest.java +++ b/full/src/test/java/DocsTest.java @@ -142,8 +142,6 @@ private Map docsMapping() { docs.put("apoc.mongodb.*", "database-integration/mongodb.adoc"); docs.put("apoc.neighbors.*", "graph-querying/neighborhood.adoc"); docs.put("apoc.monitor.*", "database-introspection/monitoring.adoc"); - docs.put("apoc.periodic.rock_n_roll", "graph-updates/periodic-execution.adoc#periodic-rock-n-roll"); - docs.put("apoc.refactor.cloneNodesWithRelationships", "graph-updates/graph-refactoring/clone-nodes.adoc"); docs.put("apoc.refactor.merge.*", "graph-updates/graph-refactoring/merge-nodes.adoc"); docs.put("apoc.refactor.to|apoc.refactor.from", "graph-updates/graph-refactoring/redirect-relationship.adoc"); docs.put("apoc.refactor.invert", "graph-updates/graph-refactoring/invert-relationship.adoc"); diff --git a/full/src/test/resources/signatures.csv b/full/src/test/resources/signatures.csv index 0137e4e618..75d542801d 100644 --- a/full/src/test/resources/signatures.csv +++ b/full/src/test/resources/signatures.csv @@ -101,7 +101,6 @@ apoc.algo.cliquesWithNode,"apoc.algo.cliquesWithNode(startNode :: NODE?, minSize apoc.algo.community,"apoc.algo.community(times :: INTEGER?, labels :: LIST? OF STRING?, partitionKey :: STRING?, type :: STRING?, direction :: STRING?, weightKey :: STRING?, batchSize :: INTEGER?) :: VOID" apoc.algo.cover,apoc.algo.cover(nodes :: ANY?) :: (rel :: RELATIONSHIP?) apoc.algo.dijkstra,"apoc.algo.dijkstra(startNode :: NODE?, endNode :: NODE?, relationshipTypesAndDirections :: STRING?, weightPropertyName :: STRING?, defaultWeight = NaN :: FLOAT?, numberOfWantedPaths = 1 :: INTEGER?) :: (path :: PATH?, weight :: FLOAT?)" -apoc.algo.dijkstraWithDefaultWeight,"apoc.algo.dijkstraWithDefaultWeight(startNode :: NODE?, endNode :: NODE?, relationshipTypesAndDirections :: STRING?, weightPropertyName :: STRING?, defaultWeight :: FLOAT?) :: (path :: PATH?, weight :: FLOAT?)" apoc.algo.pageRank,"apoc.algo.pageRank(nodes :: LIST? OF NODE?) :: (node :: NODE?, score :: FLOAT?)" apoc.algo.pageRankStats,"apoc.algo.pageRankStats(config :: MAP?) :: (nodes :: INTEGER?, relationships :: INTEGER?, iterations :: INTEGER?, readNodeMillis :: INTEGER?, readRelationshipMillis :: INTEGER?, computeMillis :: INTEGER?, writeMillis :: INTEGER?, write :: BOOLEAN?, property :: STRING?)" apoc.algo.pageRankWithConfig,"apoc.algo.pageRankWithConfig(nodes :: LIST? OF NODE?, config :: MAP?) :: (node :: NODE?, score :: FLOAT?)" @@ -116,7 +115,6 @@ apoc.atomic.update,"apoc.atomic.update(container :: ANY?, propertyName :: STRING apoc.bolt.execute,"apoc.bolt.execute(url :: STRING?, kernelTransaction :: STRING?, params = {} :: MAP?, config = {} :: MAP?) :: (row :: MAP?)" apoc.bolt.load,"apoc.bolt.load(url :: STRING?, kernelTransaction :: STRING?, params = {} :: MAP?, config = {} :: MAP?) :: (row :: MAP?)" apoc.case,"apoc.case(conditionals :: LIST? OF ANY?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)" -apoc.cluster.graph,"apoc.cluster.graph() :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?)" apoc.coll.elements,"apoc.coll.elements(values :: LIST? OF ANY?, limit = -1 :: INTEGER?, offset = 0 :: INTEGER?) :: (_1 :: ANY?, _2 :: ANY?, _3 :: ANY?, _4 :: ANY?, _5 :: ANY?, _6 :: ANY?, _7 :: ANY?, _8 :: ANY?, _9 :: ANY?, _10 :: ANY?, _1s :: STRING?, _2s :: STRING?, _3s :: STRING?, _4s :: STRING?, _5s :: STRING?, _6s :: STRING?, _7s :: STRING?, _8s :: STRING?, _9s :: STRING?, _10s :: STRING?, _1i :: INTEGER?, _2i :: INTEGER?, _3i :: INTEGER?, _4i :: INTEGER?, _5i :: INTEGER?, _6i :: INTEGER?, _7i :: INTEGER?, _8i :: INTEGER?, _9i :: INTEGER?, _10i :: INTEGER?, _1f :: FLOAT?, _2f :: FLOAT?, _3f :: FLOAT?, _4f :: FLOAT?, _5f :: FLOAT?, _6f :: FLOAT?, _7f :: FLOAT?, _8f :: FLOAT?, _9f :: FLOAT?, _10f :: FLOAT?, _1b :: BOOLEAN?, _2b :: BOOLEAN?, _3b :: BOOLEAN?, _4b :: BOOLEAN?, _5b :: BOOLEAN?, _6b :: BOOLEAN?, _7b :: BOOLEAN?, _8b :: BOOLEAN?, _9b :: BOOLEAN?, _10b :: BOOLEAN?, _1l :: LIST? OF ANY?, _2l :: LIST? OF ANY?, _3l :: LIST? OF ANY?, _4l :: LIST? OF ANY?, _5l :: LIST? OF ANY?, _6l :: LIST? OF ANY?, _7l :: LIST? OF ANY?, _8l :: LIST? OF ANY?, _9l :: LIST? OF ANY?, _10l :: LIST? OF ANY?, _1m :: MAP?, _2m :: MAP?, _3m :: MAP?, _4m :: MAP?, _5m :: MAP?, _6m :: MAP?, _7m :: MAP?, _8m :: MAP?, _9m :: MAP?, _10m :: MAP?, _1n :: NODE?, _2n :: NODE?, _3n :: NODE?, _4n :: NODE?, _5n :: NODE?, _6n :: NODE?, _7n :: NODE?, _8n :: NODE?, _9n :: NODE?, _10n :: NODE?, _1r :: RELATIONSHIP?, _2r :: RELATIONSHIP?, _3r :: RELATIONSHIP?, _4r :: RELATIONSHIP?, _5r :: RELATIONSHIP?, _6r :: RELATIONSHIP?, _7r :: RELATIONSHIP?, _8r :: RELATIONSHIP?, _9r :: RELATIONSHIP?, _10r :: RELATIONSHIP?, _1p :: PATH?, _2p :: PATH?, _3p :: PATH?, _4p :: PATH?, _5p :: PATH?, _6p :: PATH?, _7p :: PATH?, _8p :: PATH?, _9p :: PATH?, _10p :: PATH?, elements :: INTEGER?)" apoc.coll.partition,"apoc.coll.partition(values :: LIST? OF ANY?, batchSize :: INTEGER?) :: (value :: LIST? OF ANY?)" apoc.coll.split,"apoc.coll.split(values :: LIST? OF ANY?, value :: ANY?) :: (value :: LIST? OF ANY?)" @@ -151,11 +149,7 @@ apoc.create.setRelProperty,"apoc.create.setRelProperty(relationships :: ANY?, ke apoc.create.uuids,"apoc.create.uuids(count :: INTEGER?) :: (row :: INTEGER?, uuid :: STRING?)" apoc.create.vNode,"apoc.create.vNode(label :: LIST? OF STRING?, props :: MAP?) :: (node :: NODE?)" apoc.create.vNodes,"apoc.create.vNodes(label :: LIST? OF STRING?, props :: LIST? OF MAP?) :: (node :: NODE?)" -apoc.create.vPattern,"apoc.create.vPattern(from :: MAP?, relType :: STRING?, props :: MAP?, to :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?)" -apoc.create.vPatternFull,"apoc.create.vPatternFull(labelsN :: LIST? OF STRING?, n :: MAP?, relType :: STRING?, props :: MAP?, labelsM :: LIST? OF STRING?, m :: MAP?) :: (from :: NODE?, rel :: RELATIONSHIP?, to :: NODE?)" apoc.create.vRelationship,"apoc.create.vRelationship(from :: NODE?, relType :: STRING?, props :: MAP?, to :: NODE?) :: (rel :: RELATIONSHIP?)" -apoc.custom.asFunction,"apoc.custom.asFunction(name :: STRING?, statement :: STRING?, outputs = :: STRING?, inputs = null :: LIST? OF LIST? OF STRING?, forceSingle = false :: BOOLEAN?, description = null :: STRING?) :: VOID" -apoc.custom.asProcedure,"apoc.custom.asProcedure(name :: STRING?, statement :: STRING?, mode = read :: STRING?, outputs = null :: LIST? OF LIST? OF STRING?, inputs = null :: LIST? OF LIST? OF STRING?, description = null :: STRING?) :: VOID" apoc.custom.list,"apoc.custom.list() :: (type :: STRING?, name :: STRING?, description :: STRING?, mode :: STRING?, statement :: STRING?, inputs :: LIST? OF LIST? OF STRING?, outputs :: ANY?, forceSingle :: BOOLEAN?)" apoc.cypher.doIt,"apoc.cypher.doIt(cypher :: STRING?, params :: MAP?) :: (value :: MAP?)" apoc.cypher.mapParallel,"apoc.cypher.mapParallel(fragment :: STRING?, params :: MAP?, list :: LIST? OF ANY?) :: (value :: MAP?)" @@ -169,8 +163,6 @@ apoc.cypher.runMany,"apoc.cypher.runMany(cypher :: STRING?, params :: MAP?, conf apoc.cypher.runSchemaFile,"apoc.cypher.runSchemaFile(file :: STRING?, config = {} :: MAP?) :: (row :: INTEGER?, result :: MAP?)" apoc.cypher.runSchemaFiles,"apoc.cypher.runSchemaFiles(file :: LIST? OF STRING?, config = {} :: MAP?) :: (row :: INTEGER?, result :: MAP?)" apoc.cypher.runTimeboxed,"apoc.cypher.runTimeboxed(cypher :: STRING?, params :: MAP?, timeout :: INTEGER?) :: (value :: MAP?)" -apoc.date.expire,"apoc.date.expire(node :: NODE?, time :: INTEGER?, timeUnit :: STRING?) :: VOID" -apoc.date.expireIn,"apoc.date.expireIn(node :: NODE?, timeDelta :: INTEGER?, timeUnit :: STRING?) :: VOID" apoc.do.case,"apoc.do.case(conditionals :: LIST? OF ANY?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)" apoc.do.when,"apoc.do.when(condition :: BOOLEAN?, ifQuery :: STRING?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)" apoc.es.get,"apoc.es.get(host :: STRING?, index :: STRING?, type :: STRING?, id :: STRING?, query :: ANY?, payload :: ANY?) :: (value :: MAP?)" @@ -190,10 +182,6 @@ apoc.export.cypher.data,"apoc.export.cypher.data(nodes :: LIST? OF NODE?, rels : apoc.export.cypher.graph,"apoc.export.cypher.graph(graph :: MAP?, file = :: STRING?, config = {} :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)" apoc.export.cypher.query,"apoc.export.cypher.query(query :: STRING?, file = :: STRING?, config = {} :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)" apoc.export.cypher.schema,"apoc.export.cypher.schema(file = :: STRING?, config = {} :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)" -apoc.export.cypherAll,"apoc.export.cypherAll(file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)" -apoc.export.cypherData,"apoc.export.cypherData(nodes :: LIST? OF NODE?, rels :: LIST? OF RELATIONSHIP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)" -apoc.export.cypherGraph,"apoc.export.cypherGraph(graph :: MAP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)" -apoc.export.cypherQuery,"apoc.export.cypherQuery(query :: STRING?, file :: STRING?, config :: MAP?) :: (file :: STRING?, batches :: INTEGER?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, cypherStatements :: STRING?, nodeStatements :: STRING?, relationshipStatements :: STRING?, schemaStatements :: STRING?, cleanupStatements :: STRING?)" apoc.export.graphml.all,"apoc.export.graphml.all(file :: STRING?, config :: MAP?) :: (file :: STRING?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, batches :: INTEGER?, done :: BOOLEAN?, data :: STRING?)" apoc.export.graphml.data,"apoc.export.graphml.data(nodes :: LIST? OF NODE?, rels :: LIST? OF RELATIONSHIP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, batches :: INTEGER?, done :: BOOLEAN?, data :: STRING?)" apoc.export.graphml.graph,"apoc.export.graphml.graph(graph :: MAP?, file :: STRING?, config :: MAP?) :: (file :: STRING?, source :: STRING?, format :: STRING?, nodes :: INTEGER?, relationships :: INTEGER?, properties :: INTEGER?, time :: INTEGER?, rows :: INTEGER?, batchSize :: INTEGER?, batches :: INTEGER?, done :: BOOLEAN?, data :: STRING?)" @@ -251,7 +239,6 @@ apoc.load.csv,"apoc.load.csv(url :: STRING?, config = {} :: MAP?) :: (lineNo :: apoc.load.driver,apoc.load.driver(driverClass :: STRING?) :: VOID apoc.load.html,"apoc.load.html(url :: STRING?, query = {} :: MAP?, config = {} :: MAP?) :: (value :: MAP?)" apoc.load.jdbc,"apoc.load.jdbc(jdbc :: STRING?, tableOrSql :: STRING?, params = [] :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?)" -apoc.load.jdbcParams,"apoc.load.jdbcParams(jdbc :: STRING?, sql :: STRING?, params :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?)" apoc.load.jdbcUpdate,"apoc.load.jdbcUpdate(jdbc :: STRING?, query :: STRING?, params = [] :: LIST? OF ANY?, config = {} :: MAP?) :: (row :: MAP?)" apoc.load.json,"apoc.load.json(url :: STRING?, path = :: STRING?, config = {} :: MAP?) :: (value :: MAP?)" apoc.load.jsonArray,"apoc.load.jsonArray(url :: STRING?, path = :: STRING?) :: (value :: ANY?)" @@ -283,13 +270,6 @@ apoc.metrics.get,"apoc.metrics.get(metricName :: STRING?, config = {} :: MAP?) : apoc.metrics.list,"apoc.metrics.list() :: (name :: STRING?, lastUpdated :: INTEGER?)" apoc.metrics.storage,"apoc.metrics.storage(directorySetting :: STRING?) :: (setting :: STRING?, freeSpaceBytes :: INTEGER?, totalSpaceBytes :: INTEGER?, usableSpaceBytes :: INTEGER?, percentFree :: FLOAT?)" apoc.model.jdbc,"apoc.model.jdbc(jdbc :: STRING?, config = {} :: MAP?) :: (nodes :: LIST? OF NODE?, relationships :: LIST? OF RELATIONSHIP?)" -apoc.mongodb.count,"apoc.mongodb.count(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?)" -apoc.mongodb.delete,"apoc.mongodb.delete(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?) :: (value :: INTEGER?)" -apoc.mongodb.find,"apoc.mongodb.find(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, project :: MAP?, sort :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?) :: (value :: MAP?)" -apoc.mongodb.first,"apoc.mongodb.first(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = false :: BOOLEAN?) :: (value :: MAP?)" -apoc.mongodb.get,"apoc.mongodb.get(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, compatibleValues = false :: BOOLEAN?, skip = 0 :: INTEGER?, limit = 0 :: INTEGER?) :: (value :: MAP?)" -apoc.mongodb.insert,"apoc.mongodb.insert(host :: STRING?, db :: STRING?, collection :: STRING?, documents :: LIST? OF MAP?) :: VOID" -apoc.mongodb.update,"apoc.mongodb.update(host :: STRING?, db :: STRING?, collection :: STRING?, query :: MAP?, update :: MAP?) :: (value :: INTEGER?)" apoc.monitor.ids,"apoc.monitor.ids() :: (nodeIds :: INTEGER?, relIds :: INTEGER?, propIds :: INTEGER?, relTypeIds :: INTEGER?)" apoc.monitor.kernel,"apoc.monitor.kernel() :: (readOnly :: BOOLEAN?, kernelVersion :: STRING?, storeId :: STRING?, kernelStartTime :: STRING?, databaseName :: STRING?, storeLogVersion :: INTEGER?, storeCreationDate :: STRING?)" apoc.monitor.locks,"apoc.monitor.locks(minWaitTime :: INTEGER?) :: (advertedDeadLocks :: INTEGER?, lockCount :: INTEGER?, contendedLockCount :: INTEGER?, minimumWaitTimeMs :: INTEGER?, contendedLocks :: LIST? OF MAP?, info :: STRING?)" @@ -318,12 +298,9 @@ apoc.periodic.countdown,"apoc.periodic.countdown(name :: STRING?, statement :: S apoc.periodic.iterate,"apoc.periodic.iterate(cypherIterate :: STRING?, cypherAction :: STRING?, config :: MAP?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?)" apoc.periodic.list,"apoc.periodic.list() :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?)" apoc.periodic.repeat,"apoc.periodic.repeat(name :: STRING?, statement :: STRING?, rate :: INTEGER?, config = {} :: MAP?) :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?)" -apoc.periodic.rock_n_roll,"apoc.periodic.rock_n_roll(cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (batches :: INTEGER?, total :: INTEGER?, timeTaken :: INTEGER?, committedOperations :: INTEGER?, failedOperations :: INTEGER?, failedBatches :: INTEGER?, retries :: INTEGER?, errorMessages :: MAP?, batch :: MAP?, operations :: MAP?, wasTerminated :: BOOLEAN?, failedParams :: MAP?)" -apoc.periodic.rock_n_roll_while,"apoc.periodic.rock_n_roll_while(cypherLoop :: STRING?, cypherIterate :: STRING?, cypherAction :: STRING?, batchSize :: INTEGER?) :: (loop :: ANY?, batches :: INTEGER?, total :: INTEGER?)" apoc.periodic.submit,"apoc.periodic.submit(name :: STRING?, statement :: STRING?) :: (name :: STRING?, delay :: INTEGER?, rate :: INTEGER?, done :: BOOLEAN?, cancelled :: BOOLEAN?)" apoc.refactor.categorize,"apoc.refactor.categorize(sourceKey :: STRING?, type :: STRING?, outgoing :: BOOLEAN?, label :: STRING?, targetKey :: STRING?, copiedKeys :: LIST? OF STRING?, batchSize :: INTEGER?) :: VOID" apoc.refactor.cloneNodes,"apoc.refactor.cloneNodes(nodes :: LIST? OF NODE?, withRelationships = false :: BOOLEAN?, skipProperties = [] :: LIST? OF STRING?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)" -apoc.refactor.cloneNodesWithRelationships,"apoc.refactor.cloneNodesWithRelationships(nodes :: LIST? OF NODE?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)" apoc.refactor.cloneSubgraph,"apoc.refactor.cloneSubgraph(nodes :: LIST? OF NODE?, rels = [] :: LIST? OF RELATIONSHIP?, config = {} :: MAP?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)" apoc.refactor.cloneSubgraphFromPaths,"apoc.refactor.cloneSubgraphFromPaths(paths :: LIST? OF PATH?, config = {} :: MAP?) :: (input :: INTEGER?, output :: NODE?, error :: STRING?)" apoc.refactor.collapseNode,"apoc.refactor.collapseNode(nodes :: ANY?, type :: STRING?) :: (input :: INTEGER?, output :: RELATIONSHIP?, error :: STRING?)" @@ -359,7 +336,6 @@ apoc.static.list,"apoc.static.list(prefix :: STRING?) :: (key :: STRING?, value apoc.static.set,"apoc.static.set(key :: STRING?, value :: ANY?) :: (value :: ANY?)" apoc.stats.degrees,"apoc.stats.degrees(types = :: STRING?) :: (type :: STRING?, direction :: STRING?, total :: INTEGER?, p50 :: INTEGER?, p75 :: INTEGER?, p90 :: INTEGER?, p95 :: INTEGER?, p99 :: INTEGER?, p999 :: INTEGER?, max :: INTEGER?, min :: INTEGER?, mean :: FLOAT?)" apoc.text.doubleMetaphone,apoc.text.doubleMetaphone(value :: ANY?) :: (value :: STRING?) -apoc.text.phonetic,apoc.text.phonetic(value :: ANY?) :: (value :: STRING?) apoc.text.phoneticDelta,"apoc.text.phoneticDelta(text1 :: STRING?, text2 :: STRING?) :: (phonetic1 :: STRING?, phonetic2 :: STRING?, delta :: INTEGER?)" apoc.trigger.add,"apoc.trigger.add(name :: STRING?, kernelTransaction :: STRING?, selector :: MAP?, config = {} :: MAP?) :: (name :: STRING?, query :: STRING?, selector :: MAP?, params :: MAP?, installed :: BOOLEAN?, paused :: BOOLEAN?)" apoc.trigger.list,"apoc.trigger.list() :: (name :: STRING?, query :: STRING?, selector :: MAP?, params :: MAP?, installed :: BOOLEAN?, paused :: BOOLEAN?)" @@ -373,9 +349,7 @@ apoc.uuid.install,"apoc.uuid.install(label :: STRING?, config = {} :: MAP?) :: ( apoc.uuid.list,"apoc.uuid.list() :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)" apoc.uuid.remove,"apoc.uuid.remove(label :: STRING?) :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)" apoc.uuid.removeAll,"apoc.uuid.removeAll() :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)" -apoc.warmup.run,"apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?)" apoc.when,"apoc.when(condition :: BOOLEAN?, ifQuery :: STRING?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)" -apoc.xml.import,"apoc.xml.import(url :: STRING?, config = {} :: MAP?) :: (node :: NODE?)" db.awaitIndex,"db.awaitIndex(index :: STRING?, timeOutSeconds = 300 :: INTEGER?) :: VOID" db.awaitIndexes,db.awaitIndexes(timeOutSeconds = 300 :: INTEGER?) :: VOID db.createLabel,db.createLabel(newLabel :: STRING?) :: VOID From d5113153a9e7cbe64009f67faf2c673d17ca84fa Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Mon, 18 Jul 2022 12:02:52 +0200 Subject: [PATCH 3/9] Add documentation about deprecation removals --- docs/asciidoc/modules/ROOT/nav.adoc | 4 +- .../deprecations-and-additions/index.adoc | 515 ++++++++++++++++++ 2 files changed, 518 insertions(+), 1 deletion(-) create mode 100644 docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc diff --git a/docs/asciidoc/modules/ROOT/nav.adoc b/docs/asciidoc/modules/ROOT/nav.adoc index f13e2cff78..a83f3bf3a9 100644 --- a/docs/asciidoc/modules/ROOT/nav.adoc +++ b/docs/asciidoc/modules/ROOT/nav.adoc @@ -153,4 +153,6 @@ include::partial$generated-documentation/nav.adoc[] ** xref::algorithms/path-finding-procedures.adoc[] ** xref::algorithms/similarity.adoc[] -* xref::transaction/index.adoc[] \ No newline at end of file +* xref::transaction/index.adoc[] + +* xref::deprecations-and-additions/index.adoc[] \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc b/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc new file mode 100644 index 0000000000..b9f2935b85 --- /dev/null +++ b/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc @@ -0,0 +1,515 @@ +[[deprecations-and-additions]] += Deprecations and additions +:description: This chapter lists all the features that have been removed, deprecated, added or extended in the recent versions of APOC. + +This chapter lists all the features that have been removed, deprecated, added or extended in the recent versions of APOC. + +[[apoc-deprecations-additions-removals-5.0]] +== Version 5.0 + +=== Removed procedures + +[cols="2", options="header"] +|=== +| Feature +| Details + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.data.domain('url_or_email_address') YIELD domain +---- +a| +Replaced by ExtractEmail or ExtractURI: +[source, cypher, role="noheader"] +---- +apoc.data.email('email_address') +---- +[source, cypher, role="noheader"] +---- +apoc.data.url('url') +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, 'KNOWS', 'distance', 10) YIELD path, weight +---- +a| +Use the following instead: +[source, cypher, role="noheader"] +---- +apoc.algo.dijkstra(startNode, endNode, 'KNOWS', 'distance', defaultValue, numberOfWantedResults) YIELD path, weight +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.date.parseAsZonedDateTime('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.temporal.toZonedTemporal('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC-hour-offset') +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.coll.reverse(coll) +---- +a| +Replaced in Cypher with: +[source, cypher, role="noheader"] +---- +WITH [4923,'abc',521, null, 487] AS ids +RETURN reverse(ids) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.export.cypherAll(file,config) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.export.cypher.all(file,config) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.export.cypherData(nodes,rels,file,config) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.export.cypher.data(nodes,rels,file,config) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.export.cypherGraph(graph,file,config) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.export.cypher.graph(graph,file,config) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.export.cypherQuery(query,file,config) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.export.cypher.query(query,file,config) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.meta.type(value) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.meta.cypher.type(value) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.meta.types(node-relationship-map) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.meta.cypher.types(node-relationship-map) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.meta.isType(value,type) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.meta.cypher.isType(value,type) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.meta.typeName(value) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.meta.cypher.type(value) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.periodic.rock_n_roll_while('some cypher for knowing when to stop', 'some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total +---- +a| +Partially replaced in Cypher with: +[source, cypher, role="noheader"] +---- +CALL {} IN TRANSACTIONS OF n ROWS +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.periodic.rock_n_roll('some cypher for iteration', 'some cypher as action on each iteration', 10000) YIELD batches, total +---- +a| +Replaced in Cypher with: +[source, cypher, role="noheader"] +---- +CALL {} IN TRANSACTIONS OF n ROWS +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.create.vPattern({_labels:['LabelA'],key:value},'KNOWS',{key:value,...}, {_labels:['LabelB'],key:value}) returns a virtual pattern +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.create.virtualPath(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.create.vPatternFull(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) returns a virtual pattern +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.create.virtualPath(['LabelA'],{key:value},'KNOWS',{key:value,...},['LabelB'],{key:value}) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.xml.import(url, config) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.import.xml(file,config) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.refactor.cloneNodesWithRelationships([node1,node2,...]) +---- +a| +Use the following instead, and set withRelationships = true: +[source, cypher, role="noheader"] +---- +apoc.refactor.cloneNodes(nodes, withRelationships, skipProperties) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.text.phonetic(value) yield value +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.text.phonetic(text) yield value +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.text.doubleMetaphone(value) yield value +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.text.doubleMetaphone(text) yield value +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.math.round(value,[prec],mode=[CEILING,FLOOR,UP,DOWN,HALF_EVEN,HALF_DOWN,HALF_UP,DOWN,UNNECESSARY]) +---- +a| +Replaced by the Neo4j round() function: +[source, cypher, role="noheader"] +---- +RETURN round(3.141592, 3) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) +---- +a| +This procedure duplicated functionality of page cache warm up which is a part of the DBMS. + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.date.expire(node,time,'time-unit') +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.ttl.expire(node,time,'time-unit') +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.date.expireIn(node,time,'time-unit') +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.ttl.expireIn(node,timeDelta,'time-unit') +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.mongodb.get() +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.mongo.find(uri, query, $config) yield value +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.mongodb.count(host-or-key,db,collection,query) yield value +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.mongo.count(uri, query, $config) yield value +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.mongodb.first() yield value +---- +a| + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.mongodb.find() yield value +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.mongo.find(uri, query, $config) yield value +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.mongodb.insert(host-or-key,db,collection,documents) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.mongo.insert(uri, documents, $config) yield value +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.mongodb.delete(host-or-key,db,collection,query) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.mongo.delete(uri, query, $config) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.mongodb.update(host-or-key,db,collection,query,update) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.mongo.update(uri, query, update, $config) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.cluster.graph() +---- +a| + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.load.jdbcParams() +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.load.jdbc('key or url','',[params]) YIELD row +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.custom.declareProcedure(signature, statement, mode, description) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.custom.declareFunction(signature, statement, forceSingle, description) +---- + +a| +label:procedure[] +label:removed[] +[source, cypher, role="noheader"] +---- +apoc.cypher.runFirstColumn(statement, params, expectMultipleValues) +---- +a| +Replaced by: +[source, cypher, role="noheader"] +---- +apoc.cypher.runFirstColumnMany(statement, params) +---- +[source, cypher, role="noheader"] +---- +apoc.cypher.runFirstColumnSingle(statement, params) +---- +|=== \ No newline at end of file From c78aa1ffdd8458ff4bcf932137efe03e1ab1f414 Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Thu, 21 Jul 2022 13:05:29 +0200 Subject: [PATCH 4/9] Bring back apoc.warmup.run (deprecated 5.0 only) --- core/src/main/java/apoc/warmup/Warmup.java | 217 ++++++++++++++++++ .../src/test/java/apoc/warmup/WarmupTest.java | 71 ++++++ .../apoc.warmup-lite.csv | 2 + .../generated-documentation/apoc.warmup.csv | 6 + .../apoc.warmup.run-lite.csv | 2 + .../apoc.warmup.run.adoc | 5 + .../apoc.warmup.run.csv | 2 + .../modules/ROOT/pages/operational/index.adoc | 1 + .../ROOT/pages/operational/warmup.adoc | 10 + .../overview/apoc.warmup/apoc.warmup.run.adoc | 70 ++++++ .../pages/overview/apoc.warmup/index.adoc | 17 ++ .../ROOT/partials/usage/apoc.warmup.run.adoc | 51 ++++ full/src/test/resources/signatures.csv | 1 + 13 files changed, 455 insertions(+) create mode 100644 core/src/main/java/apoc/warmup/Warmup.java create mode 100644 core/src/test/java/apoc/warmup/WarmupTest.java create mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup-lite.csv create mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.csv create mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run-lite.csv create mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.adoc create mode 100644 docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.csv create mode 100644 docs/asciidoc/modules/ROOT/pages/operational/warmup.adoc create mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/apoc.warmup.run.adoc create mode 100644 docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/index.adoc create mode 100644 docs/asciidoc/modules/ROOT/partials/usage/apoc.warmup.run.adoc diff --git a/core/src/main/java/apoc/warmup/Warmup.java b/core/src/main/java/apoc/warmup/Warmup.java new file mode 100644 index 0000000000..10eb4408d4 --- /dev/null +++ b/core/src/main/java/apoc/warmup/Warmup.java @@ -0,0 +1,217 @@ +package apoc.warmup; + +import apoc.util.Util; +import org.neo4j.graphdb.Transaction; +import org.neo4j.io.pagecache.PageCache; +import org.neo4j.io.pagecache.PageCursor; +import org.neo4j.io.pagecache.PagedFile; +import org.neo4j.kernel.api.KernelTransaction; +import org.neo4j.kernel.impl.coreapi.InternalTransaction; +import org.neo4j.kernel.internal.GraphDatabaseAPI; +import org.neo4j.logging.Log; +import org.neo4j.procedure.*; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author Sascha Peukert + * @since 06.05.16 + */ +public class Warmup { + + @Context + public Transaction tx; + @Context + public GraphDatabaseAPI db; + @Context + public TerminationGuard guard; + @Context + public Log log; + + static class PageResult { + public final String file; + public final boolean index; + public final long fileSize; + public final long pages; + public final String error; + public final long time; + + public PageResult(String file, boolean index, long fileSize, long pages, String error, long start) { + this.file = file; + this.index = index; + this.fileSize = fileSize; + this.pages = pages; + this.error = error; + this.time = System.currentTimeMillis() - start; + } + } + + private String subPath(File file, String fromParent) { + StringBuilder sb = new StringBuilder(file.getAbsolutePath().length()); + while (true) { + sb.insert(0,file.getName()); + file = file.getParentFile(); + if (file == null || file.getName().equals(fromParent)) break; + sb.insert(0, File.separator); + } + return sb.toString(); + } + + @Deprecated + @Procedure( deprecatedBy = "Firstly, the procedure duplicates functionality of page cache warm up which is a part of the DBMS. " + + "Secondly, the API of this procedure is very specific to Record storage engine." ) + @Description("apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time") + public Stream run(@Name(value = "loadProperties", defaultValue = "false") boolean loadProperties, @Name(value = "loadDynamicProperties", defaultValue = "false") boolean loadDynamicProperties, @Name(value = "loadIndexes", defaultValue = "false") boolean loadIndexes) throws IOException { + PageCache pageCache = db.getDependencyResolver().resolveDependency(PageCache.class); + KernelTransaction ktx = ((InternalTransaction)tx).kernelTransaction(); + + List pagedFiles = pageCache.listExistingMappings(); + + Map records = pagedFiles.parallelStream() + .filter(pF -> { + String name = pF.path().toFile().getName(); + if (isSchema(pF.path().toFile()) && !loadIndexes) return false; + if ((name.endsWith("propertystore.db.strings") || name.endsWith("propertystore.db.arrays")) && !loadDynamicProperties) return false; + if ((name.startsWith("propertystore.db")) && !loadProperties) return false; + return true; + }) + .map((pagedFile -> { + File file = pagedFile.path().toFile(); + boolean index = isSchema(file); + String fileName = index ? subPath(file, "schema") : file.getName(); + long pages = 0; + long start = System.currentTimeMillis(); + try { + if (pagedFile.fileSize() > 0) { + PageCursor cursor = pagedFile.io(0L, PagedFile.PF_READ_AHEAD | PagedFile.PF_SHARED_READ_LOCK, ktx.cursorContext()); + while (cursor.next()) { + cursor.getByte(); + pages++; + if (pages % 1000 == 0 && Util.transactionIsTerminated(guard)) { + break; + } + } + } + return new PageResult(fileName, index, pagedFile.fileSize(), pages, null, start); + } catch (IOException e) { + return new PageResult(fileName, index, -1L, pages, e.getMessage(), start); + } + })).collect(Collectors.toMap(r -> r.file, r -> r)); + + WarmupResult result = new WarmupResult( + pageCache.pageSize(), + Util.nodeCount(tx), + records.get("neostore.nodestore.db"), + Util.relCount(tx), + records.get("neostore.relationshipstore.db"), + records.get("neostore.relationshipgroupstore.db"), + loadProperties, + records.get("neostore.propertystore.db"), + records.values().stream().mapToLong((r)->r.time).sum(), + Util.transactionIsTerminated(guard), + loadDynamicProperties, + records.get("neostore.propertystore.db.strings"), + records.get("neostore.propertystore.db.arrays"), + loadIndexes, + records.values().stream().filter(r -> r.index).collect(Collectors.toList()) + ); + return Stream.of(result); + } + + public boolean isSchema(File file) { + return file.getAbsolutePath().contains(File.separator+"schema"+File.separator); + } + + public static class WarmupResult { + public final long pageSize; + public final long totalTime; + public final boolean transactionWasTerminated; + + public long nodesPerPage; + public final long nodesTotal; + public final long nodePages; + public final long nodesTime; + + public long relsPerPage; + public final long relsTotal; + public final long relPages; + public final long relsTime; + public long relGroupsPerPage; + public long relGroupsTotal; + public final long relGroupPages; + public final long relGroupsTime; + public final boolean propertiesLoaded; + public final boolean dynamicPropertiesLoaded; + public long propsPerPage; + public long propRecordsTotal; + public long propPages; + public long propsTime; + public long stringPropsPerPage; + public long stringPropRecordsTotal; + public long stringPropPages; + public long stringPropsTime; + public long arrayPropsPerPage; + public long arrayPropRecordsTotal; + public long arrayPropPages; + public long arrayPropsTime; + public final boolean indexesLoaded; + public long indexPages; + public long indexTime; + + public WarmupResult(long pageSize, + long nodesTotal, + PageResult nodes, + long relsTotal, + PageResult rels, + PageResult relGroups, + boolean propertiesLoaded, + PageResult props, + long totalTime, boolean transactionWasTerminated, + boolean dynamicPropertiesLoaded, + PageResult stringProps, + PageResult arrayProps, + boolean loadIndexes, + List indexes + ) { + this.pageSize = pageSize; + this.transactionWasTerminated = transactionWasTerminated; + this.totalTime = totalTime; + this.propertiesLoaded = propertiesLoaded; + this.dynamicPropertiesLoaded = dynamicPropertiesLoaded; + + this.nodesTotal = nodesTotal; + this.nodePages = nodes.pages; + this.nodesTime = nodes.time; + + this.relsTotal = relsTotal; + this.relPages = rels.pages; + this.relsTime = rels.time; + + this.relGroupPages = relGroups.pages; + this.relGroupsTime = relGroups.time; + + if (props!=null) { + this.propPages = props.pages; + this.propsTime = props.time; + } + if (stringProps != null) { + this.stringPropPages = stringProps.pages; + this.stringPropsTime = stringProps.time; + } + if (arrayProps != null) { + this.arrayPropPages = arrayProps.pages; + this.arrayPropsTime = arrayProps.time; + } + this.indexesLoaded = loadIndexes; + if (!indexes.isEmpty()) { + this.indexPages = indexes.stream().mapToLong(pr -> pr.pages).sum(); + this.indexTime = indexes.stream().mapToLong(pr -> pr.time).sum(); + } + } + } +} diff --git a/core/src/test/java/apoc/warmup/WarmupTest.java b/core/src/test/java/apoc/warmup/WarmupTest.java new file mode 100644 index 0000000000..2f39d32c68 --- /dev/null +++ b/core/src/test/java/apoc/warmup/WarmupTest.java @@ -0,0 +1,71 @@ +package apoc.warmup; + +import apoc.util.TestUtil; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.neo4j.test.rule.DbmsRule; +import org.neo4j.test.rule.ImpermanentDbmsRule; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +/** + * @author Sascha Peukert + * @since 06.05.16 + */ +public class WarmupTest { + + @Rule + public DbmsRule db = new ImpermanentDbmsRule(); + + @Before + public void setUp() throws Exception { + TestUtil.registerProcedure(db, Warmup.class); + // Create enough nodes and relationships to span 2 pages + db.executeTransactionally("CREATE CONSTRAINT FOR (f:Foo) REQUIRE f.foo IS UNIQUE"); + db.executeTransactionally("UNWIND range(1, 300) AS i CREATE (n:Foo {foo:i})-[:KNOWS {bar:2}]->(m {foobar:3, array:range(1,100)})"); + // Delete all relationships and their nodes, but ones with the minimum and maximum relationship ids, so + // they still span 2 pages + db.executeTransactionally("MATCH ()-[r:KNOWS]->() " + + "WITH [min(id(r)), max(id(r))] AS ids " + + "MATCH (n)-[r:KNOWS]->(m) " + + "WHERE NOT id(r) IN ids " + + "DELETE n, m, r"); + } + + @Test + public void testWarmup() throws Exception { + TestUtil.testCall(db, "CALL apoc.warmup.run()", r -> { + assertEquals(4L, r.get("nodesTotal")); + assertNotEquals(0L, r.get("nodePages")); + assertEquals(2L, r.get("relsTotal")); + assertNotEquals(0L, r.get("relPages")); + }); + } + + @Test + public void testWarmupProperties() throws Exception { + TestUtil.testCall(db, "CALL apoc.warmup.run(true)", r -> { + assertEquals(true, r.get("propertiesLoaded")); + assertNotEquals(0L, r.get("propPages")); + }); + } + + @Test + public void testWarmupDynamicProperties() throws Exception { + TestUtil.testCall(db, "CALL apoc.warmup.run(true,true)", r -> { + assertEquals(true, r.get("propertiesLoaded")); + assertEquals(true, r.get("dynamicPropertiesLoaded")); + assertNotEquals(0L, r.get("arrayPropPages")); + }); + } + + @Test + public void testWarmupIndexes() throws Exception { + TestUtil.testCall(db, "CALL apoc.warmup.run(true,true,true)", r -> { + assertEquals(true, r.get("indexesLoaded")); + assertNotEquals( 0L, r.get("indexPages") ); + }); + } +} diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup-lite.csv new file mode 100644 index 0000000000..d2803e0a93 --- /dev/null +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup-lite.csv @@ -0,0 +1,2 @@ +¦signature +¦apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.csv new file mode 100644 index 0000000000..8e520abad7 --- /dev/null +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.csv @@ -0,0 +1,6 @@ +¦Qualified Name¦Type¦Release +|xref::overview/apoc.warmup/apoc.warmup.adoc[apoc.warmup.run icon:book[]] + +apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time +|label:procedure[] +|label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run-lite.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run-lite.csv new file mode 100644 index 0000000000..d2803e0a93 --- /dev/null +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run-lite.csv @@ -0,0 +1,2 @@ +¦signature +¦apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?) diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.adoc b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.adoc new file mode 100644 index 0000000000..0a41219ccd --- /dev/null +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.adoc @@ -0,0 +1,5 @@ +¦xref::overview/apoc.warmup/apoc.warmup.run.adoc[apoc.warmup.run icon:book[]] + + +`apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false)` - quickly loads all nodes and rels into memory by skipping one page at a time +¦label:procedure[] +¦label:apoc-core[] diff --git a/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.csv b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.csv new file mode 100644 index 0000000000..342b56bb20 --- /dev/null +++ b/docs/asciidoc/modules/ROOT/examples/generated-documentation/apoc.warmup.run.csv @@ -0,0 +1,2 @@ +¦type¦qualified name¦signature¦description +¦procedure¦apoc.warmup.run¦apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?)¦apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time diff --git a/docs/asciidoc/modules/ROOT/pages/operational/index.adoc b/docs/asciidoc/modules/ROOT/pages/operational/index.adoc index 8c1dad667f..8f89545d70 100644 --- a/docs/asciidoc/modules/ROOT/pages/operational/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/operational/index.adoc @@ -7,4 +7,5 @@ For more information on how to use these procedures, see: * xref::operational/init-script.adoc[] +* xref::operational/warmup.adoc[] * xref::operational/log.adoc[] diff --git a/docs/asciidoc/modules/ROOT/pages/operational/warmup.adoc b/docs/asciidoc/modules/ROOT/pages/operational/warmup.adoc new file mode 100644 index 0000000000..bd2c8e0e62 --- /dev/null +++ b/docs/asciidoc/modules/ROOT/pages/operational/warmup.adoc @@ -0,0 +1,10 @@ +[[warmup]] += Warmup +:description: This section describes a procedure that can be used to warm up the database. + + +[separator=¦,opts=header,cols="5,1m,1m"] +|=== +¦Qualified Name¦Type¦Release +include::example$generated-documentation/apoc.warmup.run.adoc[] +|=== diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/apoc.warmup.run.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/apoc.warmup.run.adoc new file mode 100644 index 0000000000..52249464a8 --- /dev/null +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/apoc.warmup.run.adoc @@ -0,0 +1,70 @@ +//// +This file is generated by DocsTest, so don't change it! +//// + += apoc.warmup.run +:description: This section contains reference documentation for the apoc.warmup.run procedure. + +label:procedure[] label:apoc-core[] + +[.emphasis] +apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time + +== Signature + +[source] +---- +apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?) +---- + +== Input parameters +[.procedures, opts=header] +|=== +| Name | Type | Default +|loadProperties|BOOLEAN?|false +|loadDynamicProperties|BOOLEAN?|false +|loadIndexes|BOOLEAN?|false +|=== + +== Output parameters +[.procedures, opts=header] +|=== +| Name | Type +|pageSize|INTEGER? +|totalTime|INTEGER? +|transactionWasTerminated|BOOLEAN? +|nodesPerPage|INTEGER? +|nodesTotal|INTEGER? +|nodePages|INTEGER? +|nodesTime|INTEGER? +|relsPerPage|INTEGER? +|relsTotal|INTEGER? +|relPages|INTEGER? +|relsTime|INTEGER? +|relGroupsPerPage|INTEGER? +|relGroupsTotal|INTEGER? +|relGroupPages|INTEGER? +|relGroupsTime|INTEGER? +|propertiesLoaded|BOOLEAN? +|dynamicPropertiesLoaded|BOOLEAN? +|propsPerPage|INTEGER? +|propRecordsTotal|INTEGER? +|propPages|INTEGER? +|propsTime|INTEGER? +|stringPropsPerPage|INTEGER? +|stringPropRecordsTotal|INTEGER? +|stringPropPages|INTEGER? +|stringPropsTime|INTEGER? +|arrayPropsPerPage|INTEGER? +|arrayPropRecordsTotal|INTEGER? +|arrayPropPages|INTEGER? +|arrayPropsTime|INTEGER? +|indexesLoaded|BOOLEAN? +|indexPages|INTEGER? +|indexTime|INTEGER? +|=== + +[[usage-apoc.warmup.run]] +== Usage Examples +include::partial$usage/apoc.warmup.run.adoc[] + diff --git a/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/index.adoc b/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/index.adoc new file mode 100644 index 0000000000..752bbb4b8d --- /dev/null +++ b/docs/asciidoc/modules/ROOT/pages/overview/apoc.warmup/index.adoc @@ -0,0 +1,17 @@ +//// +This file is generated by DocsTest, so don't change it! +//// + += apoc.warmup +:description: This section contains reference documentation for the apoc.warmup procedures. + +[.procedures, opts=header, cols='5a,1a,1a'] +|=== +| Qualified Name | Type | Release +|xref::overview/apoc.warmup/apoc.warmup.run.adoc[apoc.warmup.run icon:book[]] + +apoc.warmup.run(loadProperties=false,loadDynamicProperties=false,loadIndexes=false) - quickly loads all nodes and rels into memory by skipping one page at a time +|label:procedure[] +|label:apoc-core[] +|=== + diff --git a/docs/asciidoc/modules/ROOT/partials/usage/apoc.warmup.run.adoc b/docs/asciidoc/modules/ROOT/partials/usage/apoc.warmup.run.adoc new file mode 100644 index 0000000000..53ab5305b4 --- /dev/null +++ b/docs/asciidoc/modules/ROOT/partials/usage/apoc.warmup.run.adoc @@ -0,0 +1,51 @@ +The examples in this section are based on the following sample graph: + +[source,cypher] +---- +MERGE (michael:Person {name: "Michael"}) +WITH michael +CALL { + WITH michael + UNWIND range(0, 10000) AS id + MERGE (p:Person {name: "Person" + id}) + MERGE (michael)-[:KNOWS]-(p) + RETURN count(*) AS friends +} +RETURN friends; +---- + +.Results +[opts="header"] +|=== +| friends +| 10001 +|=== + + +[source,cypher] +---- +CALL apoc.warmup.run() +YIELD nodesTotal, nodePages, relsTotal, relPages, propPages, propertiesLoaded +RETURN nodesTotal, nodePages, relsTotal, relPages, propPages, propertiesLoaded; +---- + +.Results +[opts="header"] +|=== +| nodesTotal | nodePages | relsTotal | relPages | propPages | propertiesLoaded +| 10002 | 184 | 10001 | 417 | 503 | FALSE +|=== + +[source,cypher] +---- +CALL apoc.warmup.run(true, true, false) +YIELD nodesTotal, nodePages, relsTotal, relPages, propPages, propertiesLoaded +RETURN nodesTotal, nodePages, relsTotal, relPages, propPages, propertiesLoaded; +---- + +.Results +[opts="header"] +|=== +| nodesTotal | nodePages | relsTotal | relPages | propPages | propertiesLoaded +| 10002 | 184 | 10001 | 417 | 503 | TRUE +|=== \ No newline at end of file diff --git a/full/src/test/resources/signatures.csv b/full/src/test/resources/signatures.csv index 75d542801d..68ad1bdb04 100644 --- a/full/src/test/resources/signatures.csv +++ b/full/src/test/resources/signatures.csv @@ -349,6 +349,7 @@ apoc.uuid.install,"apoc.uuid.install(label :: STRING?, config = {} :: MAP?) :: ( apoc.uuid.list,"apoc.uuid.list() :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)" apoc.uuid.remove,"apoc.uuid.remove(label :: STRING?) :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)" apoc.uuid.removeAll,"apoc.uuid.removeAll() :: (label :: STRING?, installed :: BOOLEAN?, properties :: MAP?)" +apoc.warmup.run,"apoc.warmup.run(loadProperties = false :: BOOLEAN?, loadDynamicProperties = false :: BOOLEAN?, loadIndexes = false :: BOOLEAN?) :: (pageSize :: INTEGER?, totalTime :: INTEGER?, transactionWasTerminated :: BOOLEAN?, nodesPerPage :: INTEGER?, nodesTotal :: INTEGER?, nodePages :: INTEGER?, nodesTime :: INTEGER?, relsPerPage :: INTEGER?, relsTotal :: INTEGER?, relPages :: INTEGER?, relsTime :: INTEGER?, relGroupsPerPage :: INTEGER?, relGroupsTotal :: INTEGER?, relGroupPages :: INTEGER?, relGroupsTime :: INTEGER?, propertiesLoaded :: BOOLEAN?, dynamicPropertiesLoaded :: BOOLEAN?, propsPerPage :: INTEGER?, propRecordsTotal :: INTEGER?, propPages :: INTEGER?, propsTime :: INTEGER?, stringPropsPerPage :: INTEGER?, stringPropRecordsTotal :: INTEGER?, stringPropPages :: INTEGER?, stringPropsTime :: INTEGER?, arrayPropsPerPage :: INTEGER?, arrayPropRecordsTotal :: INTEGER?, arrayPropPages :: INTEGER?, arrayPropsTime :: INTEGER?, indexesLoaded :: BOOLEAN?, indexPages :: INTEGER?, indexTime :: INTEGER?)" apoc.when,"apoc.when(condition :: BOOLEAN?, ifQuery :: STRING?, elseQuery = :: STRING?, params = {} :: MAP?) :: (value :: MAP?)" db.awaitIndex,"db.awaitIndex(index :: STRING?, timeOutSeconds = 300 :: INTEGER?) :: VOID" db.awaitIndexes,db.awaitIndexes(timeOutSeconds = 300 :: INTEGER?) :: VOID From 170035133a085283e9bc9a16689af5949d244dac Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Thu, 21 Jul 2022 13:15:17 +0200 Subject: [PATCH 5/9] Add deprecation documentation around the removed APOC config setting --- .../asciidoc/modules/ROOT/pages/config/index.adoc | 2 -- .../pages/deprecations-and-additions/index.adoc | 15 +++++++++++++++ .../ROOT/pages/operational/init-script.adoc | 10 ---------- .../java/apoc/custom/CypherProceduresTest.java | 2 -- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/asciidoc/modules/ROOT/pages/config/index.adoc b/docs/asciidoc/modules/ROOT/pages/config/index.adoc index 203b98b14b..0df8a562d9 100644 --- a/docs/asciidoc/modules/ROOT/pages/config/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/config/index.adoc @@ -42,8 +42,6 @@ procedures | apoc.http.timeout.read= (default 60000) | Sets the read timeout to a specified timeout, in milliseconds. A non-zero value specifies the timeout when reading from a connection established to a resource. If the timeout expires before there is data available for read, a Neo.ClientError.Procedure.ProcedureCallFailed exception is raised. A timeout of zero is interpreted as an infinite timeout. | apoc.import.file.enabled=false/true | Enable reading local files from disk | apoc.import.file.use_neo4j_config=true/false (default `true`) | the procedures check whether file system access is allowed and possibly constrained to a specific directory by reading the two configuration parameters `dbms.security.allow_csv_import_from_file_urls` and `server.directories.import` respectively -| apoc.initializer.cypher | a cypher statment to be executed once the database is started -| apoc.initializer.cypher. | multiple cypher statements to be executed once the database is started | apoc.jdbc..uri=jdbc-url-with-credentials | store jdbc-urls under a key to be used by apoc.load.jdbc | apoc.jobs.scheduled.num_threads=number-of-threads (default: number of CPU cores / 4) | Many periodic procedures rely on a scheduled executor that has a pool of threads with a default fixed size. You can configure the pool size using this configuration property diff --git a/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc b/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc index b9f2935b85..1415f6fc86 100644 --- a/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc @@ -512,4 +512,19 @@ apoc.cypher.runFirstColumnMany(statement, params) ---- apoc.cypher.runFirstColumnSingle(statement, params) ---- +|=== + +=== Removed Config Settings + +[cols="2", options="header"] +|=== +| Setting +| Details + +a| +label:setting[] +label:removed[] +apoc.initializer.cypher - a cypher statement to be executed once the database is started +a| +This has been replaced by database-specific initializers. Use apoc.initializer. instead. |=== \ No newline at end of file diff --git a/docs/asciidoc/modules/ROOT/pages/operational/init-script.adoc b/docs/asciidoc/modules/ROOT/pages/operational/init-script.adoc index 6365dd677a..088800a066 100644 --- a/docs/asciidoc/modules/ROOT/pages/operational/init-script.adoc +++ b/docs/asciidoc/modules/ROOT/pages/operational/init-script.adoc @@ -29,13 +29,3 @@ apoc.initializer.neo4j.0=create index person_index for (p:Person) on (p.name) apoc.initializer.neo4j.1=create (:Person{name:'foo'}) apoc.initializer.neo4j.2=create (:Person{name:'bar'}) ---- - -WARNING: There's deprecated syntax originating back from the 3.x days - see below. This old style syntax will be removed in future. Note that the initializers in old syntax are applied to *all* databases (except `system`) - -[source,config] ----- -apoc.initializer.cypher=CALL apoc.cypher.runSchemaFile("file:///indexes.cypher") ----- - -For running multiple statements you can also add suffixes to the config options, like `cypher.1`, `cypher.2`. -The statements will then be executed in sort-order. diff --git a/full/src/test/java/apoc/custom/CypherProceduresTest.java b/full/src/test/java/apoc/custom/CypherProceduresTest.java index e3996926d7..8058fad5ff 100644 --- a/full/src/test/java/apoc/custom/CypherProceduresTest.java +++ b/full/src/test/java/apoc/custom/CypherProceduresTest.java @@ -25,8 +25,6 @@ import java.util.List; import java.util.Map; -import static apoc.custom.CypherProcedures.ERROR_MISMATCHED_INPUTS; -import static apoc.custom.CypherProcedures.ERROR_MISMATCHED_OUTPUTS; import static apoc.custom.CypherProceduresHandler.FUNCTION; import static apoc.custom.CypherProceduresHandler.PROCEDURE; import static apoc.custom.Signatures.SIGNATURE_SYNTAX_ERROR; From d7954ee7dfe878436be583032c71fd5fd1b57862 Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Thu, 21 Jul 2022 13:57:13 +0200 Subject: [PATCH 6/9] Convert old tests of deprecated functions into ones of their replacements --- .../src/test/java/apoc/create/CreateTest.java | 16 ++++ core/src/test/java/apoc/date/DateTest.java | 39 +++++++- core/src/test/java/apoc/load/XmlTest.java | 46 ++++++++++ core/src/test/java/apoc/meta/MetaTest.java | 88 +++++++++++++++++++ .../src/test/java/apoc/text/PhoneticTest.java | 63 +++++++++++++ .../deprecations-and-additions/index.adoc | 30 +++---- 6 files changed, 266 insertions(+), 16 deletions(-) diff --git a/core/src/test/java/apoc/create/CreateTest.java b/core/src/test/java/apoc/create/CreateTest.java index bbb7be3d23..b618f4aaec 100644 --- a/core/src/test/java/apoc/create/CreateTest.java +++ b/core/src/test/java/apoc/create/CreateTest.java @@ -196,6 +196,22 @@ public void testCreateVirtualRelationshipFunction() throws Exception { }); } + @Test + public void testCreatePattern() throws Exception { + testCall(db, "CALL apoc.create.virtualPath(['Person'],{name:'John'},'KNOWS',{since:2010},['Person'],{name:'Jane'})", + (row) -> { + Node john = (Node) row.get("from"); + assertEquals(true, john.hasLabel(PERSON)); + assertEquals("John", john.getProperty("name")); + Relationship rel = (Relationship) row.get("rel"); + assertEquals(true, rel.isType(RelationshipType.withName("KNOWS"))); + assertEquals(2010L, rel.getProperty("since")); + Node jane = (Node) row.get("to"); + assertEquals(true, jane.hasLabel(PERSON)); + assertEquals("Jane", jane.getProperty("name")); + }); + } + @Test public void testVirtualFromNodeFunction() throws Exception { testCall(db, "CREATE (n:Person{name:'Vincent', born: 1974} ) RETURN apoc.create.virtual.fromNode(n, ['name']) as node", diff --git a/core/src/test/java/apoc/date/DateTest.java b/core/src/test/java/apoc/date/DateTest.java index c15359d8f2..72f7461aeb 100644 --- a/core/src/test/java/apoc/date/DateTest.java +++ b/core/src/test/java/apoc/date/DateTest.java @@ -1,5 +1,6 @@ package apoc.date; +import apoc.temporal.TemporalProcedures; import apoc.util.TestUtil; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -18,6 +19,7 @@ import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZonedDateTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.HashMap; @@ -50,7 +52,7 @@ public class DateTest { @BeforeClass public static void sUp() throws Exception { - TestUtil.registerProcedure(db, Date.class); + TestUtil.registerProcedure(db, Date.class, TemporalProcedures.class); } @Test public void testToDays() throws Exception { @@ -134,6 +136,41 @@ public void testToUnixtimeWithEmptyInput() throws Exception { row -> assertEquals(null, row.get("value"))); } + @Test public void testParseAsZonedDateTimeWithCorrectFormat() throws Exception { + testCall(db, + "RETURN apoc.temporal.toZonedTemporal('03/23/1965 00:00:00','MM/dd/yyyy HH:mm:ss','America/New_York') AS value", + row -> assertEquals(ZonedDateTime.of(LocalDateTime.of(1965, 3, 23, 0, 0), ZoneId.of("America/New_York")), + row.get("value"))); + } + + @Test public void testParseAsZonedDateTimeWithDefaultTimezone() throws Exception { + testCall(db, + "RETURN apoc.temporal.toZonedTemporal('03/23/1965 00:00:00','MM/dd/yyyy HH:mm:ss') AS value", + row -> assertEquals(ZonedDateTime.of(LocalDateTime.of(1965, 3, 23, 0, 0), ZoneId.of("UTC")), + row.get("value"))); + } + + @Test public void testParseAsZonedDateTimeWithDefaultFormatAndTimezone() throws Exception { + testCall(db, + "RETURN apoc.temporal.toZonedTemporal('1965-03-23 00:00:00') AS value", + row -> assertEquals(ZonedDateTime.of(LocalDateTime.of(1965, 3, 23, 0, 0), ZoneId.of("UTC")), + row.get("value"))); + } + + @Test public void testParseAsZonedDateTimeWithIncorrectPatternFormat() throws Exception { + expected.expect(instanceOf(QueryExecutionException.class)); + testCall(db, + "RETURN apoc.temporal.toZonedTemporal('03/23/1965 00:00:00','MM/dd/yyyy HH:mm:ss/neo4j','America/New_York') AS value", + row -> assertEquals(ZonedDateTime.of(LocalDateTime.of(1965, 3, 23, 0, 0), ZoneId.of("America/New_York")), + row.get("value"))); + } + + @Test public void testToZonedDateTimeWithNullInput() throws Exception { + testCall(db, + "RETURN apoc.temporal.toZonedTemporal(NULL) AS value", + row -> assertNull(row.get("value"))); + } + @Test public void testToISO8601() throws Exception { testCall(db, "RETURN apoc.date.toISO8601(0) AS value", diff --git a/core/src/test/java/apoc/load/XmlTest.java b/core/src/test/java/apoc/load/XmlTest.java index e4f09a69fa..54860e9756 100644 --- a/core/src/test/java/apoc/load/XmlTest.java +++ b/core/src/test/java/apoc/load/XmlTest.java @@ -251,6 +251,15 @@ public void testLoadXmlNoFailOnError () { }); } + @Test + public void testLoadXmlWithNextWordRels() { + thrown.expect(QueryExecutionException.class); + thrown.expectMessage("usage of `createNextWordRelationships` is no longer allowed. Use `{relType:'NEXT_WORD', label:'XmlWord'}` instead."); + + db.executeTransactionally("call apoc.import.xml('file:" + FILE_SHORTENED + "', " + + "{createNextWordRelationships: true, filterLeadingWhitespace: true}) yield node"); + } + @Test public void testLoadXmlWithNextWordRelsWithBinaryFile() { final String query = "CALL apoc.import.xml($data, $config) YIELD node"; @@ -262,6 +271,13 @@ public void testLoadXmlWithNextWordRelsWithBinaryFile() { commonAssertionsWithNextWordRels(query, config); } + @Test + public void testLoadXmlWithNextWordRelsWithNewConfigOptions() { + final String query = "call apoc.import.xml('file:" + FILE_SHORTENED + "', " + + "{relType: 'NEXT_WORD', label: 'XmlWord', filterLeadingWhitespace: true}) yield node"; + commonAssertionsWithNextWordRels(query, Collections.emptyMap()); + } + private void commonAssertionsWithNextWordRels(String query, Map config) { testCall(db, query, config, row -> assertNotNull(row.get("node"))); testResult(db, "match (n) return labels(n)[0] as label, count(*) as count", result -> { @@ -288,6 +304,36 @@ private void commonAssertionsWithNextWordRels(String query, Map }); } + + @Test + public void testLoadXmlWithNextEntityRels() { + testCall(db, "call apoc.import.xml('file:" + FILE_SHORTENED + "', " + + "{connectCharacters: true, filterLeadingWhitespace: true}) yield node", + row -> assertNotNull(row.get("node"))); + testResult(db, "match (n) return labels(n)[0] as label, count(*) as count", result -> { + final Map resultMap = result.stream().collect(Collectors.toMap(o -> (String)o.get("label"), o -> (Long)o.get("count"))); + assertEquals(2L, (long)resultMap.get("XmlProcessingInstruction")); + assertEquals(1L, (long)resultMap.get("XmlDocument")); + assertEquals(369L, (long)resultMap.get("XmlCharacters")); + assertEquals(158L, (long)resultMap.get("XmlTag")); + }); + + // no node more than one NEXT/NEXT_SIBLING + testCallEmpty(db, "match (n) where size([p = (n)-[:NEXT]->() | p ]) > 1 return n", null); + testCallEmpty(db, "match (n) where size([p = (n)-[:NEXT_SIBLING]->() | p ]) > 1 return n", null); + + // no node more than one IS_FIRST_CHILD / IS_LAST_CHILD + testCallEmpty(db, "match (n) where size([p = (n)<-[:FIRST_CHILD_OF]-() | p ]) > 1 return n", null); + testCallEmpty(db, "match (n) where size([p = (n)<-[:LAST_CHILD_OF]-() | p ]) > 1 return n", null); + + // NEXT_WORD relationship do connect all word nodes + testResult(db, "match p=(:XmlDocument)-[:NE*]->(e:XmlCharacters) where not (e)-[:NE]->() return length(p) as len", + result -> { + Map r = Iterators.single(result); + assertEquals(369L, r.get("len")); + }); + } + @Test public void testLoadXmlFromZip() { testResult(db, "call apoc.load.xml('file:src/test/resources/testload.zip!xml/books.xml') yield value as catalog\n" + diff --git a/core/src/test/java/apoc/meta/MetaTest.java b/core/src/test/java/apoc/meta/MetaTest.java index ccde8ec1cb..b54dbd272f 100644 --- a/core/src/test/java/apoc/meta/MetaTest.java +++ b/core/src/test/java/apoc/meta/MetaTest.java @@ -5,6 +5,7 @@ import apoc.util.TestUtil; import apoc.util.Util; import org.assertj.core.api.Assertions; +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -12,9 +13,11 @@ import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Label; import org.neo4j.graphdb.Node; +import org.neo4j.graphdb.Path; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Result; +import org.neo4j.graphdb.Transaction; import org.neo4j.internal.helpers.collection.Iterables; import org.neo4j.test.rule.DbmsRule; import org.neo4j.test.rule.ImpermanentDbmsRule; @@ -54,6 +57,7 @@ import static org.neo4j.configuration.SettingImpl.newBuilder; import static org.neo4j.configuration.SettingValueParsers.BOOL; import static org.neo4j.driver.Values.isoDuration; +import static org.neo4j.graphdb.traversal.Evaluators.toDepth; public class MetaTest { @@ -167,6 +171,90 @@ public void testMetaGraphExtraRels() throws Exception { }); } + @Test + public void testMetaType() throws Exception { + try (Transaction tx = db.beginTx()) { + Node node = tx.createNode(); + Relationship rel = node.createRelationshipTo(node, RelationshipType.withName("FOO")); + testTypeName(node, "NODE"); + testTypeName(rel, "RELATIONSHIP"); + Path path = tx.traversalDescription().evaluator(toDepth(1)).traverse(node).iterator().next(); +// TODO PATH FAILS testTypeName(path, "PATH"); + tx.rollback(); + } + testTypeName(singletonMap("a", 10), "MAP"); + testTypeName(asList(1, 2), "LIST OF INTEGER"); + testTypeName(1L, "INTEGER"); + testTypeName(1, "INTEGER"); + testTypeName(1.0D, "FLOAT"); + testTypeName(1.0, "FLOAT"); + testTypeName("a", "STRING"); + testTypeName(false, "BOOLEAN"); + testTypeName(true, "BOOLEAN"); + testTypeName(null, "NULL"); + } + + @Test + public void testMetaTypeArray() throws Exception { + testTypeName(asList(1,2), "LIST OF INTEGER"); + testTypeName(asList(LocalDate.of(2018, 1, 1),2), "LIST OF ANY"); + testTypeName(new Integer[] {1, 2}, "LIST OF INTEGER"); + testTypeName(new Float[] {1f, 2f}, "LIST OF FLOAT"); + testTypeName(new Double[] {1d, 2d}, "LIST OF FLOAT"); + testTypeName(new String[] {"a", "b"}, "LIST OF STRING"); + testTypeName(new Long[] {1l, 2l}, "LIST OF INTEGER"); + testTypeName(new LocalDate[] {LocalDate.of(2018, 1, 1), LocalDate.of(2018, 1, 1)}, "LIST OF DATE"); + testTypeName(new Object[] {1d, ""}, "LIST OF ANY"); + } + + @Test + public void testMetaIsType() throws Exception { + try (Transaction tx = db.beginTx()) { + Node node = tx.createNode(); + Relationship rel = node.createRelationshipTo(node, RelationshipType.withName("FOO")); + testIsTypeName(node, "NODE"); + testIsTypeName(rel, "RELATIONSHIP"); + Path path = tx.traversalDescription().evaluator(toDepth(1)).traverse(node).iterator().next(); +// TODO PATH FAILS testIsTypeName(path, "PATH"); + tx.rollback(); + } + testIsTypeName(singletonMap("a", 10), "MAP"); + testIsTypeName(asList(1, 2), "LIST OF INTEGER"); + testIsTypeName(1L, "INTEGER"); + testIsTypeName(1, "INTEGER"); + testIsTypeName(1.0D, "FLOAT"); + testIsTypeName(1.0, "FLOAT"); + testIsTypeName("a", "STRING"); + testIsTypeName(false, "BOOLEAN"); + testIsTypeName(true, "BOOLEAN"); + testIsTypeName(null, "NULL"); + } + @Test + public void testMetaTypes() throws Exception { + + Map param = map("MAP", singletonMap("a", 10), + "LIST OF INTEGER", asList(1, 2), + "INTEGER", 1L, + "FLOAT", 1.0D, + "STRING", "a", + "BOOLEAN", true, + "NULL", null); + TestUtil.testCall(db, "RETURN apoc.meta.cypher.types($param) AS value", singletonMap("param",param), row -> { + Map res = (Map) row.get("value"); + res.forEach(Assert::assertEquals); + }); + + } + + private void testTypeName(Object value, String type) { + TestUtil.testCall(db, "RETURN apoc.meta.cypher.type($value) AS value", singletonMap("value", value), row -> assertEquals(type, row.get("value"))); + } + + private void testIsTypeName(Object value, String type) { + TestUtil.testCall(db, "RETURN apoc.meta.cypher.isType($value,$type) AS value", map("value", value, "type", type), result -> assertEquals("type was not "+type,true, result.get("value"))); + TestUtil.testCall(db, "RETURN apoc.meta.cypher.isType($value,$type) AS value", map("value", value, "type", type + "foo"), result -> assertEquals(false, result.get("value"))); + } + @Test public void testMetaStats() throws Exception { db.executeTransactionally("CREATE (:Actor)-[:ACTED_IN]->(:Movie) "); diff --git a/core/src/test/java/apoc/text/PhoneticTest.java b/core/src/test/java/apoc/text/PhoneticTest.java index 0d3f5b284d..7e9fe5fa7b 100644 --- a/core/src/test/java/apoc/text/PhoneticTest.java +++ b/core/src/test/java/apoc/text/PhoneticTest.java @@ -21,6 +21,42 @@ public void setUp() throws Exception { TestUtil.registerProcedure(db, Phonetic.class); } + @Test + public void shouldComputeSimpleSoundexEncoding() { + testCall(db, "RETURN apoc.text.phonetic('HellodearUser!') as value", (row) -> + assertThat(row.get("value"), equalTo("H436")) + ); + } + + @Test + public void shouldComputeSimpleSoundexEncodingOfNull() { + testCall(db, "RETURN apoc.text.phonetic(null) as value", (row) -> + assertThat(row.get("value"), equalTo(null)) + ); + } + + @Test + public void shouldComputeEmptySoundexEncodingForTheEmptyString() { + testCall(db, "RETURN apoc.text.phonetic('') as value", (row) -> + assertThat(row.get("value"), equalTo("")) + ); + } + + @Test + public void shouldComputeSoundexEncodingOfManyWords() { + testCall(db, "RETURN apoc.text.phonetic('Hello, dear User!') as value", (row) -> + assertThat(row.get("value"), equalTo("H400D600U260")) + ); + } + + + @Test + public void shouldComputeSoundexEncodingOfManyWordsEvenIfTheStringContainsSomeExtraChars() { + testCall(db, "RETURN apoc.text.phonetic(' ,Hello, dear User 5!') as value", (row) -> + assertThat(row.get("value"), equalTo("H400D600U260")) + ); + } + @Test public void shouldComputeSoundexDifference() { testCall(db, "CALL apoc.text.phoneticDelta('Hello Mr Rabbit', 'Hello Mr Ribbit')", (row) -> @@ -28,4 +64,31 @@ public void shouldComputeSoundexDifference() { ); } + @Test + public void shoudlComputeDoubleMetaphone() { + testCall(db, "RETURN apoc.text.doubleMetaphone('Apoc') as value", (row) -> + assertThat(row.get("value"), equalTo("APK")) + ); + } + + @Test + public void shoudlComputeDoubleMetaphoneOfNull() { + testCall(db, "RETURN apoc.text.doubleMetaphone(NULL) as value", (row) -> + assertThat(row.get("value"), equalTo(null)) + ); + } + + @Test + public void shoudlComputeDoubleMetaphoneForTheEmptyString() { + testCall(db, "RETURN apoc.text.doubleMetaphone('') as value", (row) -> + assertThat(row.get("value"), equalTo("")) + ); + } + + @Test + public void shouldComputeDoubleMetaphoneOfManyWords() { + testCall(db, "RETURN apoc.text.doubleMetaphone('Hello, dear User!') as value ", (row) -> + assertThat(row.get("value"), equalTo("HLTRASR")) + ); + } } diff --git a/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc b/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc index 1415f6fc86..85b2a3096c 100644 --- a/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc +++ b/docs/asciidoc/modules/ROOT/pages/deprecations-and-additions/index.adoc @@ -15,7 +15,7 @@ This chapter lists all the features that have been removed, deprecated, added or | Details a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- @@ -47,7 +47,7 @@ apoc.algo.dijkstra(startNode, endNode, 'KNOWS', 'distance', defaultValue, number ---- a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- @@ -61,7 +61,7 @@ apoc.temporal.toZonedTemporal('2012-12-23 23:59:59','yyyy-MM-dd HH:mm:ss', 'UTC- ---- a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- @@ -132,7 +132,7 @@ apoc.export.cypher.query(query,file,config) ---- a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- @@ -146,7 +146,7 @@ apoc.meta.cypher.type(value) ---- a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- @@ -160,7 +160,7 @@ apoc.meta.cypher.types(node-relationship-map) ---- a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- @@ -174,7 +174,7 @@ apoc.meta.cypher.isType(value,type) ---- a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- @@ -276,13 +276,13 @@ label:procedure[] label:removed[] [source, cypher, role="noheader"] ---- -apoc.text.phonetic(value) yield value +CALL apoc.text.phonetic(value) yield value ---- a| -Replaced by: +Replaced by the function: [source, cypher, role="noheader"] ---- -apoc.text.phonetic(text) yield value +RETURN apoc.text.phonetic(text) yield value ---- a| @@ -290,17 +290,17 @@ label:procedure[] label:removed[] [source, cypher, role="noheader"] ---- -apoc.text.doubleMetaphone(value) yield value +CALL apoc.text.doubleMetaphone(value) yield value ---- a| -Replaced by: +Replaced by the function: [source, cypher, role="noheader"] ---- -apoc.text.doubleMetaphone(text) yield value +RETURN apoc.text.doubleMetaphone(text) yield value ---- a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- @@ -496,7 +496,7 @@ apoc.custom.declareFunction(signature, statement, forceSingle, description) ---- a| -label:procedure[] +label:function[] label:removed[] [source, cypher, role="noheader"] ---- From f0cbdf5280206f13fd5aea21fd7422a530a0a482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Cord=C3=B3n?= Date: Thu, 21 Jul 2022 09:03:14 +0100 Subject: [PATCH 7/9] NO AUTO Makes container wait for neo4j database ready (#3065) --- .../apoc/util/Neo4jContainerExtension.java | 25 +++++++++++++++++++ .../java/apoc/util/TestContainerUtil.java | 20 +++++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/test-utils/src/main/java/apoc/util/Neo4jContainerExtension.java b/test-utils/src/main/java/apoc/util/Neo4jContainerExtension.java index 55c72e443e..a4d65c65b6 100644 --- a/test-utils/src/main/java/apoc/util/Neo4jContainerExtension.java +++ b/test-utils/src/main/java/apoc/util/Neo4jContainerExtension.java @@ -14,6 +14,9 @@ import org.testcontainers.containers.wait.strategy.WaitAllStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; import org.testcontainers.ext.ScriptUtils; +import org.testcontainers.containers.wait.strategy.Wait; +import static apoc.util.TestContainerUtil.Neo4jVersion; +import static apoc.util.TestContainerUtil.Neo4jVersion.ENTERPRISE; import java.io.InputStream; import java.time.Duration; @@ -123,6 +126,28 @@ public Neo4jContainerExtension withDebugger() { return this; } + private Neo4jContainerExtension withWaitForDatabaseReady( + String username, String password, String database, Duration timeout, TestContainerUtil.Neo4jVersion version) { + if (version == ENTERPRISE) { + this.setWaitStrategy(Wait.forHttp("/db/" + database + "/cluster/available") + .withBasicCredentials(username, password) + .forPort(7474) + .forStatusCode(200) + .withStartupTimeout(timeout)); + } else { + this.setWaitStrategy(Wait.forHttp("/") + .forPort(7474) + .forStatusCode(200) + .withStartupTimeout(timeout)); + } + + return this; + } + + public Neo4jContainerExtension withWaitForNeo4jDatabaseReady(String password, Neo4jVersion version) { + return withWaitForDatabaseReady("neo4j", password, "neo4j", Duration.ofSeconds(60), version); + } + @Override public void stop() { if (withDriver) { diff --git a/test-utils/src/main/java/apoc/util/TestContainerUtil.java b/test-utils/src/main/java/apoc/util/TestContainerUtil.java index 9ff46a8106..a36d988024 100644 --- a/test-utils/src/main/java/apoc/util/TestContainerUtil.java +++ b/test-utils/src/main/java/apoc/util/TestContainerUtil.java @@ -37,6 +37,8 @@ public enum Neo4jVersion { public static final String neo4jEnterpriseDockerImageVersion = System.getProperty("neo4jDockerImage"); public static final String neo4jCommunityDockerImageVersion = System.getProperty("neo4jCommunityDockerImage"); + public static final String password = "apoc"; + private TestContainerUtil() {} private static File baseDir = Paths.get(".").toFile(); @@ -57,14 +59,20 @@ public static Neo4jContainerExtension createEnterpriseDB(boolean withLogging) { } public static Neo4jContainerExtension createEnterpriseDB(File baseDir, boolean withLogging) { - return createNeo4jContainer(neo4jEnterpriseDockerImageVersion, baseDir, withLogging ); + return createNeo4jContainer(baseDir, withLogging, Neo4jVersion.ENTERPRISE); } public static Neo4jContainerExtension createCommunityDB(File baseDir, boolean withLogging) { - return createNeo4jContainer(neo4jCommunityDockerImageVersion, baseDir, withLogging ); + return createNeo4jContainer(baseDir, withLogging, Neo4jVersion.COMMUNITY); } - private static Neo4jContainerExtension createNeo4jContainer(String dockerImage, File baseDir, boolean withLogging) { + private static Neo4jContainerExtension createNeo4jContainer(File baseDir, boolean withLogging, Neo4jVersion version) { + String dockerImage; + if (version == Neo4jVersion.ENTERPRISE) { + dockerImage = neo4jEnterpriseDockerImageVersion; + } else { + dockerImage = neo4jCommunityDockerImageVersion; + } executeGradleTasks(baseDir, "shadowJar"); // We define the container with external volumes File importFolder = new File("import"); @@ -93,7 +101,7 @@ private static Neo4jContainerExtension createNeo4jContainer(String dockerImage, Neo4jContainerExtension neo4jContainer = new Neo4jContainerExtension(dockerImage) .withPlugins(MountableFile.forHostPath(pluginsFolder.toPath())) .withTmpFs(Map.of("/logs", "rw", "/data", "rw", pluginsFolder.toPath().toAbsolutePath().toString(), "rw")) - .withAdminPassword("apoc") + .withAdminPassword(password) .withEnv("NEO4J_dbms_memory_heap_max__size", "512M") .withEnv("NEO4J_dbms_memory_pagecache_size", "256M") .withEnv("apoc.export.file.enabled", "true") @@ -117,10 +125,12 @@ private static Neo4jContainerExtension createNeo4jContainer(String dockerImage, // ignore since it may fail depending on operating system } }); + if (withLogging) { neo4jContainer.withLogging(); } - return neo4jContainer; + + return neo4jContainer.withWaitForNeo4jDatabaseReady(password, version); } public static void executeGradleTasks(File baseDir, String... tasks) { From d0be35cd981a9832eb8b8dfdf4670ad01afddf88 Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Fri, 22 Jul 2022 08:42:48 +0200 Subject: [PATCH 8/9] Fix failing test (looking for now removed procedure) --- full/src/test/java/apoc/help/HelpExtendedTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/full/src/test/java/apoc/help/HelpExtendedTest.java b/full/src/test/java/apoc/help/HelpExtendedTest.java index cffb619aa7..51420742a4 100644 --- a/full/src/test/java/apoc/help/HelpExtendedTest.java +++ b/full/src/test/java/apoc/help/HelpExtendedTest.java @@ -91,7 +91,7 @@ public void indicateNotCore() throws IOException { }); } - TestUtil.testCall(db, "CALL apoc.help($text)", map("text", "rock_n_roll_while"), (row) -> { + TestUtil.testCall(db, "CALL apoc.help($text)", map("text", "expireIn"), (row) -> { assertEquals(false, row.get("core")); }); } From fac638573f766d7c73f8b59486d96a66fa87d6d8 Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Fri, 22 Jul 2022 13:33:02 +0200 Subject: [PATCH 9/9] Add updated mongodb back into navigation --- docs/asciidoc/modules/ROOT/nav.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/asciidoc/modules/ROOT/nav.adoc b/docs/asciidoc/modules/ROOT/nav.adoc index a83f3bf3a9..18753c1cb1 100644 --- a/docs/asciidoc/modules/ROOT/nav.adoc +++ b/docs/asciidoc/modules/ROOT/nav.adoc @@ -43,6 +43,7 @@ include::partial$generated-documentation/nav.adoc[] ** xref::database-integration/database-modeling.adoc[] ** xref::database-integration/elasticsearch.adoc[] ** xref::database-integration/couchbase.adoc[] + ** xref::database-integration/mongo.adoc[] ** xref::database-integration/bolt-neo4j.adoc[] ** xref::database-integration/load-ldap.adoc[] ** xref::database-integration/redis.adoc[]