From 93f1ada6a87d8c64c1121eda515b1cf8e64cab72 Mon Sep 17 00:00:00 2001 From: Matija Date: Wed, 30 Aug 2023 16:33:43 +0200 Subject: [PATCH 1/6] Write docs for nodes --- .../query-modules/cpp/nodes/graph_after.png | Bin 0 -> 47744 bytes .../query-modules/cpp/nodes/graph_before.png | Bin 0 -> 25417 bytes mage/query-modules/cpp/nodes.md | 117 ++++++++++++++++++ mage/templates/_mage_spells.mdx | 1 + sidebars/sidebarsMAGE.js | 1 + 5 files changed, 119 insertions(+) create mode 100644 mage/data/query-modules/cpp/nodes/graph_after.png create mode 100644 mage/data/query-modules/cpp/nodes/graph_before.png create mode 100644 mage/query-modules/cpp/nodes.md diff --git a/mage/data/query-modules/cpp/nodes/graph_after.png b/mage/data/query-modules/cpp/nodes/graph_after.png new file mode 100644 index 0000000000000000000000000000000000000000..b1633d3693879454ea81c67854729edbff21355d GIT binary patch literal 47744 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�sP43$kZ3@?&bNo*18Fq( zISO&q0*QjSHA2kruj1X0!*T$WZ&2oChS+l{8%H0ca(qm>@nFS00Oj@XciO{-OKn*V zz5q)9*(xM)1E7QjtuY*>5wN*Ro?g<~*@+Fq8LGx%G8!m{xsR9VLYWnOju#denb_IC z7~e|GB?XzA(L3pqM!>m^hNdPa3j0A0)XTVdaofm7Uk$1qhVX*0&`^5Bh#z>uBXM?U z1`-AX1mkAY-^){9BtrqwizIGf)Wx`LdtU4GpNOVJ{Ts1OXs%5Qu1v< z(U|}HO;YG3&8?JP?6|)?f(+d-H^h$`1zrcT7Fqz9W$uEv3Q~;Z`gP8($EW9}K%WqU z0Rl1ALf>cyzG3CMhJoAsF4eE(Qg&Z~RPL#VwF$YD%xE*fK6HY}|MQh_WH)!}uv+mj z0A9T=y@^vB>sy8fpaeLBDIF{#BmfH2uH>&2xRx@2XB#HJbiZ$e4`(N|#P)_XbXxrC z2P)HG;zLfARJQ=U&{!3K`5Jk=Hh|G^GT|;XY2s_w!T|1o+C>jSoa>*jMTrz>o^On3 zg&b(W(-;k7=;6`P9I_tZ20^Cav}*!GfRugf{2BuEX|0?=ESEKq zTLcRgx|0<_0>s)>!0|eZNZAeWam{Q7p5IZ|(5Qf^?(p9~#JWI8WmSY2f)K7bC?M)( z{DxIEIC^~g9IT_kce!$Epwr~V6Le?(x-TRxLbd_@*lOtg^M7n}@=4}SlxPM`ao34# zK#Pr<_*<0W($eClur_(+Ek%BYaKWuk57NXZAiWEOPzyO2gG>(`?-f!~QdJleKxaX4 z9qddO2rV;U#8~F;kw)lAWO`Wj7_RPDgYjG8hB$a|WTd6hv;B4yVD3kQy#{dxta_KW zCOxNTAp``yCP192uo-6a^6_DW!UXQ0IykK1Jky32ODEZ)Hr?2tW)u)bByorW9gtXB zsz}omSZqX0netiXB%tJd-Qz>9U8)z>lYH|NV0IYfcS?LY4M3~_Boj9kfsjXrw(GF` z;D>Se?hXj+Mk{V0l)i;q!|r9EP6N_tbJwsEN`os=f`9SCHQ2s3QcBIDk{t`J9$|?L zjUM8l1qPl|ZF4~yv}I-6-COk%=!944L!pP}H-+o_V_mw05hOM%WAA2$?Y`8B5DI zV&UuHjOm0?eD#r*HlWwE)ax*i8g?l!g4e4HD*NpGdO`XcKRC6qO;AFq2$- zXh;YKsAI9piw3HyC?g{y;0zFPltRGfd6PY;vj{@`vJ&|ctqVd+{mGMC|8Yg_jx=xW z@5_352}9x5GUFB_QL~3LIoO0$p@5)jQ2%tNS&C=?LLJfdei z5JG^{kZBJr#ApQ6f+bUJad87j zHBB7L(*I$;IyOE&Ulw=@ zx(GbOTSJwmjbD&^a?o&ie0Hr7<{aqvXQOnYa2^DiVzFEZ`-XJsKz>JB@%HB{Dkv1$ zZNpeJ3~c^GKg9x4kR3zRi)27yfq9@%i28}19u@E`Q7|jq%T+Z77Nfjk*6OFs9}vz8 zX<=-Dc7lzvu>FH4bY9I=(_GgR7027B8P*ho0&gDlR>TMxY)xW#_$i$3_jES+`;vaeA1J36G z@Z?N@H416yL3f(98=~Z4-Iz94fqMt4ga}-LQs4-Be!)90+}F}B(P21vpAMOwjd+O> zU%~u5Mqpqdhfxa+JT?I5=Qrc5k#(3sW^w>fZR|hoile>+LV

&$SF8$4-zK#-BO%FvC3p=`ILI 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 literal 0 HcmV?d00001 diff --git a/mage/data/query-modules/cpp/nodes/graph_before.png b/mage/data/query-modules/cpp/nodes/graph_before.png new file mode 100644 index 0000000000000000000000000000000000000000..96033429cc8bc76a0aa802ab6a85b2d3eebc9323 GIT binary patch literal 25417 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 literal 0 HcmV?d00001 diff --git a/mage/query-modules/cpp/nodes.md b/mage/query-modules/cpp/nodes.md new file mode 100644 index 00000000000..9df44080ed2 --- /dev/null +++ b/mage/query-modules/cpp/nodes.md @@ -0,0 +1,117 @@ +--- +id: nodes +title: nodes +sidebar_label: nodes +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunOnSubgraph from '../../templates/_run_on_subgraph.mdx'; + +export const Highlight = ({children, color}) => ( + +{children} + +); + +The `nodes` module provides a comprehensive toolkit for managing multiple graph nodes, enabling linking, updating, type deduction and more. + +[![docs-source](https://img.shields.io/badge/source-nodes-FB6E00?logo=github&style=for-the-badge)](https://github.com/memgraph/mage/tree/main/cpp/nodes_module) + +| Trait | Value | +| ------------------- | ----------------------------------------------------- | +| **Module type** | **algorithm** | +| **Implementation** | **C++** | +| **Graph direction** | **directed**/**undirected** | +| **Edge weights** | **weighted**/**unweighted** | +| **Parallelism** | **sequential** | + +### Procedures + +### `relationships_exist(nodes, relationships)` + +Checks if relationships in the input list exist at the given nodes. Results are returned as a map, which contains two smaller maps. The first map represents the node, and the second map represents the relationship status map of the node. Relationships can be directed, and the syntax for direction specification is provided below: +- <type - incoming relationship. +- type> - outgoing relationship. +- type - both incoming and outgoing. +- anything else results in an exception. + +#### Input: + +- `nodes: List[Any]` ➡ list of input nodes. Elements of the list can be either nodes themselves or their IDs. +- `relationships: List[string]` ➡ list of relationships to be checked. + +#### Output: + +- `result: Map` ➡ result map, containing two smaller maps. The first map represents the node, and the second represents the status of relationships checked in the function. Example of the map: `{"Node": {"id": 0, "labels": ["Dog"], "properties": {},"type": "node"}, "Relationships_exist_status": {"RUNS": false}}` + +#### Usage: + +```cypher +CREATE (d:Dog)-[l:LOVES]->(h:Human)-[t:TAKES_CARE_OF]->(d); +``` + +```cypher +MATCH (d:Dog), (h:Human) CALL nodes.relationships_exist([d,id(h)], [" + + + + + + + + +```cypher +MATCH (h:Human), (c:Cat), (m:Mouse), (e:Elephant) CALL nodes.link([e, m, c, h, e],"IS_AFRAID_OF"); +``` + + + + + + + + + + + + diff --git a/mage/templates/_mage_spells.mdx b/mage/templates/_mage_spells.mdx index c5010a8e4a0..33652536914 100644 --- a/mage/templates/_mage_spells.mdx +++ b/mage/templates/_mage_spells.mdx @@ -19,6 +19,7 @@ | [map](/mage/query-modules/cpp/map) | C++ | The map module offers a versatile toolkit for manipulating collections of key-value pairs, enabling advanced data operations within a graph database context | | [max_flow](/mage/query-modules/python/max-flow) | Python | An algorithm for finding a flow through a graph such that it is the maximum possible flow. | | [node_similarity](/mage/query-modules/cpp/node-similarity) | C++ | A module that contains similarity measures for calculating the similarity between two nodes. | +| [nodes](/mage/query-modules/cpp/nodes) | C++ | A module that provides a comprehensive toolkit for managing multiple graph nodes, enabling linking, updating, type deduction and more. | | [pagerank](/mage/query-modules/cpp/pagerank) | C++ | Algorithm that yields the influence measurement based on the recursive information about the connected nodes influence. | | [set_cover](/mage/query-modules/python/set-cover) | Python | An algorithm for finding the minimum cost subcollection of sets that covers all elements of a universe. | | [text](/mage/query-modules/cpp/text) | C++ | A module for manipulating strings. | diff --git a/sidebars/sidebarsMAGE.js b/sidebars/sidebarsMAGE.js index c7b359cf431..ffd459c80f3 100644 --- a/sidebars/sidebarsMAGE.js +++ b/sidebars/sidebarsMAGE.js @@ -58,6 +58,7 @@ module.exports = { "query-modules/python/node2vec", "query-modules/python/node2vec-online", "query-modules/cpp/node-similarity", + "query-modules/cpp/nodes", "query-modules/python/nxalg", "query-modules/cpp/pagerank", "query-modules/cpp/pagerank-online", From 911d58d92a238ffc893f3e383c48b16eca487647 Mon Sep 17 00:00:00 2001 From: imilinovic Date: Mon, 4 Sep 2023 10:13:33 +0200 Subject: [PATCH 2/6] relationship_types docs --- mage/query-modules/cpp/nodes.md | 82 +++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/mage/query-modules/cpp/nodes.md b/mage/query-modules/cpp/nodes.md index 9df44080ed2..00d77593069 100644 --- a/mage/query-modules/cpp/nodes.md +++ b/mage/query-modules/cpp/nodes.md @@ -34,6 +34,88 @@ The `nodes` module provides a comprehensive toolkit for managing multiple graph ### Procedures +### `relationship_types(nodes, types)` + +Returns a list of distinct relationship types of the given node(s) contained within the given list of types. If the list of types is empty returns all distinct relationship types. Relationship types can also be directed: +- <type - incoming relationship. +- type> - outgoing relationship. +- type - either way. + +#### Input: + +- `node: int|node|List[int|node]` ➡ list of input nodes. Elements of the list can be either nodes themselves or their IDs. +- `types: List[string] (default = [])` ➡ list of relationship types to filter by. + +#### Output: + +- `relationship_types: List[Map]` ➡ Each list element is a map with two keys: `node` and `types`. `node` representing the given node and `types` a list of distinct relationship types contained within the given list of types for the corresponding node. + +#### Usage: + +```cypher +CREATE (ivan: Intern {name: 'Ivan'}) +CREATE (idora: Intern {name: 'Idora'}) +CREATE (matija: Intern {name: 'Matija'}) +MERGE (ivan)-[:KNOWS]->(idora) +MERGE (matija)-[:HEARS]->(idora) +MERGE (matija)-[:SEES]->(ivan); +``` + +```cypher +MATCH (n:Intern) WITH collect(n) as interns CALL nodes.relationship_types(interns, ["", "HEARS"]) YIELD relationship_types RETURN relationship_types; +``` + +```plaintext ++---------------------------------------+ +| relationship_types | +| [ | +| { | +| "node": { | +| "labels": [ | +| "Intern" | +| ], | +| "properties": { | +| "name": "Ivan" | +| }, | +| "type": "node" | +| }, | +| "types": [] | +| }, | +| { | +| "node": { | +| "labels": [ | +| "Intern" | +| ], | +| "properties": { | +| "name": "Idora" | +| }, | +| "type": "node" | +| }, | +| "types": [ | +| "HEARS", | +| "KNOWS" | +| ] | +| }, | +| { | +| "node": { | +| "labels": [ | +| "Intern" | +| ], | +| "properties": { | +| "name": "Matija" | +| }, | +| "type": "node" | +| }, | +| "types": [ | +| "SEES", | +| "HEARS" | +| ] | +| } | +| ] | ++---------------------------------------+ +``` + + ### `relationships_exist(nodes, relationships)` Checks if relationships in the input list exist at the given nodes. Results are returned as a map, which contains two smaller maps. The first map represents the node, and the second map represents the relationship status map of the node. Relationships can be directed, and the syntax for direction specification is provided below: From 30214f5b82981be07fd9648a7178a7a02d083d16 Mon Sep 17 00:00:00 2001 From: imilinovic Date: Mon, 4 Sep 2023 13:39:47 +0200 Subject: [PATCH 3/6] nodes delete docs --- mage/query-modules/cpp/nodes.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/mage/query-modules/cpp/nodes.md b/mage/query-modules/cpp/nodes.md index 00d77593069..367346a0b9a 100644 --- a/mage/query-modules/cpp/nodes.md +++ b/mage/query-modules/cpp/nodes.md @@ -43,7 +43,7 @@ Returns a list of distinct relationship types of the given node(s) contained wit #### Input: -- `node: int|node|List[int|node]` ➡ list of input nodes. Elements of the list can be either nodes themselves or their IDs. +- `node: int|node|List[int|node]` ➡ input nodes given as nodes themselves or their IDs. - `types: List[string] (default = [])` ➡ list of relationship types to filter by. #### Output: @@ -115,6 +115,29 @@ MATCH (n:Intern) WITH collect(n) as interns CALL nodes.relationship_types(intern +---------------------------------------+ ``` +### `delete(nodes)` + +Deletes the given node(s) from the graph. Equivalent to doing detach delete. + +### Input: + +- `nodes: int|node|List[int|node]` - nodes to be deleted given as nodes themselves or their IDs. + +### Usage: + +```cypher +CREATE (ivan: Intern {name: 'Ivan'}) +CREATE (idora: Intern {name: 'Idora'}) +CREATE (matija: Intern {name: 'Matija'}) +MERGE (ivan)-[:KNOWS]->(idora) +MERGE (matija)-[:HEARS]->(idora) +MERGE (matija)-[:SEES]->(ivan); +``` + +The following query will delete all the created nodes and relationships: +```cypher +MATCH (n:Intern) WITH collect(n) as interns CALL nodes.delete(interns); +``` ### `relationships_exist(nodes, relationships)` From f7c76ca3e508e0037f1a5df3c8939f0d95f60c1e Mon Sep 17 00:00:00 2001 From: imilinovic Date: Mon, 4 Sep 2023 13:51:32 +0200 Subject: [PATCH 4/6] small change --- mage/query-modules/cpp/nodes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mage/query-modules/cpp/nodes.md b/mage/query-modules/cpp/nodes.md index 367346a0b9a..188bb92d628 100644 --- a/mage/query-modules/cpp/nodes.md +++ b/mage/query-modules/cpp/nodes.md @@ -119,11 +119,11 @@ MATCH (n:Intern) WITH collect(n) as interns CALL nodes.relationship_types(intern Deletes the given node(s) from the graph. Equivalent to doing detach delete. -### Input: +#### Input: - `nodes: int|node|List[int|node]` - nodes to be deleted given as nodes themselves or their IDs. -### Usage: +#### Usage: ```cypher CREATE (ivan: Intern {name: 'Ivan'}) From d5f7b18e80023267f1e04ae33f6a964c348dea22 Mon Sep 17 00:00:00 2001 From: Vlasta <95473291+vpavicic@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:07:42 +0200 Subject: [PATCH 5/6] Apply suggestions from code review --- mage/query-modules/cpp/nodes.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mage/query-modules/cpp/nodes.md b/mage/query-modules/cpp/nodes.md index 188bb92d628..b874287aaa8 100644 --- a/mage/query-modules/cpp/nodes.md +++ b/mage/query-modules/cpp/nodes.md @@ -36,7 +36,7 @@ The `nodes` module provides a comprehensive toolkit for managing multiple graph ### `relationship_types(nodes, types)` -Returns a list of distinct relationship types of the given node(s) contained within the given list of types. If the list of types is empty returns all distinct relationship types. Relationship types can also be directed: +Returns a list of distinct relationship types of the given node(s) contained within the given list of types. If the list of types is empty, the procedure returns all distinct relationship types. Relationship types can also be directed: - <type - incoming relationship. - type> - outgoing relationship. - type - either way. @@ -117,7 +117,7 @@ MATCH (n:Intern) WITH collect(n) as interns CALL nodes.relationship_types(intern ### `delete(nodes)` -Deletes the given node(s) from the graph. Equivalent to doing detach delete. +Deletes the given node(s) from the graph. Equivalent to running a `DETACH DELETE` query. #### Input: @@ -145,7 +145,8 @@ Checks if relationships in the input list exist at the given nodes. Results are - <type - incoming relationship. - type> - outgoing relationship. - type - both incoming and outgoing. -- anything else results in an exception. + +Any other syntax results in an exception. #### Input: @@ -183,8 +184,8 @@ Links the provided nodes sequentially with the relationship type provided in the #### Input: -- `nodes: List[Node]` ➡ list of input nodes which are to be linked. -- `type: string` ➡ type of relationship which will be used in linking. +- `nodes: List[Node]` ➡ list of input nodes that need to be linked. +- `type: string` ➡ type of relationship that will link two nodes. #### Usage: From 1c437bf719a29a97e01258526a69213aa50cc54e Mon Sep 17 00:00:00 2001 From: Vlasta Date: Tue, 12 Sep 2023 14:01:49 +0200 Subject: [PATCH 6/6] change-to-util --- mage/templates/_mage_spells.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mage/templates/_mage_spells.mdx b/mage/templates/_mage_spells.mdx index ca180d559ed..af7779309ac 100644 --- a/mage/templates/_mage_spells.mdx +++ b/mage/templates/_mage_spells.mdx @@ -20,7 +20,6 @@ | [max_flow](/mage/query-modules/python/max-flow) | Python | An algorithm for finding a flow through a graph such that it is the maximum possible flow. | | [neighbors](/mage/query-modules/cpp/neighbors) | C++ | The neighbors module allows users to interact with and query nodes that have direct relationships to a specified node. | | [node_similarity](/mage/query-modules/cpp/node-similarity) | C++ | A module that contains similarity measures for calculating the similarity between two nodes. | -| [nodes](/mage/query-modules/cpp/nodes) | C++ | A module that provides a comprehensive toolkit for managing multiple graph nodes, enabling linking, updating, type deduction and more. | | [pagerank](/mage/query-modules/cpp/pagerank) | C++ | Algorithm that yields the influence measurement based on the recursive information about the connected nodes influence. | | [set_cover](/mage/query-modules/python/set-cover) | Python | An algorithm for finding the minimum cost subcollection of sets that covers all elements of a universe. | | [temporal](/mage/query-modules/python/temporal) | Python | A module that provides functions to handle temporal (time-related) operations and offers extended capabilities compared to the date module. | @@ -65,6 +64,7 @@ | [llm_util](/mage/query-modules/python/llm-util) | Python | A module that contains procedures describing graphs in a format best suited for large language models (LLMs). | | [meta_util](/mage/query-modules/python/meta-util) | Python | A module that contains procedures describing graphs on a meta-level. | | [migrate](/mage/query-modules/python/migrate) | Python | A module that can access data from a MySQL, SQL Server or Oracle database. | +| [nodes](/mage/query-modules/cpp/nodes) | C++ | A module that provides a comprehensive toolkit for managing multiple graph nodes, enabling linking, updating, type deduction and more. | | [periodic](/mage/query-modules/cpp/periodic) | C++ | A module containing procedures for periodically running difficult and/or memory/time consuming queries. | | rust_example | Rust | Example of a basic module with input parameters forwarding, made in Rust. | | [uuid_generator](/mage/query-modules/cpp/uuid-generator) | C++ | A module that generates a new universally unique identifier (UUID). |