From cfa21a23922a27e586cbce7e93ef9534f7f3074e Mon Sep 17 00:00:00 2001 From: Matej Ferencevic <matej.ferencevic@memgraph.io> Date: Tue, 31 Oct 2017 11:03:15 +0100 Subject: [PATCH] Misc user docs fixes. Reviewers: buda, mislav.bradac, teon.banek, florijan Reviewed By: buda Differential Revision: https://phabricator.memgraph.io/D947 --- docs/user_technical/data-types.md | 2 +- docs/user_technical/installation.md | 4 +- docs/user_technical/open-cypher.md | 95 +++++++++++++---------------- docs/user_technical/quick-start.md | 36 +++++------ 4 files changed, 61 insertions(+), 76 deletions(-) diff --git a/docs/user_technical/data-types.md b/docs/user_technical/data-types.md index ca13405ee..38e435d7b 100644 --- a/docs/user_technical/data-types.md +++ b/docs/user_technical/data-types.md @@ -30,7 +30,7 @@ types. Following is a table of supported data types. -----------|------------ `Null` | Denotes that the property has no value. This is the same as if the property does not exist. `String` | A character string, i.e. text. - `Boolean` | A Boolean value, either `true` or `false`. + `Boolean` | A boolean value, either `true` or `false`. `Integer` | An integer number. `Float` | A floating-point number, i.e. a real number. `List` | A list containing any number of property values of any supported type. It can be used to store multiple values under a single property name. diff --git a/docs/user_technical/installation.md b/docs/user_technical/installation.md index 59eb68dc0..410e6c3e7 100644 --- a/docs/user_technical/installation.md +++ b/docs/user_technical/installation.md @@ -7,7 +7,7 @@ install the Docker engine on the system. Instructions how to install Docker can be found on the [official Docker website](https://docs.docker.com/engine/installation). Memgraph Docker image was built with Docker version `1.12` and should be -compatible with all latter versions. +compatible with all later versions. ### Docker Import @@ -124,7 +124,7 @@ All of the parameters can also be found in `/etc/memgraph/memgraph.conf`. [^1]: Maximum number of concurrent executions on the current CPU. To find more about how to execute queries on Memgraph please proceed to -[Quick Start](quick-start.md). +**Quick Start**. ### Cleanup diff --git a/docs/user_technical/open-cypher.md b/docs/user_technical/open-cypher.md index bccbfb4bd..e84a57ca5 100644 --- a/docs/user_technical/open-cypher.md +++ b/docs/user_technical/open-cypher.md @@ -34,18 +34,18 @@ following query. Finding connected nodes can be achieved by using the query: - MATCH (node1) -[connection]- (node2) RETURN node1, connection, node2 + MATCH (node1)-[connection]-(node2) RETURN node1, connection, node2 In addition to general pattern matching, you can narrow the search down by specifying node labels and properties. Similarly, edge types and properties can also be specified. For example, finding each node labeled as `Person` and with property `age` being 42, is done with the following query. - MATCH (n :Person {age: 42}) RETURN n. + MATCH (n :Person {age: 42}) RETURN n While their friends can be found with the following. - MATCH (n :Person {age: 42}) -[:FriendOf]- (friend) RETURN friend. + MATCH (n :Person {age: 42})-[:FriendOf]-(friend) RETURN friend There are cases when a user needs to find data which is connected by traversing a path of connections, but the user doesn't know how many @@ -55,22 +55,21 @@ with *variable path lengths*. Matching such a path is achieved by using the traversing from `node1` to `node2` by following any number of connections in a single direction can be achieved with: - MATCH (node1) -[r*]-> (node2) RETURN node1, r, node2 + MATCH (node1)-[r*]->(node2) RETURN node1, r, node2 If paths are very long, finding them could take a long time. To prevent that, a user can provide the minimum and maximum length of the path. For example, paths of length between 2 and 4 can be obtained with a query like: - MATCH (node1) -[r*2..4]-> (node2) RETURN node1, r, node2 + MATCH (node1)-[r*2..4]->(node2) RETURN node1, r, node2 It is possible to name patterns in the query and return the resulting paths. This is especially useful when matching variable length paths: - MATCH path = () -[r*2..4]-> () RETURN path + MATCH path = ()-[r*2..4]->() RETURN path More details on how `MATCH` works can be found [here](https://neo4j.com/docs/developer-manual/current/cypher/clauses/match/). -Note that *named paths* are not yet supported. The `MATCH` clause can be modified by prepending the `OPTIONAL` keyword. `OPTIONAL MATCH` clause behaves the same as a regular `MATCH`, but when it @@ -109,11 +108,11 @@ When you want to get everything that was matched, you can use the `*` This query: - MATCH (node1) -[connection]- (node2) RETURN * + MATCH (node1)-[connection]-(node2) RETURN * is equivalent to: - MATCH (node1) -[connection]- (node2) RETURN node1, connection, node2 + MATCH (node1)-[connection]-(node2) RETURN node1, connection, node2 `RETURN` can be followed by the `DISTINCT` operator, which will remove duplicate results. For example, getting unique names of people can be achieved @@ -230,7 +229,7 @@ You can still use the `RETURN` clause to produce results after writing, but it is not mandatory. Details on which kind of data can be stored in *Memgraph* can be found in -[Storable Data Types](data-types.md) chapter. +**Storable Data Types** chapter. #### CREATE @@ -239,7 +238,7 @@ is done by providing a pattern, similarly to `MATCH` clause. For example, to create 2 new nodes connected with a new edge, use this query. - CREATE (node1) -[:edge_type]-> (node2) + CREATE (node1)-[:edge_type]->(node2) Labels and properties can be set during creation using the same syntax as in [MATCH](#match) patterns. For example, creating a node with a label and a @@ -269,7 +268,7 @@ This clause is used to delete nodes and edges from the database. Example. Removing all edges of a single type. - MATCH () -[edge :type]- () DELETE edge + MATCH ()-[edge :type]-() DELETE edge When testing the database, you want to often have a clean start by deleting every node and edge in the database. It is reasonable that deleting each node @@ -328,7 +327,7 @@ created. In a way, this clause is like a combination of `MATCH` and `CREATE`. Example. Ensure that a person has at least one friend. - MATCH (n :Person) MERGE (n) -[:FriendOf]-> (m) + MATCH (n :Person) MERGE (n)-[:FriendOf]->(m) The clause also provides additional features for updating the values depending on whether the pattern was created or matched. This is achieved with `ON @@ -336,7 +335,7 @@ CREATE` and `ON MATCH` sub clauses. Example. Set a different properties depending on what `MERGE` did. - MATCH (n :Person) MERGE (n) -[:FriendOf]-> (m) + MATCH (n :Person) MERGE (n)-[:FriendOf]->(m) ON CREATE SET m.prop = "created" ON MATCH SET m.prop = "existed" For more details, click [this @@ -409,22 +408,22 @@ a custom implementation, based on the edge expansion syntax. Finding the shortest path between nodes can be done using breadth-first expansion: - MATCH (a {id: 723})-[r:Type \*bfs..10]-(b {id : 882}) RETURN * + MATCH (a {id: 723})-[r:Type *bfs..10]-(b {id: 882}) RETURN * The above query will find all paths of length up to 10 between nodes `a` and `b`. The edge type and maximum path length are used in the same way like in variable length expansion. -To find only the shortest path, simply append LIMIT 1 to the RETURN clause. +To find only the shortest path, simply append `LIMIT 1` to the `RETURN` clause. - MATCH (a {id: 723})-[r:Type \*bfs..10]-(b {id : 882}) RETURN * LIMIT 1 + MATCH (a {id: 723})-[r:Type *bfs..10]-(b {id: 882}) RETURN * LIMIT 1 Breadth-fist expansion allows an arbitrary expression filter that determines if an expansion is allowed. Following is an example in which expansion is allowed only over edges whose `x` property is greater then `12` and nodes `y` whose property is lesser then `3`: - MATCH (a {id: 723})-[\*bfs..10 (e, n | e.x > 12 and n.y < 3)]-() RETURN * + MATCH (a {id: 723})-[*bfs..10 (e, n | e.x > 12 and n.y < 3)]-() RETURN * The filter is defined as a lambda function over `e` and `n`, which denote the edge and node being expanded over in the breadth first search. @@ -509,11 +508,11 @@ functions. Apart from comparison and concatenation operators openCypher provides special string operators for easier matching of substrings: -Operator | Description ------------------|------------ - a STARTS WITH b | Returns true if prefix of string a is equal to string b. - a ENDS WITH b | Returns true if suffix of string a is equal to string b. - a CONTAINS b | Returns true if some substring of string a is equal to string b. +Operator | Description +-------------------|------------ + `a STARTS WITH b` | Returns true if prefix of string a is equal to string b. + `a ENDS WITH b` | Returns true if suffix of string a is equal to string b. + `a CONTAINS b` | Returns true if some substring of string a is equal to string b. #### Parameters @@ -523,7 +522,7 @@ filtering results or similar, while the rest of the query remains the same. Parameters allow reusing the same query, but with different parameter values. The syntax uses the `$` symbol to designate a parameter name. We don't allow -old Cypher parameter syntax using curly brace. For example, you can parameterize +old Cypher parameter syntax using curly braces. For example, you can parameterize filtering a node property: MATCH (node1 {property: $propertyValue}) RETURN node1 @@ -551,17 +550,17 @@ documentation. #### CASE Conditional expressions can be expressed in openCypher language by simple and -generic form of CASE expression. A simple form is used to compare an expression +generic form of `CASE` expression. A simple form is used to compare an expression against multiple predicates. For the first matched predicate result of the -expression provided after the THEN keyword is returned. If no expression is -matched value following ELSE is returned is provided, or null if ELSE is not +expression provided after the `THEN` keyword is returned. If no expression is +matched value following `ELSE` is returned is provided, or `null` if `ELSE` is not used: MATCH (n) RETURN CASE n.currency WHEN "DOLLAR" THEN "$" WHEN "EURO" THEN "€" ELSE "UNKNOWN" END -In generic form, you don't provided expression whose value is compared to -predicates, but you list multiple predicates and the first one that evaluates +In generic form, you don't need to provide an expression whose value is compared to +predicates, but you can list multiple predicates and the first one that evaluates to true is matched: MATCH (n) @@ -581,7 +580,7 @@ keywords (WHERE, MATCH, COUNT, SUM...). #### Unicode Codepoints in String Literal Use `\u` followed by 4 hex digits in string literal for UTF-16 codepoint and -'\U' with 8 hex digits for UTF-32 codepoint in Memgraph. +`\U` with 8 hex digits for UTF-32 codepoint in Memgraph. ### Difference from Neo4j's Cypher Implementation @@ -593,28 +592,20 @@ here (especially subtle semantic ones). #### Unsupported Constructs -Data importing. Memgraph doesn't support Cypher's CSV importing capabilities. - -The `UNION` keyword for merging query results. - -The `FOREACH` language construct for performing an operation on every list element. - -The `CALL` construct for a standalone function call. This can be expressed using -`RETURN functioncall()`. For example, with Memgraph you can get information about -the indexes present in the database using the `RETURN indexinfo()` openCypher query. - -Stored procedures. - -Regular expressions for string matching. - -`shortestPath` and `allShortestPaths` functions. `shortestPath` can be expressed using -Memgraph's breadth-first expansion syntax already described in this document. - -Patterns in expressions. For example, Memgraph doesn't support `size((n)-->())`. Most of the time -the same functionalities can be expressed differently in Memgraph using `OPTIONAL` expansions, -function calls etc. - -Map projections such as `MATCH (n) RETURN n {.property1, .property2}`. +* Data importing. Memgraph doesn't support Cypher's CSV importing capabilities. +* The `UNION` keyword for merging query results. +* The `FOREACH` language construct for performing an operation on every list element. +* The `CALL` construct for a standalone function call. This can be expressed using + `RETURN functioncall()`. For example, with Memgraph you can get information about + the indexes present in the database using the `RETURN indexinfo()` openCypher query. +* Stored procedures. +* Regular expressions for string matching. +* `shortestPath` and `allShortestPaths` functions. `shortestPath` can be expressed using + Memgraph's breadth-first expansion syntax already described in this document. +* Patterns in expressions. For example, Memgraph doesn't support `size((n)-->())`. Most of the time + the same functionalities can be expressed differently in Memgraph using `OPTIONAL` expansions, + function calls etc. +* Map projections such as `MATCH (n) RETURN n {.property1, .property2}`. #### Unsupported Functions diff --git a/docs/user_technical/quick-start.md b/docs/user_technical/quick-start.md index 92fc9a323..5d17c3d11 100644 --- a/docs/user_technical/quick-start.md +++ b/docs/user_technical/quick-start.md @@ -10,6 +10,14 @@ Memgraph supports the openCypher query language which has been developed by vendor-independent standardization process. It's a declarative language developed specifically for interaction with graph databases. +### Multiple-Query Transactions + +Memgraph supports transactions containing multiple queries. In other words, +one can set an explicit transaction start and stop. All of the queries inside +will be executed as a single transaction. This means that if a single query +execution fails, all of the executed queries will be reverted and the +transaction aborted. + ### Bolt Clients connect to Memgraph using the @@ -46,9 +54,9 @@ neo4j-client bolt://<IP_ADDRESS>:<PORT> --insecure --user u --pass p Where `<IP_ADDRESS>` and `<PORT>` should be replaced with the network location where Memgraph is reachable. The `--insecure` option specifies that SLL should -be disabled (Memgraph alpha does not support SSL). `--user` and `--pass` -parameter values are ignored by Memgraph (alpha is single-user), but need to -be provided for the client to connect automatically. +be disabled (Memgraph currently does not support SSL). `--user` and `--pass` +parameter values are ignored by Memgraph (currently the database is +single-user), but need to be provided for the client to connect automatically. After the client has started it should present a command prompt similar to: @@ -171,10 +179,10 @@ can be disabled by passing `{encrypted: 'ENCRYPTION_OFF'}` during the driver construction. Here is an example related to `Node.js`. Memgraph doesn't have integrated -support for `Web Socket` which is required during the execution in any web +support for `WebSocket` which is required during the execution in any web browser. If you want to run `openCypher` queries from a web browser, [websockify](https://github.com/novnc/websockify) has to be up and running. -Requests from web browsers are wrapped into `Web Socket` messages, and a proxy +Requests from web browsers are wrapped into `WebSocket` messages, and a proxy is needed to handle the overhead. The proxy has to be configured to point out to Memgraph's Bolt port and web browser driver has to send requests to the proxy port. @@ -217,23 +225,9 @@ run_query("MATCH (n) DETACH DELETE n", function (result) { ### Limitations -Memgraph is currently in alpha stage, and has a number of limitations we plan +Memgraph is currently in early stage, and has a number of limitations we plan to remove in future versions. -#### Single query length - -The maximum length of a query that can be sent from a driver in Python is -`16378` characters, from a driver in Java `8184` and from a driver in -JavaScript `1392` characters. - -#### Multiple-Query Transactions - -Even though Memgraph is a transactional database engine, transactions -containing multiple queries are not yet supported. In other words, explicit -transaction start and stop aren't yet supported. A transaction is created and -committed implicitly for each executed query. If query execution fails, the -transaction is aborted. - #### Multiple Users & Authorization Memgraph is currently single-user only. There is no way to control user @@ -248,7 +242,7 @@ Memgraph processes. #### Secure Sockets Layer (SSL) -Secure connections are not supported in alpha. For this reason each client +Secure connections are not supported. For this reason each client driver needs to be configured not to use encryption. Consult driver-specific guides for details.