From c58c243c7db2cb757ab49d6c7b76ecafe740c807 Mon Sep 17 00:00:00 2001 From: Victor Lee Date: Fri, 30 Jun 2023 00:47:32 -0400 Subject: [PATCH 01/16] create 1.5 branch --- antora.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/antora.yml b/antora.yml index eb2a6c6..83b99bc 100644 --- a/antora.yml +++ b/antora.yml @@ -1,7 +1,7 @@ name: pytigergraph title: pyTigerGraph -version: 1.4 -display_version: "1.4" +version: 1.5 +display_version: "1.5" start_page: intro:index.adoc nav: From 40fa4193d61302b2c42bc03cf16ece4ffe1d21e5 Mon Sep 17 00:00:00 2001 From: Parker Erickson Date: Thu, 31 Aug 2023 12:32:22 -0500 Subject: [PATCH 02/16] feat(oo schema): add oo schema doc --- .../docstring2asciidoc_cfg_template.json | 1 + modules/core-functions/pages/base.adoc | 4 +- modules/core-functions/pages/schema-def.adoc | 275 ++++++++++++++++++ modules/datasets/pages/dataset_object.adoc | 5 +- modules/gds/pages/gds.adoc | 17 +- 5 files changed, 294 insertions(+), 8 deletions(-) create mode 100644 modules/core-functions/pages/schema-def.adoc diff --git a/generator/docstring2asciidoc_cfg_template.json b/generator/docstring2asciidoc_cfg_template.json index b8bd751..8a1464e 100644 --- a/generator/docstring2asciidoc_cfg_template.json +++ b/generator/docstring2asciidoc_cfg_template.json @@ -13,6 +13,7 @@ "pyTigerGraph/pyTigerGraphUDT.py": "modules/core-functions/pages/udt.adoc", "pyTigerGraph/pyTigerGraphUtils.py": "modules/core-functions/pages/utils.adoc", "pyTigerGraph/pyTigerGraphVertex.py": "modules/core-functions/pages/vertex.adoc", + "pyTigerGraph/schema.py": "modules/core-functions/pages/schema-def.adoc", "pyTigerGraph/gds/gds.py": "modules/gds/pages/gds.adoc", "pyTigerGraph/gds/dataloaders.py": "modules/gds/pages/dataloaders.adoc", "pyTigerGraph/gds/featurizer.py": "modules/gds/pages/featurizer.adoc", diff --git a/modules/core-functions/pages/base.adoc b/modules/core-functions/pages/base.adoc index f8ca688..541377f 100644 --- a/modules/core-functions/pages/base.adoc +++ b/modules/core-functions/pages/base.adoc @@ -18,14 +18,12 @@ a self-signed certificate will be used. * `graphname`: The default graph for running queries. * `gsqlSecret`: The secret key for GSQL. + See https://docs.tigergraph.com/tigergraph-server/current/user-access/managing-credentials#_secrets.[this] for more details. -Required for GSQL authentication on TigerGraph Cloud instances created after -July 5, 2022. * `username`: The username on the TigerGraph server. * `password`: The password for that user. * `tgCloud`: Set to `True` if using TigerGraph Cloud. If your hostname contains `tgcloud`, then this is automatically set to `True`, and you do not need to set this argument. * `restppPort`: The port for REST++ queries. -* `gsPort`: The port of all other queries. +* `gsPort`: The port for gsql server. * `gsqlVersion`: The version of the GSQL client to be used. Effectively the version of the database being connected to. * `version`: DEPRECATED; use `gsqlVersion`. diff --git a/modules/core-functions/pages/schema-def.adoc b/modules/core-functions/pages/schema-def.adoc new file mode 100644 index 0000000..575b0cd --- /dev/null +++ b/modules/core-functions/pages/schema-def.adoc @@ -0,0 +1,275 @@ += Object-Oriented Schema + +The Object-Oriented Schema functionality allows users to manipulate schema elements in the database in an object-oriented approach in Python. + +To add an AccountHolder vertex and a HOLDS_ACCOUNT edge to the Ethereum dataset, simply: + +``` +from pyTigerGraph import TigerGraphConnection +from pyTigerGraph.schema import Graph, Vertex, Edge + +from datetime import datetime +from typing import List, Dict, Optional, Union +from dataclasses import dataclass, fields + +conn = TigerGraphConnection(host="http://YOUR_HOSTNAME_HERE", graphname="Ethereum") + +g = Graph(conn) + + +@dataclass +class AccountHolder(Vertex): + name: str + address: str + accounts: List[str] + dob: datetime + some_map: Dict[str, int] + some_double: "DOUBLE" + primary_id: str = "name" + primary_id_as_attribute: bool = True + +@dataclass +class HOLDS_ACCOUNT(Edge): + opened_on: datetime + from_vertex: Union[AccountHolder, g.vertex_types["Account"]] + to_vertex: g.vertex_types["Account"] + is_directed: bool = True + reverse_edge: str = "ACCOUNT_HELD_BY" + discriminator: str = "opened_on" + +g.add_vertex_type(AccountHolder) + +g.add_edge_type(HOLDS_ACCOUNT) + +g.commit_changes() +``` + +One could also define the entire graph schema using the approach. For example, for the Cora dataset, the schema would look something like this: + +``` +from pyTigerGraph import TigerGraphConnection +from pyTigerGraph.schema import Graph, Vertex, Edge + +conn = TigerGraphConnection("http://YOUR_HOSTNAME_HERE") + +g = Graph() + +@dataclass +class Paper(Vertex): + id: int + y: int + x: List[int] + primary_id: str = "id" + primary_id_as_attribute: bool = True + +@dataclass +class CITES(Edge): + from_vertex: Paper + to_vertex: Paper + is_directed: bool = True + reverse_edge: str = "R_CITES" + +g.add_vertex_type(Paper) +g.add_edge_type(CITES) + +g.commit_changes(conn) +``` + +== Vertex + +Abstract parent class for other types of vertices to be inherited from. +Contains class methods to edit the attributes associated with the vertex type. + +When defining new vertex types, make sure to include the `primary_id` and `primary_id_as_attribute` class attributes, as these are necessary to define the vertex in TigerGraph. + +For example, to define an AccountHolder vertex type, use: + + +[source,indent=0] +---- +@dataclass +class AccountHolder(Vertex): + name: str + address: str + accounts: List[str] + dob: datetime + some_map: Dict[str, int] + some_double: "DOUBLE" + primary_id: str = "name" + primary_id_as_attribute: bool = True +---- + + + +=== add_attribute() +`add_attribute(attribute_name: str, attribute_type, default_value = None)` + +Function to add an attribute to the given vertex type. + +[discrete] +==== Parameters: +* `attribute_name (str)`: The name of the attribute to add +* `attribute_type (Python type)`: The Python type of the attribute to add. +For types that are not supported in Python but are in GSQL, wrap them in quotes; e.g. "DOUBLE" +* `default_value (type of attribute, default None)`: The desired default value of the attribute. Defaults to None. + + +=== remove_attribute() +`remove_attribute(attribute_name)` + +Function to remove an attribute from the given vertex type. + +[discrete] +==== Parameter: +* `attribute_name (str)`: The name of the attribute to remove from the vertex. + + +=== attributes() +`attributes()` + +Class attribute to view the attributes and types of the vertex. + + +== Edge + +Abstract parent class for other types of edges to be inherited from. +Contains class methods to edit the attributes associated with the edge type. + +When defining new vertex types, make sure to include the required `from_vertex`, `to_vertex`, `reverse_edge`, `is_directed` attributes and optionally the `discriminator` attribute, as these are necessary to define the vertex in TigerGraph. + +For example, to define an HOLDS_ACCOUNT edge type, use: + + +[source,indent=0] +---- +@dataclass +class HOLDS_ACCOUNT(Edge): + opened_on: datetime + from_vertex: Union[AccountHolder, g.vertex_types["Account"]] + to_vertex: g.vertex_types["Account"] + is_directed: bool = True + reverse_edge: str = "ACCOUNT_HELD_BY" + discriminator: str = "opened_on" +---- + + + +=== add_attribute() +`add_attribute(attribute_name, attribute_type, default_value = None)` + +Function to add an attribute to the given edge type. + +[discrete] +==== Parameters: +* `attribute_name (str)`: The name of the attribute to add. +* `attribute_type (Python type)`: The Python type of the attribute to add. +For types that are not supported in Python but are in GSQL, wrap them in quotes; e.g. "DOUBLE" +* `default_value (type of attribute, default None)`: The desired default value of the attribute. Defaults to None. + + +=== remove_attribute() +`remove_attribute(attribute_name)` + +Function to remove an attribute from the given edge type. + +[discrete] +==== Parameter: +* `attribute_name (str)`: The name of the attribute to remove from the edge. + + +=== attributes() +`attributes()` + +Class attribute to view the attributes and types of the vertex. + + +== Graph + +The graph object can be used in conjunction with a TigerGraphConnection to retrieve the schema of the connected graph. +Serves as the way to collect the definitions of Vertex and Edge types. + +To instantiate the graph object with a connection to an existing graph, use: + +[source,indent=0] +---- +from pyTigerGraph.schema import Graph + +g = Graph(conn) +---- + + + +=== \__init__() +`__init__(conn: TigerGraphConnection = None)` + +Graph class for schema representation. + +[discrete] +==== Parameter: +* `conn (TigerGraphConnection, optional)`: Connection to a TigerGraph database. Defaults to None. + + +=== add_vertex_type() +`add_vertex_type(vertex: Vertex, outdegree_stats = True)` + +Add a vertex type to the list of changes to commit to the graph. + +[discrete] +==== Parameters: +* `vertex (Vertex)`: The vertex type definition to add to the addition cache. +* `outdegree_stats (bool, optional)`: Whether or not to include "WITH OUTEGREE_STATS=TRUE" in the schema definition. +Used for caching outdegree, defaults to True. + + +=== add_edge_type() +`add_edge_type(edge: Edge)` + +Add an edge type to the list of changes to commit to the graph. + +[discrete] +==== Parameter: +* `edge (Edge)`: The edge type definition to add to the addition cache. + + +=== remove_vertex_type() +`remove_vertex_type(vertex: Vertex)` + +Add a vertex type to the list of changes to remove from the graph. + +[discrete] +==== Parameter: +* `vertex (Vertex)`: The vertex type definition to add to the removal cache. + + +=== remove_edge_type() +`remove_edge_type(edge: Edge)` + +Add an edge type to the list of changes to remove from the graph. + +[discrete] +==== Parameter: +* `edge (Edge)`: The edge type definition to add to the removal cache. + + +=== commit_changes() +`commit_changes(conn: TigerGraphConnection = None)` + +Commit schema changes to the graph. +[discrete] +==== Parameter: +* `conn (TigerGraphConnection, optional)`: Connection to the database to edit the schema of. +Not required if the Graph was instantiated with a connection object. + + +=== vertex_types() +`vertex_types()` + +Vertex types property. + + +=== edge_types() +`edge_types()` + +Edge types property. + + diff --git a/modules/datasets/pages/dataset_object.adoc b/modules/datasets/pages/dataset_object.adoc index d191783..fc0f2fb 100644 --- a/modules/datasets/pages/dataset_object.adoc +++ b/modules/datasets/pages/dataset_object.adoc @@ -11,7 +11,10 @@ Stock datasets. Please see https://tigergraph-public-data.s3.us-west-1.amazonaws.com/inventory.json[this link] for datasets that are currently available. The files for the dataset with `name` will be -downloaded to local `tmp_dir` automatically when this class is instantiated. +downloaded to local `tmp_dir` automatically when this class is instantiated. +For offline environments, download the desired tar manually from the invenetory page, and extract in the desired location. +Specify the `tmp_dir` parameter to point to where the unzipped directory resides. + [discrete] ==== Parameters: diff --git a/modules/gds/pages/gds.adoc b/modules/gds/pages/gds.adoc index a4af827..33e0875 100644 --- a/modules/gds/pages/gds.adoc +++ b/modules/gds/pages/gds.adoc @@ -81,7 +81,7 @@ Whether to add a topic for each epoch. Defaults to False. == neighborLoader() -`neighborLoader(v_in_feats: Union[list, dict] = None, v_out_labels: Union[list, dict] = None, v_extra_feats: Union[list, dict] = None, e_in_feats: Union[list, dict] = None, e_out_labels: Union[list, dict] = None, e_extra_feats: Union[list, dict] = None, batch_size: int = None, num_batches: int = 1, num_neighbors: int = 10, num_hops: int = 2, shuffle: bool = False, filter_by: str = None, output_format: str = "PyG", add_self_loop: bool = False, loader_id: str = None, buffer_size: int = 4, reverse_edge: bool = False, delimiter: str = "|", timeout: int = 300000, callback_fn: Callable = None, reinstall_query: bool = False, distributed_query: bool = False) -> NeighborLoader` +`neighborLoader(v_in_feats: Union[list, dict] = None, v_out_labels: Union[list, dict] = None, v_extra_feats: Union[list, dict] = None, v_seed_types: Union[str, list] = None, e_in_feats: Union[list, dict] = None, e_out_labels: Union[list, dict] = None, e_extra_feats: Union[list, dict] = None, batch_size: int = None, num_batches: int = 1, num_neighbors: int = 10, num_hops: int = 2, shuffle: bool = False, filter_by: str = None, output_format: str = "PyG", add_self_loop: bool = False, loader_id: str = None, buffer_size: int = 4, reverse_edge: bool = False, delimiter: str = "|", timeout: int = 300000, callback_fn: Callable = None, reinstall_query: bool = False, distributed_query: bool = False) -> NeighborLoader` Returns a `NeighborLoader` instance. A `NeighborLoader` instance performs neighbor sampling from vertices in the graph in batches in the following manner: @@ -138,6 +138,9 @@ certain attribute doesn't exist in all vertex types. If it is a dict, keys of th dict are vertex types to be selected, and values are lists of attributes to be selected for each vertex type. Numeric, boolean and string attributes are allowed. Defaults to None. +* `v_seed_types (str or list, optional)`: Directly specify the vertex types to use as seeds. If not specified, defaults to +the vertex types used in filter_by. If not specified there, uses all vertex types. +Defaults to None. * `e_in_feats (list or dict, optional)`: Edge attributes to be used as input features. If it is a list, then the attributes in the list from all edge types will be selected. An error will be thrown if @@ -414,7 +417,7 @@ can be included as seeds. If a dictionary is provided, must be in the form of: {"vertex_type": "attribute"}. If a list, must contain multiple filters and an unique loader will be returned for each list element. Defaults to None. * `output_format (str, optional)`: Format of the output data of the loader. -Only "PyG", "DGL", "spektral", and "dataframe" are supported. Defaults to "dataframe". +Only "PyG", "DGL", "spektral", and "dataframe" are supported. Defaults to "PyG". * `add_self_loop (bool, optional)`: Whether to add self-loops to the graph. Defaults to False. * `loader_id (str, optional)`: An identifier of the loader which can be any string. It is also used as the Kafka topic name if Kafka topic is not given. If `None`, a random string will be generated @@ -435,7 +438,7 @@ for examples. == edgeNeighborLoader() -`edgeNeighborLoader(v_in_feats: Union[list, dict] = None, v_out_labels: Union[list, dict] = None, v_extra_feats: Union[list, dict] = None, e_in_feats: Union[list, dict] = None, e_out_labels: Union[list, dict] = None, e_extra_feats: Union[list, dict] = None, batch_size: int = None, num_batches: int = 1, num_neighbors: int = 10, num_hops: int = 2, shuffle: bool = False, filter_by: str = None, output_format: str = "PyG", add_self_loop: bool = False, loader_id: str = None, buffer_size: int = 4, reverse_edge: bool = False, delimiter: str = "|", timeout: int = 300000, callback_fn: Callable = None, reinstall_query: bool = False, distributed_query: bool = False) -> EdgeNeighborLoader` +`edgeNeighborLoader(v_in_feats: Union[list, dict] = None, v_out_labels: Union[list, dict] = None, v_extra_feats: Union[list, dict] = None, e_in_feats: Union[list, dict] = None, e_out_labels: Union[list, dict] = None, e_extra_feats: Union[list, dict] = None, e_seed_types: Union[str, list] = None, batch_size: int = None, num_batches: int = 1, num_neighbors: int = 10, num_hops: int = 2, shuffle: bool = False, filter_by: str = None, output_format: str = "PyG", add_self_loop: bool = False, loader_id: str = None, buffer_size: int = 4, reverse_edge: bool = False, delimiter: str = "|", timeout: int = 300000, callback_fn: Callable = None, reinstall_query: bool = False, distributed_query: bool = False) -> EdgeNeighborLoader` Returns an `EdgeNeighborLoader` instance. An `EdgeNeighborLoader` instance performs neighbor sampling from all edges in the graph in batches in the following manner: @@ -512,6 +515,9 @@ selected. An error will be thrown if certain attribute doesn't exist in all edge types. If it is a dict, keys of the dict are edge types to be selected, and values are lists of attributes to be selected for each edge type. Numeric, boolean and string attributes are allowed. Defaults to None. +* `e_seed_types (str or list, optional)`: Directly specify the edge types to use as seeds. If not specified, defaults to +the edge types used in filter_by. If not specified there, uses all edge types. +Defaults to None. * `batch_size (int, optional)`: Number of vertices as seeds in each batch. Defaults to None. * `num_batches (int, optional)`: Number of batches to split the vertices into as seeds. @@ -621,7 +627,7 @@ for examples. == hgtLoader() -`hgtLoader(num_neighbors: dict, v_in_feats: Union[list, dict] = None, v_out_labels: Union[list, dict] = None, v_extra_feats: Union[list, dict] = None, e_in_feats: Union[list, dict] = None, e_out_labels: Union[list, dict] = None, e_extra_feats: Union[list, dict] = None, batch_size: int = None, num_batches: int = 1, num_hops: int = 2, shuffle: bool = False, filter_by: str = None, output_format: str = "PyG", add_self_loop: bool = False, loader_id: str = None, buffer_size: int = 4, reverse_edge: bool = False, delimiter: str = "|", timeout: int = 300000, callback_fn: Callable = None, reinstall_query: bool = False, distributed_query: bool = False) -> HGTLoader` +`hgtLoader(num_neighbors: dict, v_in_feats: Union[list, dict] = None, v_out_labels: Union[list, dict] = None, v_extra_feats: Union[list, dict] = None, v_seed_types: Union[str, list] = None, e_in_feats: Union[list, dict] = None, e_out_labels: Union[list, dict] = None, e_extra_feats: Union[list, dict] = None, batch_size: int = None, num_batches: int = 1, num_hops: int = 2, shuffle: bool = False, filter_by: str = None, output_format: str = "PyG", add_self_loop: bool = False, loader_id: str = None, buffer_size: int = 4, reverse_edge: bool = False, delimiter: str = "|", timeout: int = 300000, callback_fn: Callable = None, reinstall_query: bool = False, distributed_query: bool = False) -> HGTLoader` Returns a `HGTLoader` instance. A `HGTLoader` instance performs stratified neighbor sampling from vertices in the graph in batches in the following manner: @@ -677,6 +683,9 @@ certain attribute doesn't exist in all vertex types. If it is a dict, keys of th dict are vertex types to be selected, and values are lists of attributes to be selected for each vertex type. Numeric, boolean and string attributes are allowed. Defaults to None. +* `v_seed_types (str or list, optional)`: Directly specify the vertex types to use as seeds. If not specified, defaults to +the vertex types used in filter_by. If not specified there, uses all vertex types. +Defaults to None. * `e_in_feats (list or dict, optional)`: Edge attributes to be used as input features. If it is a list, then the attributes in the list from all edge types will be selected. An error will be thrown if From 90831287214e3a1294d5d9027e43f143581e2fd9 Mon Sep 17 00:00:00 2001 From: Parker Erickson Date: Thu, 31 Aug 2023 13:53:31 -0500 Subject: [PATCH 03/16] doc(oo schema): update schema doc --- modules/core-functions/pages/schema-def.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core-functions/pages/schema-def.adoc b/modules/core-functions/pages/schema-def.adoc index 575b0cd..ebe2ccd 100644 --- a/modules/core-functions/pages/schema-def.adoc +++ b/modules/core-functions/pages/schema-def.adoc @@ -25,7 +25,7 @@ class AccountHolder(Vertex): dob: datetime some_map: Dict[str, int] some_double: "DOUBLE" - primary_id: str = "name" + primary_id: str = "name" # always of type string, corresponds to the desired primary ID attribute. primary_id_as_attribute: bool = True @dataclass From 789301f02365c43f7a0ffc1cfdd6eb4c908207f6 Mon Sep 17 00:00:00 2001 From: Parker Erickson Date: Fri, 15 Sep 2023 13:22:46 -0500 Subject: [PATCH 04/16] feat(oo schema): reorg into separate header --- antora.yml | 1 + modules/object_oriented_schema/nav.adoc | 1 + .../pages/schema-def.adoc | 21 ++++++++----------- 3 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 modules/object_oriented_schema/nav.adoc rename modules/{core-functions => object_oriented_schema}/pages/schema-def.adoc (98%) diff --git a/antora.yml b/antora.yml index 83b99bc..06d5da0 100644 --- a/antora.yml +++ b/antora.yml @@ -12,5 +12,6 @@ nav: - modules/gds/nav.adoc - modules/datasets/nav.adoc - modules/visualization/nav.adoc +- modules/object_oriented_schema/nav.adoc - modules/contributing/nav.adoc - modules/release-notes/nav.adoc diff --git a/modules/object_oriented_schema/nav.adoc b/modules/object_oriented_schema/nav.adoc new file mode 100644 index 0000000..0b38018 --- /dev/null +++ b/modules/object_oriented_schema/nav.adoc @@ -0,0 +1 @@ +* xref:schema-def.adoc[Object Oriented Schema] \ No newline at end of file diff --git a/modules/core-functions/pages/schema-def.adoc b/modules/object_oriented_schema/pages/schema-def.adoc similarity index 98% rename from modules/core-functions/pages/schema-def.adoc rename to modules/object_oriented_schema/pages/schema-def.adoc index ebe2ccd..078d505 100644 --- a/modules/core-functions/pages/schema-def.adoc +++ b/modules/object_oriented_schema/pages/schema-def.adoc @@ -4,7 +4,7 @@ The Object-Oriented Schema functionality allows users to manipulate schema eleme To add an AccountHolder vertex and a HOLDS_ACCOUNT edge to the Ethereum dataset, simply: -``` +```py from pyTigerGraph import TigerGraphConnection from pyTigerGraph.schema import Graph, Vertex, Edge @@ -46,11 +46,11 @@ g.commit_changes() One could also define the entire graph schema using the approach. For example, for the Cora dataset, the schema would look something like this: -``` +```py from pyTigerGraph import TigerGraphConnection from pyTigerGraph.schema import Graph, Vertex, Edge -conn = TigerGraphConnection("http://YOUR_HOSTNAME_HERE") +conn = TigerGraphConnection("http://YOUR_HOSTNAME_HERE", graphname="Cora") g = Graph() @@ -85,8 +85,7 @@ When defining new vertex types, make sure to include the `primary_id` and `prima For example, to define an AccountHolder vertex type, use: -[source,indent=0] ----- +```py @dataclass class AccountHolder(Vertex): name: str @@ -97,7 +96,7 @@ class AccountHolder(Vertex): some_double: "DOUBLE" primary_id: str = "name" primary_id_as_attribute: bool = True ----- +``` @@ -140,8 +139,7 @@ When defining new vertex types, make sure to include the required `from_vertex`, For example, to define an HOLDS_ACCOUNT edge type, use: -[source,indent=0] ----- +```py @dataclass class HOLDS_ACCOUNT(Edge): opened_on: datetime @@ -150,7 +148,7 @@ class HOLDS_ACCOUNT(Edge): is_directed: bool = True reverse_edge: str = "ACCOUNT_HELD_BY" discriminator: str = "opened_on" ----- +``` @@ -190,12 +188,11 @@ Serves as the way to collect the definitions of Vertex and Edge types. To instantiate the graph object with a connection to an existing graph, use: -[source,indent=0] ----- +```py from pyTigerGraph.schema import Graph g = Graph(conn) ----- +``` From b789467e377f58bf137b8df6c418fd3cd6317a11 Mon Sep 17 00:00:00 2001 From: Parker Erickson Date: Wed, 20 Sep 2023 09:27:59 -0500 Subject: [PATCH 05/16] feat(release notes): add v1.5 release notes --- modules/release-notes/pages/index.adoc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/release-notes/pages/index.adoc b/modules/release-notes/pages/index.adoc index 0512c67..8c3687b 100644 --- a/modules/release-notes/pages/index.adoc +++ b/modules/release-notes/pages/index.adoc @@ -1,5 +1,18 @@ = Release Notes +== [1.5] - 2023-09-20 + +Release of pyTigerGraph version 1.5. + +=== Added: +* xref:pytigergraph:object_oriented_schema:schema-def.adoc[Object-oriented schema definition and modifcation]. Define graph schemas in native Python, without knowing GSQL. +* `gsql()` handles some common error cases and raises an exception if they occur. + +=== Changed: +* Dataloaders that experience a parsing error due to missing/dirty data handle the error more gracefully. +* Removed the use of pyTigerDriver for GSQL operations. +* Various bug fixes. + == [1.4] - 2023-05-16 Release of pyTigerGraph version 1.4. From 80a2dc7b1b2a3d755d2d275db4a052481525925d Mon Sep 17 00:00:00 2001 From: Parker Erickson Date: Wed, 20 Sep 2023 16:23:41 -0500 Subject: [PATCH 06/16] update(docs): incorporate Joseph's changes --- .../docstring2asciidoc_cfg_template.json | 2 +- modules/datasets/pages/dataset_object.adoc | 2 +- modules/gds/pages/featurizer.adoc | 10 ++++---- .../pages/schema-def.adoc | 23 +++++++++++-------- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/generator/docstring2asciidoc_cfg_template.json b/generator/docstring2asciidoc_cfg_template.json index 8a1464e..3cf9fd2 100644 --- a/generator/docstring2asciidoc_cfg_template.json +++ b/generator/docstring2asciidoc_cfg_template.json @@ -13,7 +13,7 @@ "pyTigerGraph/pyTigerGraphUDT.py": "modules/core-functions/pages/udt.adoc", "pyTigerGraph/pyTigerGraphUtils.py": "modules/core-functions/pages/utils.adoc", "pyTigerGraph/pyTigerGraphVertex.py": "modules/core-functions/pages/vertex.adoc", - "pyTigerGraph/schema.py": "modules/core-functions/pages/schema-def.adoc", + "pyTigerGraph/schema.py": "modules/object_oriented_schema/pages/schema-def.adoc", "pyTigerGraph/gds/gds.py": "modules/gds/pages/gds.adoc", "pyTigerGraph/gds/dataloaders.py": "modules/gds/pages/dataloaders.adoc", "pyTigerGraph/gds/featurizer.py": "modules/gds/pages/featurizer.adoc", diff --git a/modules/datasets/pages/dataset_object.adoc b/modules/datasets/pages/dataset_object.adoc index fc0f2fb..ba7f086 100644 --- a/modules/datasets/pages/dataset_object.adoc +++ b/modules/datasets/pages/dataset_object.adoc @@ -12,7 +12,7 @@ Stock datasets. Please see https://tigergraph-public-data.s3.us-west-1.amazonaws.com/inventory.json[this link] for datasets that are currently available. The files for the dataset with `name` will be downloaded to local `tmp_dir` automatically when this class is instantiated. -For offline environments, download the desired tar manually from the invenetory page, and extract in the desired location. +For offline environments, download the desired .tar manually from the inventory page, and extract in the desired location. Specify the `tmp_dir` parameter to point to where the unzipped directory resides. diff --git a/modules/gds/pages/featurizer.adoc b/modules/gds/pages/featurizer.adoc index d249410..d2c98b6 100644 --- a/modules/gds/pages/featurizer.adoc +++ b/modules/gds/pages/featurizer.adoc @@ -72,7 +72,7 @@ Print the list of available algorithms in GDS. === installAlgorithm() -`installAlgorithm(query_name: str, query_path: str = None, global_change: bool = False) -> str` +`installAlgorithm(query_name: str, query_path: str = None, global_change: bool = False, distributed_query: bool = False) -> str` Checks if the query is already installed. If the query is not installed, it installs the query and changes the schema if an attribute needs to be added. @@ -80,11 +80,12 @@ If the query is not installed, it installs the query and changes the schema if a [discrete] ==== Parameters: * `query_name (str)`: The name of query to be installed. -* `query_path (str)`: If using a custom query, the path to the `.gsql` file that contains the query. +* `query_path (str, optional)`: If using a custom query, the path to the `.gsql` file that contains the query. Note: you must have the `query_name` parameter match the name of the query in the file. -* `global_change (bool)`: False by default. Set to true if you want to run `GLOBAL SCHEMA_CHANGE JOB`. For algorithms that are not schema free we need to specify this argument. +* `global_change (bool, optional)`: False by default. Set to true if you want to run `GLOBAL SCHEMA_CHANGE JOB`. For algorithms that are not schema free we need to specify this argument. + See https://docs.tigergraph.com/gsql-ref/current/ddl-and-loading/modifying-a-graph-schema#_global_vs_local_schema_changes.[this] for more details. +* `distributed_query (bool, optional)`: False by default. [discrete] ==== Returns: String of query name installed. @@ -106,7 +107,7 @@ Parameter dict the algorithm takes as input. === runAlgorithm() -`runAlgorithm(query_name: str, params: dict = None, runAsync: bool = False, threadLimit: int = None, memoryLimit: int = None, feat_name: str = None, feat_type: str = None, custom_query: bool = False, schema_name: list = None, global_schema: bool = False, timeout: int = 2147480, sizeLimit: int = None, templateQuery: bool = False) -> Any` +`runAlgorithm(query_name: str, params: dict = None, runAsync: bool = False, threadLimit: int = None, memoryLimit: int = None, feat_name: str = None, feat_type: str = None, custom_query: bool = False, schema_name: list = None, global_schema: bool = False, timeout: int = 2147480, sizeLimit: int = None, templateQuery: bool = False, distributed_query: bool = False) -> Any` Runs a TigerGraph Graph Data Science Algorithm. If a built-in algorithm is not installed, it will automatically install before execution. Custom algorithms will have to be installed using the `installAlgorithm()` method. @@ -141,6 +142,7 @@ See https://docs.tigergraph.com/gsql-ref/current/ddl-and-loading/modifying-a-gra See https://docs.tigergraph.com/graph-ml/current/using-an-algorithm/#_packaged_template_queries[this] for more details. for more details. Note that currently not every algorithm supports template query. More will be added in the future. Default: False. +* `distributed_query (bool, optional)`: Whether to run the query in distributed mode. Defaults to False. [discrete] ==== Returns: diff --git a/modules/object_oriented_schema/pages/schema-def.adoc b/modules/object_oriented_schema/pages/schema-def.adoc index 078d505..4d00f2c 100644 --- a/modules/object_oriented_schema/pages/schema-def.adoc +++ b/modules/object_oriented_schema/pages/schema-def.adoc @@ -4,7 +4,7 @@ The Object-Oriented Schema functionality allows users to manipulate schema eleme To add an AccountHolder vertex and a HOLDS_ACCOUNT edge to the Ethereum dataset, simply: -```py +``` from pyTigerGraph import TigerGraphConnection from pyTigerGraph.schema import Graph, Vertex, Edge @@ -44,13 +44,13 @@ g.add_edge_type(HOLDS_ACCOUNT) g.commit_changes() ``` -One could also define the entire graph schema using the approach. For example, for the Cora dataset, the schema would look something like this: +Users can define an entire graph schema in the approach below. Using the Cora dataset example, the schema would look something like this: -```py +``` from pyTigerGraph import TigerGraphConnection from pyTigerGraph.schema import Graph, Vertex, Edge -conn = TigerGraphConnection("http://YOUR_HOSTNAME_HERE", graphname="Cora") +conn = TigerGraphConnection("http://YOUR_HOSTNAME_HERE") g = Graph() @@ -85,7 +85,8 @@ When defining new vertex types, make sure to include the `primary_id` and `prima For example, to define an AccountHolder vertex type, use: -```py +[source,indent=0] +---- @dataclass class AccountHolder(Vertex): name: str @@ -96,7 +97,7 @@ class AccountHolder(Vertex): some_double: "DOUBLE" primary_id: str = "name" primary_id_as_attribute: bool = True -``` +---- @@ -139,7 +140,8 @@ When defining new vertex types, make sure to include the required `from_vertex`, For example, to define an HOLDS_ACCOUNT edge type, use: -```py +[source,indent=0] +---- @dataclass class HOLDS_ACCOUNT(Edge): opened_on: datetime @@ -148,7 +150,7 @@ class HOLDS_ACCOUNT(Edge): is_directed: bool = True reverse_edge: str = "ACCOUNT_HELD_BY" discriminator: str = "opened_on" -``` +---- @@ -188,11 +190,12 @@ Serves as the way to collect the definitions of Vertex and Edge types. To instantiate the graph object with a connection to an existing graph, use: -```py +[source,indent=0] +---- from pyTigerGraph.schema import Graph g = Graph(conn) -``` +---- From c09099d0db5297a8359d70b47c025d04ce8de669 Mon Sep 17 00:00:00 2001 From: Parker Erickson Date: Fri, 22 Sep 2023 13:27:21 -0500 Subject: [PATCH 07/16] update(release notes): update release date to 9/25 --- modules/release-notes/pages/index.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/release-notes/pages/index.adoc b/modules/release-notes/pages/index.adoc index 8c3687b..f0fc0a4 100644 --- a/modules/release-notes/pages/index.adoc +++ b/modules/release-notes/pages/index.adoc @@ -1,6 +1,6 @@ = Release Notes -== [1.5] - 2023-09-20 +== [1.5] - 2023-09-25 Release of pyTigerGraph version 1.5. From 4d735bcec1f44a172e2833386ee84e6fc21daa85 Mon Sep 17 00:00:00 2001 From: Joseph Newman Date: Thu, 11 Jan 2024 10:03:37 -0800 Subject: [PATCH 08/16] adding index update --- modules/intro/pages/index.adoc | 86 +++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 23 deletions(-) diff --git a/modules/intro/pages/index.adoc b/modules/intro/pages/index.adoc index 972e48c..ba76011 100644 --- a/modules/intro/pages/index.adoc +++ b/modules/intro/pages/index.adoc @@ -2,15 +2,76 @@ :description: Overview of pyTigerGraph. pyTigerGraph is a Python package for connecting to TigerGraph databases. + +*Already familiar with pyTigerGraph?* Join the xref:_pytigergraph_community[], else, get to know pyTigerGraph below. + +== Get to Know pyTigerGraph +[.home-card,cols="2,2",grid=none,frame=none] +|=== +a| +*Getting Started* + +Checkout the xref:pytigergraph:getting-started:index.adoc[] section for a quick introduction to pyTigerGraph. +Or go hands on with our xref:pytigergraph:getting-started:101.adoc[] that walks you through all core functions of pyTigergraph: + + +a| +*Core Functions* + +xref:pytigergraph:core-functions:index.adoc[] +allow you to use the core features of the TigerGraph database through pyTigerGraph. + +a| +*GDS Functions* + +Graph Data Science xref:pytigergraph:gds:index.adoc[(GDS) Functions] perform machine learning tasks. + +a| +*Datasets* + +xref:pytigergraph:datasets:datasets.adoc[] ingest stock datasets into a TigerGraph database. +a| +*Visualizations* + +Use xref:visualization:visualization.adoc[] to visualize graphs. + +a| +*Object-Oriented Schema* + +The xref:object_oriented_schema:schema-def.adoc[] functionality allows users to manipulate schema elements in the database in an object-oriented approach in Python. + +a| +*Contributing* + +Checkout the xref:pytigergraph:contributing:index.adoc[] section for instructions on how to contribute. + + +a| +*Release Notes* + +See xref:pytigergraph:release-notes:index.adoc[] +for the most up-to-date news on pyTigerGraph. + +a| +|=== + +== pyTigerGraph Community +There are many community resources that you can use for help and support using pyTigerGraph: + +* https://dev.tigergraph.com/forum/[TigerGraph Community Forum] +* https://discord.gg/XM7Cn9w[TigerGraph Community Discord] +* https://github.com/tigergraph/pyTigerGraph/issues[pyTigerGraph GitHub Issues] + +== pyTigerGraph vs. pyTigerGraph[gds] We offer two versions of the package: _pyTigerGraph_ and _pyTigerGraph[gds]_. _pyTigerGraph_ is the default version and contains the core functionality of pyTigerGraph, including the following: * Data manipulation functions:inserting, updating, upserting, deleting, and retrieving vertices and edges. * Query functions: running and managing xref:gsql-ref:querying:query-operations.adoc[queries] inside the TigerGraph - database +database * Metadata functions: fetching details of graphs/schemas, vertex and edge types, and other - schema objects and object types +schema objects and object types * Authentication and authorization functions * Miscellaneous utility functions @@ -21,24 +82,3 @@ This includes: * Graph feature engineering using algorithms from the xref:graph-ml:intro:[GSQL Graph Data Science Library]. * Data loaders for training and inference of Graph Neural Network (GNN) models using PyTorch Geometric and DGL. * Machine learning utilities for splitting vertices into training, validation, and testing sets. - -== Getting Started -Checkout the xref:getting-started:index.adoc[Getting Started] section for a quick introduction to pyTigerGraph. -It walks you through how to perform the following: - -* xref:getting-started:install.adoc[] -* xref:getting-started:connection.adoc[] - -In addition, we also provide a video tutorial and a Google Colab notebook that walks you through all core functions of pyTigergraph: - -* xref:getting-started:101.adoc[] - -== pyTigerGraph Community -There are many community resources that you can use for help and support using pyTigerGraph: - -* https://dev.tigergraph.com/forum/[TigerGraph Community Forum] -* https://discord.gg/XM7Cn9w[TigerGraph Community Discord] -* https://github.com/tigergraph/pyTigerGraph/issues[pyTigerGraph GitHub Issues] - -== Contributing -Checkout the xref:contributing:index.adoc[Contributing] section for instructions on how to contribute. pyTigerGraph was started as an open-source community project, and we welcome contributions from the community. \ No newline at end of file From 16b2dfe4046f606d24c533151782527ddc567b7d Mon Sep 17 00:00:00 2001 From: Joseph Newman Date: Tue, 23 Jan 2024 12:25:33 -0800 Subject: [PATCH 09/16] update --- modules/intro/images/TG_Icon_Library-107.png | Bin 0 -> 3066 bytes modules/intro/images/TG_Icon_Library-216.png | Bin 0 -> 4219 bytes modules/intro/images/TG_Icon_Library-26.png | Bin 0 -> 2114 bytes modules/intro/images/TG_Icon_Library-86.png | Bin 0 -> 1454 bytes modules/intro/images/TG_Icon_Library-90.png | Bin 0 -> 1444 bytes .../images/datasciance_machinelearning.png | Bin 0 -> 3556 bytes .../intro/images/documentation-homecard.png | Bin 0 -> 3599 bytes modules/intro/images/getstarted-homecard.png | Bin 0 -> 3438 bytes modules/intro/pages/index.adoc | 29 ++++++++++++------ 9 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 modules/intro/images/TG_Icon_Library-107.png create mode 100644 modules/intro/images/TG_Icon_Library-216.png create mode 100644 modules/intro/images/TG_Icon_Library-26.png create mode 100644 modules/intro/images/TG_Icon_Library-86.png create mode 100644 modules/intro/images/TG_Icon_Library-90.png create mode 100644 modules/intro/images/datasciance_machinelearning.png create mode 100644 modules/intro/images/documentation-homecard.png create mode 100644 modules/intro/images/getstarted-homecard.png diff --git a/modules/intro/images/TG_Icon_Library-107.png b/modules/intro/images/TG_Icon_Library-107.png new file mode 100644 index 0000000000000000000000000000000000000000..bc34eb36c830e8419d2f396fc7d775910f1540b0 GIT binary patch literal 3066 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 literal 0 HcmV?d00001 diff --git a/modules/intro/images/TG_Icon_Library-86.png b/modules/intro/images/TG_Icon_Library-86.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8a4da63ec9d6c0191b77cbc54e8a3e88542d73 GIT binary patch literal 1454 zcmb7^c~H^`6vuy3c&26=nt7IZ>!`IJS$PZS<_aE(k$IGEd1MN1TB0Hvl&Oj0k)#%R zRM=%W>lL0P=%!dYiU(@uQ6A~47;Y~8wL3dIv$Hdw@B9Au-kbTpd1P-dn7pjIEC2xV z2)HXs>=(aFT2fr?2=d3oCKC%s#{+<>(sxO4^w%5!033{Pb@IJhx=1?}!*^F<@3^1_ zZ_v781~^W)gaAsJ3kNup!=|=N0+QX8K_CU!NF;uG(&Ix*wSsEa=KD7Pa|m6cK~`_Unv#( z-#A7>FbGFU5TG+yU~l_ma4NenMZxaCuS+IKS0&(>plT~?AdwR^uv#g`;Ol=1+%Fs3;Vrb z7AoG;hGq^j3y9=dTg)$$F!pJ>WpczN1l95N@9RC?*zCfYW=c5bzA&Qh$?jBDD<}n<-45Pcvt6 zJYLAkb~1`v)|#8o)s|tWIMp^mQs=@yIZ#_Um5qJ`s1l2Wtx_qyG<9Ig)7(ZTtj1`>*Hs(J{7Yg;zx>Ls8ZNVocUFoS-PzZ+(22H9xgDOp!=AFRBM6-}-Ym1#Qqz{#gjcPmF`Ss>@7tJ zR&8e46Gp#tV>r8c)jIP&F;5*b+R7dt`mhyfbUcCSGgQ2t*lfH^!-zVY{84pmLA@Ix z*eYIp560jxMwvoj=YW=Q-zjKJWMa_kEuC`@A`5KMz%?E))O&Rg|YI zX4B975LjjN+LBf6HVty#Gb9NBv^9Q6fsI^o0sv4T%JtB()Z5GDBMEbX@a&996+MR> za;ZO0>k(@ zz{86McWJt~{hj3x zpjFVLMOn&z3b&`m{erOSmC?s*BZ+LFGw)!7onu2?dF#X6p$G}a7z{WDUXTVG)f_9p zpNyw&gFr8K%V%uV9KIN2XIKqLbK5>m7Z?H^I8d$|uPL!W&VEn-Y5tz2f{&egq+py& zwZRLnTo#>CNYx2)SfC^r1k}V04drHChhe}HJxXGu#`YZQ(d`# zKqLQ}Cd$myoM+UC`082IPaZ?~V!9->ZZZwg43iCxU6*@poPd*KdR=QGiQCHkDLPIq z&uP|HgHo9__hpvUzPCR{Gg|0HOYTuplM#@a)9P4?t4bf3(Q-;$s6z9FZN}6FI{QxT z$7?YF-INwSrbrD-Lun!%Is^}DS+aBF4>$ziZSW5y?z$ulU^2gWzZZ=A9VTk7#1>j> zt!Cv<)xDoAr-Uz$5yUwC@CEKToTwirf^e$5F+u*qWOT}&xMNRf_8o#VJ|*UCySZ6s znDbnM34a22>%gdLxYVR4{Jdi9I#R*8OQN?cie?OQtdCDptv^AEXNNy3L&_?<9#aIv0{WrmTWy*9OY9XJcK@K@9QD4^ z7?dL?Y7+5o6A`npNYd@los&Xmq>rW ziu<2m#kZGAIEu%96|PNQoKB+(=7%0sj=L6chYvR}OY7vG|FiVOEN) zO>CZ)IBM3ae%RvXu)adD=D*=t`te{kXLr%}4OS>?@@`3|DJh`GJgTAk6;+fP__~LB3#Z}t~);sE@ zMN>l`AFWbP?cl3xupdl#!K#M>y z%xKL7v?mPtfGRCt{2T~BtRN*Dk2JKrQu^cy)0tRVIZLWUW&Zv`PMXx{=n z!NUUDUO~tT+Ke1FuAp@V;4rf|!C}8aT_RqppbAj2pTBcF2?$jsx9;DT~oh;#raw+e0v>F*N2 z`_=thsJ^t__|#TEX*=&b0MgF@K(~QrR}e%C0fblgZ*c={9vrPA(ste-0!Tki5Ty(& z00Dqmn+bMuB9Ryy0dR2~!l-V)?YuvLcnCTVZh@Wt2y6ChVW;C90M{kAw1!wmBhq%>??L?N zhmuQQ0n8xu#K9g8O%@kI{}mBz1;9Bap^ic%G6({wb-@K;!`7fdoA{7wmv5MuE__hV%zc>&P?=;FV>x`q=pdA+?I6I(I zOKKxD9n&dM+i=*<`yPNNcDl0uNqk$@UKW$iIPyx`a3D;7m6N&v;F=J;2;^!E0pJks zL@gpIthfz?hrTpzFY)aFZ!HUON?I5Hk52a_a?M<^;A4w)Dn zhg*?ABj^zb03PUi-bU&?>!53JZRvP2|KBv&E`W+eBKDpk@2Ear-M`H$j>VIl`wrj{ zVs`3W?@7kAp?3a(h;U?aLwc(&UfJ=N?Yy6xL{(8q+->Lm8S2eJd@H#o#=ag}bjFdB`Mw8XfMokxW0$QpGE7oXgkp*O1o>P=s&E){5(P^+ zffgnNN_^X)2l@;lDmZ~&xdql4M^gx{$iiXA+)xNu8}G<-;5EeW`34{&!^H@c)g4N{ z3MA)@VML@%z%+{u=*v&#R%K zAp7BK>UlZz=8x#QWm98~~%Z|H{8#&rAi8%0%HV}z2 zEzl3#lAe` zjU2CHTiW7|caRooXn}MQ=ek&OT@UIkuC{TafUD6i|4mln+pg&ZAsx-zdZ?TgvpWD5De4@^kKxX2pwVX` zh{(KMk6rUlVWiIh{zg6~2N>vLGOTzT#=5mIb|{ZDu|Ik4$`XJi;%3u|2Iixl=(@V>Oon9 z#>p3>&Bexg2rLzCw2FnA}_> z?s!AIBNbwHT&lx3I^)QrRE8xPQyra@;vFJ)q&uPb%s0&uh3xoxJMZ^&^^($X*v|VO z@iT&U=R7sL(2!94 z`B}O*syK;vt_szBfNBtACB}e=7=*fmY8hmb0T7bLgiwtWiO>47Fp!0Okq96Z``@Y> zxpM$bt^q`1k`wC&`ax6v3@zO;sH{6aJIX|zCpni>t~Bc$It*(%xCeo3jO6EyNSx2G zudhdmZ%;LTOU#bT*6e;jH=k5C03H#TNC@OW5c>yx;zOjz>wt`&7`rhp$+`pZ5&z>l zsw+8{L!EshY8UJ)9<(e78DM|*bOHQKe7jEfPl<0ULq8H%z!cXIoMWXYsQ%&w`xDba z!&R$U9AX2g1!sMljoR$pGF)f5iNM1=)*%OQ*`-SlC)J&YAX3gBq8yQ|Z0a1amIR0$ zc6?AGHnE6|TYlZdw?|YKoP~@1Y^`yr)}g~fl#-aTF%H=^J>=8ip-DfcsLe^Fe|YxM z<8qw*4GSVOn`UQ&y8Sl^8jpqjF@8+KOu;{osFbE~sGz43RGh@w*C}adiv3coE`VQ& zZ%+UOskk75hQ^~jB4lGE;tV1DL2dx))?aWnAd6y1q2eT?P&{$Tcga^z5Gxg2llIyK zk_a(G3Y`M32$scSSi>{#2_kP=B2 z@z$xnq!^tl(H83ts%3~J=N144hU;xDc3hj2fPCazE7hP#?tMSwItNd3E~xN(`18{y zQjrPHGqVmftQg61kqr!s)kzP`P#&eI6BgQAs;NR}9EFlFkX3eH7G&8~N}>YAoD{NS zN3+e`jHwXqmK9evjavgf$tS1oeX8p>CIMFyBHd`(`c0(Ctp?g?6C8FNn%t};5>c9m za&+p&Vs<<@Aoq{?bF@+o8^i1mZf2oo_f(J3>C}aSO4==Qj~d^?;@**^i+Ls8EKlBK(#e z2d&o)$SV8=c`do8YY1gGhRPt&AGLr^fR#5|8U~>s;Xoaqx`o;-mvLLS!b&?1SL6H; z#rqq*NTT~i7$P672n_BAP>o2}It!u58+V}2BjrRG`B88kw-xcDcJ6=@XgI0@3)Hq*D>KP`o zWDnWpCy1bT$n03s8Ao;XQ7V21nRfp{CW=i~rKd6GQqX=vRhF?zVUj){L0CK~uIZds z=bdr1OniHV{TS90<(fR~M9q?XtS|E<_fDiv?KqX~EG^FG+uNumtG8X{`>2os2 zxo&!r755iFW*Me?CH$mMeCP-TZ6o?K^ZAPW%&#h9vo#VaswM^jnAbSS{GUMg=7J1v z7F|@_??4Bn2g|k*T~!$a>1o+!jkWZt5s}Dz^w{YeTBWW9%HTetILEKzPFJ@dKv`W| z#`z1FWn2O5z272>HEQnA1yraOqL+YhBjRfXYcEyevdt}qJR(64oQotrLpkAPW0IX) zL5T9Z&NwnA5MhKGdjS@q>K?2X@_UZf*=o86VL0&iMs(gqUPNsmO0GU0f?~_+6~qjW zA%91b@zP2eBzs;M?@6mdrMf$Ea9wt~3-Jyj zv_^d=IotONV)9IyA`no2^L7vN-Sw+-6i?Z!u>10ssU?M|fo3|etwJKO?&rxoc zSLP^)Sf6Y^pDbQckiI6-Rc4s1aV7);8hXii!=}+xE?_s;z@CIv3>Lx)VC2dnOqbT zXAKdH3y(9Z9S-_h?KUG*ZZ(8@!}t^@eZyxfi9{y*0K1n@g-uvg6a{hUQ$`p-L{loi zW1=avPTUo|@i~2C*b<@^I~&PZUfsXF6A{v^ZV!Uc>0j+lfPVq7_^nzSIQ75)00008(zbqpJX z8kj@j&fx$6Kj(h{ev&&dppttLP$OjYiyb#T+~OzBi`6h=xsJyHW}qi_j_HtIV@dAY z`CliE<)e|r9N(&Fz`;wyd2Zd{0h@Wy$&OeLy;_T4mm8z!WyWbDyO4UJU}%$!>;ro+ zv%x|C>4cu%lHO~_?;p|q%xRh5cRFb03-3v7GKKyhApb^3m00jhlSO(s0B3o+iyCr0FpLDqsT(d8Sq7%_zR6Z&(TKN#Q;`&T35?{fgb)ezg>yp zPYcJbIwCTNL5&Qu<>#VQM}uSen6k^=1M1Hb3$uH6t3w%8{mUcu(1Id#2z;M8BHh!$ zPFCzJFMgQxfrbo<+Y3*?$sgWfB~IDwu^7^LK45|kxx<5OyzY`+#D-BqepNU!orLEe zl*6Y>Yv!EJi}TA7f`H9kE$O@O1T3UINniRq@oF`^IOI&3%Q~mz!P(H?T+;)ahSA$Ifaa4FwcoqYabbj`WKN_Qj)2(jO z;ZQwCJZKD*H_d-!pMYaLyt%qfQB2Y-`5sCy>Bi{ovkk?W@fH}tu{ZZ_vnF#Gv$TUX z%x{|Ls3r;&z+g{(uIJ9=vxEcDJKfETuc|!u6PGFSF{>`!WnD~hnrd|jaK#EMMR}G1 z#w+LjMu4uW<_19E7`BBZjq26l;y^^P9s_*bUi=qfcGwX2fZ4{_aFZ0m``TucvAv5> zcg+~e=8G>Uo$81865E*s3z9VkENM;6*a{3TiBuoGfFun+_R>@fsz|tX!esvhtdN{j zP+r~Rrz-HTv#lkh8%ifpp5R}FyYFDxzacAk?+ncxSRjB=m`#gd;FKGQygOYWlmEQs zDC!EbaLbheEMxXsnkn6o~#!xC$ z73E0(x|dpm8oJ8sfEF4%fG@exV$Q0rUF*R9y~RYxmxl4jf!aRDYVDl&L0*Q72jTcfP$OHM^Yw19Rbk}j@ZcsJ69LyUHkMqjKNEP9m@B&XF&?)HXD;C)uR{xg;5bT z7e7%fA(AH!?A*;H^e+eK5#Z@8fAoTx_t$+BxJV2#Yt@=6i5W+Uh@-o=WgfGi)eNTmrDNzX-FPgS9Byp z-tFYJ9dR1h>jO`861$s^L#PHIYp{HaiBg*!0n7DUK7jD&2jorVH*YC263%uxBrfzLff2K{fY*OVp5ui^rTZ+q88pMCqriz(_%34l&78z5T9DCK>RB8 zLR~ufxb{u_Bh8N;*GZeUoW@_L*&^0eJSxT@I)DsHSv~$@ehdP^sR~&8}fm?OJCNvK_8@2@*k5I{xmtW z4sisRnE^ie0@)&iIJbXGpP$ku8b%^cVYd*EZL*cS6q92$RyurgK2@EN?+_eoe1jH$Ozk9U7Co5}vStbFQ+!m&z@OV7 zu1XRgFmpb4I$UQkL>W1-c4U+ZGqt>UfMxH<(J-^;MTW6xVtcvH5c9ByUyqW)^%)@P-&Dsr}tIyXqF`*g+jRokv z8xF1oy~BxHt#B8&qxwWsge=+68D38>C;&<4Ov+{x2w?)~ZdqKsW9zA7n3T!#`b_HV z_4B%`d@}hXHt+h})vuV_xN!kU+fuv^96>7A4)rh+qZJ>UYiT3rIy+=*JaRS59dEvM zjfXW^RMb`375Tu=;00A*B&k&eDO=|hnQnXD3P1;V7uwg_=@T1t&ebB9HY%@Hcp)wO z1;?bjjVw>*nm~==ftEab!O%l<*&KR6L=)ziZyy7wt@eZ5hr9AeIH#`CRkBmERM_&xkKb zZMV&z5=`;GXy$w5p4pb$+MQwuK~~LTw!X~u)hLZyp>u!+Eo`qSbibme(Zn=nJ#$tk z7e6BP0VB{Pxy=;ziSa4kE)`r^!nc(KQ7&VUy3ODT^T{qfE^wt8*2Ef>6gEa1B=Hr8 ziI3!lSGhqy^b&q1^G~Zt@Iq4N+w0DZ!1lu?jb^m&s>hS~i$55WF!wNmW0W<4@`ChNV{`4O5Wj@=nMW#^j z9*8deE!`6EM8-nuu2`+J`Qw%wL%r7$J+!b!u<#6S4cl1h+M738R{NDMbUb9L8RSq2 zT3+xr2Ay9V@$YEhq%AKI&zR$6Lwl$=GKVMQa>S~Td% zPGL|Djx@7TC_%64MN6kc4tj#MVh3+DIfYb_wB&wF6Q0vy>aqhg)t0ZGHBr6io0Iu` z+dCh`_cX5kEHfQ~ze@<7%{O!81nOX3e9!Jf6S2aNoGY6Q@CQVYj5({x8wuw<4#|ETeGsWHgJmXWwyjt0zxFZbVb$>Q@^ zs<|t_`*t;aQ=@l)YCCGx?oTh@uFZR=f&LZdnw6mhXR+~^8}^@~573`pQ74J*@5Gw? zKwmEX93Bqu`j9L!3f6X-vGxP%T5wKG#ze8$M}U3}R=>cD=uUy)N)n?@o%^c_X+H7P zB|n4$t0#C7SGLt)_9t4228g+uAJ@}3xZB4(D?PF1SfBX!JA%sA5d$iCt>4CuGS#k7 zxov8)+Zd&=8dQ%7|*){&FNZC6u| zPSK(Y=-!Zuw)CuH(-;=@$kHxfZXT794n>O2;lkM_xGB!q}r z_(aBJAw{#Y@LUfUf&9!O2SgT%m(^F-v#JOK>i;m5W!Gzp(ex)u2v2_pPOTLv!4B1HItE4wT>$;o-hvfiD;UY`C~ z<`;0(<>J4>GrvtFn6z{6^PH5jrg;yh%xKL7v?AW1|)RCt{2UB8dp$QAx<=Wh3i>}fBC1Hp|cq%qQX{THlUtFVkz zsg~QOiQJ_TOhZ+wlZ({WRw+-5K()Dl!D&0E2q+;ypeD#F4rt%`SBiO*xWjqFAw`Ph zojyRY$sNuN=bL%&&6~%W8=pUa#tzlS&9W=7Lo#+G)c`w^YJeR{HNY>*u7HeS&}v66 z4*?tjn9(o9)av_J+pAT%xKWmM7Ytg50NM~Fg#R{DW^(~xN$iEb9g(MPTJphjjFKmrV07C%dx{Jm_NeTun2Y?IU-UiuR zAe$%*v4kLNSXZ(NA&ExL5WoY2aR0PcdI8~DS2Kw^U>ieUuRVW2AkwgS}Q1{GCqlfa0T5X3+ zQV+ltglou4QwEjeK!{&e-785{YLXHNO7)UtY=pn8^PqDGgT#2!O7Ad+T31z$s8l3r zbkGt)0egmd^yrtB7!GGJv>p@m>7y!%>a-+Hp(ZF%@fJ*ujB^N)J2R-0hm7yEEf|x; znAxTTCC#CtxP(}iP~~aU&(t~l-0J&oLftr`E+O8nbXSrQNz};SDgLAt3)BEZ04JL4 z!%6Pg>igrw%B=GaT|y4@ZlOyEOOx$L8lujuzVDdUsVF3pL@zKyd=zLEEG z!k5P8VG1Iw2fi~bA&6o-fyN+ulBV+%0TYtOh|evwJuJZj%#9pHxi*AY<-}o9$5Kg* zB>=ljv8Ro3AaAxz&>W)Ia?j`pdI8|5C==J}`!lQWw*fqXXj~aDX`aMAKc+fH(SYz) zlm_icVyrn<4^dB^B2G}ExXBv{;+7pzB;Kcp&!Jjn`S@6psK>pOZnI)8Z*!JLiG_Y#ilc{=MbG?WJ(&N zSLYC-mwO*iQIAqalTs&9Pm+f_yVO7mHxog@pw*@Z@c}$T@*LSA+T<q-|FejNJAA$g(2ft6S+^!%TxiZp>rUsKop-_oCM{!U2A`yRF6mw|ALc~PpR!h$T zJO%L3>iajsAAlBwX?+H@c?~3+*d9F}#RKjcNzUKVZ6+t$kPTt7t-k(7s5!1;-SVQ??Eg?dS$FN$>Of9NaLv$yhM$zpM-nZ>uE zHqmp5)S*e{xpey;n1&~DEE8*QT92ZTG?H|4967Dd<>M;u+7hOt{D6Kp}JgeJ>ca9zk?APrEKQY1&xF zVubJjjI7RLwo%0mAd@6pN*?oETXBy|tD0B1T!my%1KHuV)md=m!0P)WA}ZQ}957P| zB8JV6%6Aa=VFIG#Jqsqy=T>Lo>hjnWD{)8Wu?%hkYfIOcn#rzA(z%J43ntBWFll-a z?xI)WFPJp1f=ScWJSr1n63oxl!GW5fD4qqA<|u0!CWwxtnC#XV4KkrKO&PMN^O7o+ z&^Qf}mvaWT(1c|#9;8*!an7*R!k*lf!; z3=9T0Mg9+bfKMCC=2 zt-8rrhb&1}XQ4{plN;WYC=zS0z$}YsL>ZTVDMTfOblJ?GJn5QC2gH}H+qyCl_rWPg zND@*1``g_=AVKdWh%zq!trN8(iLttD<~do6>EaUPe7hQd8lbkyQW5pz)&7HEZvExc zr+6Ry>hAl$@7?}@U)t|XM42*wFe}PM5tStFIMEanOB!7x`}7*nEei;dXRLGNhJ62K z4{sM=;NuTB5X>z^h&l)G@bLGu`}=p^p5EGjFXx|@D6akvawbY9=|Z|zHas)x98Fr4 zciQGEmDV_jrvLbE{Ynv{{%Um=-B9Oc5M^9?uKo^kBuXYp9w9nQOx7K`01a2VZa}}Z zu@O;G+}itun>RoGHib@OiLyG28{tn^cS`RdC!&%_dZ6j?awFf9wn1BgTr;u(@qhv< zS!5yVi-Qk;-n;z)d$&Je|JUzBy_44XI0+_AT@;ZK@*+wm$y20hGta6<0;_8v#GxGJ za}o?%p3aa+OVq*d{`sfP_fk6c+fyb`pA7?}XB;FuIG0%KNDmZ? zu5pfvZ(ODIrL^gb2Kf%Jg)Up2h1NM78%ZRVWRd4+@^Dr6bUr#7QI8Ne&7){Qyv#8~ zjNA|?enf2na_4OXlcvrxW+$_9M)x$KxHH6;5E{_Oy@m6qBYKt#8;-(WJ)194BZIPY zgVkA#5r5yd?ir3GRYopbun>hY6B~fua_jq7^sEgL|1IYcg?H`Q{D|82NCM)Paa)&I z_Ys+kcqpz;HyuG8=bdUlgvid2M_4x?y9}O#j=Hcqi?&JK@&Z%mZ#ey^Bk2(F?|GIG zVZk%znJ(1(JrugHTn3`LSkHrIG|ILHGP`~0_9<77qz{{Wh)2v^&==m^GY-@ZR_Mpg zRkPxfKns!4buM;9YrWuPM$3BQn8@Rv8G)Y*eHRQ`W1Vv~D=KKkB|+}2$DFIkWU~#` zya~{JDnidW;P;gaxBMLCEduK@q8O0}NKr|E`QAb<;zmT`_oE5>%B?Del=})Lp+-ch z)CnLFm1dW&DKhM2MFxlqek0u|ExO+5H*5&rT0-7_nw9%m9+;Ln%K0A z;Ue1^71=iIs5en7l8mE;h=exclib8fD?RU#Rd|Z{3UCq{(0?VaF0&@agvLt_Aln|S z4*1~0u4!+N#A|n9c9wu$yla-0iAHW&;W z+ITM@5@{~7A6mlB^s9nR_62vqFEO#G#Mid*JyGObxzH7@*lpvshlgJ|b{>W}56~fOO zJ&3a>5=kR7_1dnECc%nzMqy|Ak*C{5`t8!@Si6L#5c=gR3~W)61mIyEbW2tgemW+R z)q|M0ZgTv=bF1&WjJR7;88f<`R(!M!R=?^TAREFk^V1Mfi18*_+FpWH2!wL+~)Qh|sI!@)wwt&Po2jh3<1 z^{Ag5NgPOzMZN8t`u(;>)X#<_6-ci|b>Sh>jk>K6^|K}^4KzU`g%h zLRCjuF%vtIQlbo^b|huMwu#!2lo1I;v9a=5up?;$6#dnDh#g5AVjD#5Oz@mQ6XW%l zi8*fSz9Xpy*onIuU`J97up_Ak*pXBN>`1Bsb|lpRJCbUE9Z5C7j-(pk|F;f30pMd@ Q=>Px#07*qoM6N<$g4AtJQ2+n{ literal 0 HcmV?d00001 diff --git a/modules/intro/pages/index.adoc b/modules/intro/pages/index.adoc index ba76011..548b02f 100644 --- a/modules/intro/pages/index.adoc +++ b/modules/intro/pages/index.adoc @@ -9,47 +9,56 @@ pyTigerGraph is a Python package for connecting to TigerGraph databases. [.home-card,cols="2,2",grid=none,frame=none] |=== a| -*Getting Started* +image:getstarted-homecard.png[alt=admin,width=74,height=74] +*Get Started* -Checkout the xref:pytigergraph:getting-started:index.adoc[] section for a quick introduction to pyTigerGraph. -Or go hands on with our xref:pytigergraph:getting-started:101.adoc[] that walks you through all core functions of pyTigergraph: +Step-by-step guides to help you get up and running. +xref:pytigergraph:getting-started:index.adoc[Get Started ↗] +xref:pytigergraph:getting-started:101.adoc[pyTiger 101 ↗] a| +image:datasciance_machinelearning.png[alt=admin,width=74,height=74] *Core Functions* -xref:pytigergraph:core-functions:index.adoc[] +xref:pytigergraph:core-functions:index.adoc[Core Functions ↗] allow you to use the core features of the TigerGraph database through pyTigerGraph. a| +image:TG_Icon_Library-216.png[alt=admin,width=74,height=74] *GDS Functions* -Graph Data Science xref:pytigergraph:gds:index.adoc[(GDS) Functions] perform machine learning tasks. +Graph Data Science xref:pytigergraph:gds:index.adoc[(GDS) Functions ↗] perform machine learning tasks. a| +image:TG_Icon_Library-90.png[alt=admin,width=74,height=74] *Datasets* -xref:pytigergraph:datasets:datasets.adoc[] ingest stock datasets into a TigerGraph database. +xref:pytigergraph:datasets:datasets.adoc[Data Ingestion Functions ↗] ingest stock datasets into a TigerGraph database. a| +image:TG_Icon_Library-86.png[alt=admin,width=74,height=74] *Visualizations* -Use xref:visualization:visualization.adoc[] to visualize graphs. +Use xref:visualization:visualization.adoc[Visualizations ↗] to visualize graphs. a| +image:TG_Icon_Library-26.png[alt=admin,width=74,height=74] *Object-Oriented Schema* -The xref:object_oriented_schema:schema-def.adoc[] functionality allows users to manipulate schema elements in the database in an object-oriented approach in Python. +The xref:object_oriented_schema:schema-def.adoc[Object-Oriented Schema ↗] functionality allows users to manipulate schema elements in the database in an object-oriented approach in Python. a| +image:TG_Icon_Library-107.png[alt=admin,width=74,height=74] *Contributing* -Checkout the xref:pytigergraph:contributing:index.adoc[] section for instructions on how to contribute. +Checkout the xref:pytigergraph:contributing:index.adoc[Contributing ↗] section for instructions on how to contribute. a| +image:documentation-homecard.png[alt=admin,width=74,height=74] *Release Notes* -See xref:pytigergraph:release-notes:index.adoc[] +See xref:pytigergraph:release-notes:index.adoc[Release Notes ↗] for the most up-to-date news on pyTigerGraph. a| From e2cbc4a750dc4c07bda307a20307e31eb8ba8691 Mon Sep 17 00:00:00 2001 From: Joseph Newman Date: Thu, 25 Jan 2024 14:37:58 -0800 Subject: [PATCH 10/16] updating --- modules/intro/images/lang2.png | Bin 0 -> 1033 bytes modules/intro/pages/index.adoc | 40 ++++++++++++++++----------------- 2 files changed, 20 insertions(+), 20 deletions(-) create mode 100644 modules/intro/images/lang2.png diff --git a/modules/intro/images/lang2.png b/modules/intro/images/lang2.png new file mode 100644 index 0000000000000000000000000000000000000000..a811ef56f05dc327a86b0a0a067024f066648498 GIT binary patch literal 1033 zcmeAS@N?(olHy`uVBq!ia0vp^nIO!;1|%(;c&&gGXMsm#F$06RAP6&_Qu}Prz`(rQ z)5S5QV$R#Sj(L|IMB3`z6|}rNx|ki#vc6#3c9yq6_30Jav7Kq`kd$+_Y4IyJ=U-7#2x+ zDmhHzn4rR>(%B%rj?L?_0*k@P|2AJ1r@YF_DYFsx{$Rpa##rRSoD+90|E!~PA|NX6c?JaY%)s%+k?d0jyF_#n{DmA`mW`s z`;_k$nqsVX`-H~J>f4Ma2lnJBC-0Je{OVDn{0wFbooeQ}D)wII0w&7+VgriHOmb;Z z5mfMG@epE!F)z$L^X%;@cZPS{r9E~17+dP5obly5^uu>ngR=mG%mF9P?!ZfPw=v%k zc>Fr9XHws7z69r<{hlSoljKzsrPwcTd%WW0of11H4pqhmdDYF^k_$MoS>#YTZ;E*2 z_b9%{D(_>mWUM?hWzKBSirIE{wF%$6pMgb}zBu%}T*uw?FW}ad3~o2i*ev6DyCqum z?k1Mr?waY6HGCO0axa8>Ugi}bc>%_BC^wpY>|n4-{j&WBR@qiu{9v(l z0Wi$C%wyLGuki|4dw9mXn5~lUEv1$Vxp^+{JNEL-W~CRG=E|!+u8GTf75SK(!8klT z_O*jLr$n6U9K*Z3eCRQ=z{cO}aYD|9-BW)@#5$>K_BIPM`1ABXTw;4etmox9j{v`n zhZ5%!rlc%ByF>VT=c_{+nk*k~Cj9^Y!fkd@?u%zj7K(;5p3A@V0Gw8Uv3(%p;e=xc zS;D7pT)wTYP|0Rotl`H-jW}fGL{7Q7&<-524eEYk0 z!h$3pRngKbIjXB%0@8Pt-8$qEWEU=Cn^&wHsM^%mZYR$u2J)98k4q@Wsyp=@5i=)m z6IFHm`eBpK=CTc?@>OLI_kJteH2r#b7h_V6|TFzE=Wmfa!>7=w4gV0O3!I@bqSMMt{(aIDo@rv&gRF2*ouCJ1Gi7w-K+cja^vL2>IP#^ v2B7EdK70?K?&>?oOX&7O?ajzZ^AFoG!M_zEn|bwsd7Hu0)z4*}Q$iB}NCdWy literal 0 HcmV?d00001 diff --git a/modules/intro/pages/index.adoc b/modules/intro/pages/index.adoc index 548b02f..6d94c49 100644 --- a/modules/intro/pages/index.adoc +++ b/modules/intro/pages/index.adoc @@ -6,62 +6,62 @@ pyTigerGraph is a Python package for connecting to TigerGraph databases. *Already familiar with pyTigerGraph?* Join the xref:_pytigergraph_community[], else, get to know pyTigerGraph below. == Get to Know pyTigerGraph -[.home-card,cols="2,2",grid=none,frame=none] +[.home-card,cols="2,2",grid=none,frame=none, separator=¦] |=== -a| +¦ image:getstarted-homecard.png[alt=admin,width=74,height=74] *Get Started* Step-by-step guides to help you get up and running. -xref:pytigergraph:getting-started:index.adoc[Get Started ↗] -xref:pytigergraph:getting-started:101.adoc[pyTiger 101 ↗] +xref:pytigergraph:getting-started:index.adoc[Get Started |] +xref:pytigergraph:getting-started:101.adoc[pyTiger 101] -a| +¦ image:datasciance_machinelearning.png[alt=admin,width=74,height=74] *Core Functions* -xref:pytigergraph:core-functions:index.adoc[Core Functions ↗] +xref:pytigergraph:core-functions:index.adoc[Core Functions] allow you to use the core features of the TigerGraph database through pyTigerGraph. -a| +¦ image:TG_Icon_Library-216.png[alt=admin,width=74,height=74] *GDS Functions* -Graph Data Science xref:pytigergraph:gds:index.adoc[(GDS) Functions ↗] perform machine learning tasks. +Graph Data Science xref:pytigergraph:gds:index.adoc[(GDS) Functions] perform machine learning tasks. -a| +¦ image:TG_Icon_Library-90.png[alt=admin,width=74,height=74] *Datasets* -xref:pytigergraph:datasets:datasets.adoc[Data Ingestion Functions ↗] ingest stock datasets into a TigerGraph database. -a| +xref:pytigergraph:datasets:datasets.adoc[Data Ingestion Functions] ingest stock datasets into a TigerGraph database. + +¦ image:TG_Icon_Library-86.png[alt=admin,width=74,height=74] *Visualizations* -Use xref:visualization:visualization.adoc[Visualizations ↗] to visualize graphs. +Use xref:visualization:visualization.adoc[Visualizations] to visualize graphs. -a| +¦ image:TG_Icon_Library-26.png[alt=admin,width=74,height=74] *Object-Oriented Schema* -The xref:object_oriented_schema:schema-def.adoc[Object-Oriented Schema ↗] functionality allows users to manipulate schema elements in the database in an object-oriented approach in Python. +The xref:object_oriented_schema:schema-def.adoc[Object-Oriented Schema] functionality allows users to manipulate schema elements in the database in an object-oriented approach in Python. -a| +¦ image:TG_Icon_Library-107.png[alt=admin,width=74,height=74] *Contributing* -Checkout the xref:pytigergraph:contributing:index.adoc[Contributing ↗] section for instructions on how to contribute. - +Checkout the xref:pytigergraph:contributing:index.adoc[Contributing] section for instructions on how to contribute. -a| +¦ image:documentation-homecard.png[alt=admin,width=74,height=74] *Release Notes* -See xref:pytigergraph:release-notes:index.adoc[Release Notes ↗] +See xref:pytigergraph:release-notes:index.adoc[Release Notes] for the most up-to-date news on pyTigerGraph. -a| +¦ |=== == pyTigerGraph Community From 0e54ec5844d705ecb9155e81c9d907cd6dc07fb6 Mon Sep 17 00:00:00 2001 From: Joseph Newman Date: Mon, 5 Feb 2024 13:39:26 -0800 Subject: [PATCH 11/16] versions page --- modules/release-notes/nav.adoc | 3 ++- .../release-notes/pages/legacy-tg-versions.adoc | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 modules/release-notes/pages/legacy-tg-versions.adoc diff --git a/modules/release-notes/nav.adoc b/modules/release-notes/nav.adoc index b71ee0a..a323ed7 100644 --- a/modules/release-notes/nav.adoc +++ b/modules/release-notes/nav.adoc @@ -1 +1,2 @@ -* xref:index.adoc[Release Notes] \ No newline at end of file +* xref:index.adoc[Release Notes] +* xref:legacy-tg-versions.adoc[] \ No newline at end of file diff --git a/modules/release-notes/pages/legacy-tg-versions.adoc b/modules/release-notes/pages/legacy-tg-versions.adoc new file mode 100644 index 0000000..8e1a3fe --- /dev/null +++ b/modules/release-notes/pages/legacy-tg-versions.adoc @@ -0,0 +1,16 @@ += Legacy Version Documentation + +This page lists all LTS (Long-Term Support) and previous versions of pyTigerGraph. + + +== LTS Versions + +* xref:pytigergraph:intro:index.adoc[1.5] + +== Other Versions + +* xref:1.4@pytigergraph:intro:index.adoc[1.4] +* xref:1.3@pytigergraph:intro:index.adoc[1.3] +* xref:1.2@pytigergraph:intro:index.adoc[1.2] +* xref:1.1@pytigergraph:intro:index.adoc[1.1] +* xref:1.0@pytigergraph:intro:index.adoc[1.0] \ No newline at end of file From f1c76daac4ce2d8614391938cb4745dd9bcda8ad Mon Sep 17 00:00:00 2001 From: Joseph Newman Date: Mon, 5 Feb 2024 15:29:04 -0800 Subject: [PATCH 12/16] versions page --- modules/release-notes/nav.adoc | 2 +- modules/release-notes/pages/legacy-tg-versions.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/release-notes/nav.adoc b/modules/release-notes/nav.adoc index a323ed7..138b230 100644 --- a/modules/release-notes/nav.adoc +++ b/modules/release-notes/nav.adoc @@ -1,2 +1,2 @@ * xref:index.adoc[Release Notes] -* xref:legacy-tg-versions.adoc[] \ No newline at end of file +** xref:legacy-tg-versions.adoc[] \ No newline at end of file diff --git a/modules/release-notes/pages/legacy-tg-versions.adoc b/modules/release-notes/pages/legacy-tg-versions.adoc index 8e1a3fe..8c6c9d9 100644 --- a/modules/release-notes/pages/legacy-tg-versions.adoc +++ b/modules/release-notes/pages/legacy-tg-versions.adoc @@ -13,4 +13,4 @@ This page lists all LTS (Long-Term Support) and previous versions of pyTigerGrap * xref:1.3@pytigergraph:intro:index.adoc[1.3] * xref:1.2@pytigergraph:intro:index.adoc[1.2] * xref:1.1@pytigergraph:intro:index.adoc[1.1] -* xref:1.0@pytigergraph:intro:index.adoc[1.0] \ No newline at end of file +* xref:1@pytigergraph:intro:index.adoc[1.0] \ No newline at end of file From 9fa0c1000b34bae70e397ae03dabb65c18920209 Mon Sep 17 00:00:00 2001 From: Joseph Newman Date: Tue, 6 Feb 2024 10:03:29 -0800 Subject: [PATCH 13/16] updates --- modules/intro/pages/index.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/intro/pages/index.adoc b/modules/intro/pages/index.adoc index 6d94c49..d4bc4a6 100644 --- a/modules/intro/pages/index.adoc +++ b/modules/intro/pages/index.adoc @@ -50,7 +50,7 @@ The xref:object_oriented_schema:schema-def.adoc[Object-Oriented Schema] function ¦ image:TG_Icon_Library-107.png[alt=admin,width=74,height=74] -*Contributing* +*Contribute* Checkout the xref:pytigergraph:contributing:index.adoc[Contributing] section for instructions on how to contribute. From ebe1b8b8f84638b216892bdd941539bd48141aea Mon Sep 17 00:00:00 2001 From: Victor Lee Date: Sat, 13 Jul 2024 17:29:51 -0400 Subject: [PATCH 14/16] DOC-2226-fix error for incomplete table row, CoPilot --- modules/intro/pages/index.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/intro/pages/index.adoc b/modules/intro/pages/index.adoc index d4bc4a6..86eadcd 100644 --- a/modules/intro/pages/index.adoc +++ b/modules/intro/pages/index.adoc @@ -61,7 +61,6 @@ image:documentation-homecard.png[alt=admin,width=74,height=74] See xref:pytigergraph:release-notes:index.adoc[Release Notes] for the most up-to-date news on pyTigerGraph. -¦ |=== == pyTigerGraph Community From 263280abbe5b835a1743f0618af2c67fdc2fee39 Mon Sep 17 00:00:00 2001 From: Victor Lee Date: Fri, 25 Oct 2024 10:34:41 -0400 Subject: [PATCH 15/16] Update legacy-tg-versions.adoc --- .../pages/legacy-tg-versions.adoc | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/modules/release-notes/pages/legacy-tg-versions.adoc b/modules/release-notes/pages/legacy-tg-versions.adoc index 8c6c9d9..ab2a91a 100644 --- a/modules/release-notes/pages/legacy-tg-versions.adoc +++ b/modules/release-notes/pages/legacy-tg-versions.adoc @@ -1,16 +1,11 @@ = Legacy Version Documentation -This page lists all LTS (Long-Term Support) and previous versions of pyTigerGraph. +This page lists the previous versions of pyTigerGraph. +* 1.4 +* 1.3 +* 1.2 +* 1.1 +* 1.0 -== LTS Versions - -* xref:pytigergraph:intro:index.adoc[1.5] - -== Other Versions - -* xref:1.4@pytigergraph:intro:index.adoc[1.4] -* xref:1.3@pytigergraph:intro:index.adoc[1.3] -* xref:1.2@pytigergraph:intro:index.adoc[1.2] -* xref:1.1@pytigergraph:intro:index.adoc[1.1] -* xref:1@pytigergraph:intro:index.adoc[1.0] \ No newline at end of file +https://github.com/tigergraph/pyTigerGraph/tags From c068bb29ebc68031b64fa943316b82bff8eb2265 Mon Sep 17 00:00:00 2001 From: Victor Lee Date: Fri, 25 Oct 2024 19:37:44 -0400 Subject: [PATCH 16/16] remove reference to nonexistence authorization module --- antora.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/antora.yml b/antora.yml index 06d5da0..445586e 100644 --- a/antora.yml +++ b/antora.yml @@ -7,7 +7,6 @@ start_page: intro:index.adoc nav: - modules/intro/nav.adoc - modules/getting-started/nav.adoc -- modules/authentication/nav.adoc - modules/core-functions/nav.adoc - modules/gds/nav.adoc - modules/datasets/nav.adoc