• Stars
    star
    199
  • Rank 189,452 (Top 4 %)
  • Language
    Python
  • License
    Apache License 2.0
  • Created over 3 years ago
  • Updated 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

GQLAlchemy is a library developed with the purpose of assisting in writing and running queries on Memgraph. GQLAlchemy supports high-level connection to Memgraph as well as modular query builder.

GQLAlchemy

Code style: black

GQLAlchemy is a fully open-source Python library and Object Graph Mapper (OGM) - a link between graph database objects and Python objects.

An Object Graph Mapper or OGM provides a developer-friendly workflow that allows for writing object-oriented notation to communicate with graph databases. Instead of writing Cypher queries, you will be able to write object-oriented code, which the OGM will automatically translate into Cypher queries.

Installation

GQLAlchemy is built on top of Memgraph's low-level Python client pymgclient (PyPI / Documentation / GitHub).

To install GQLAlchemy, you first need to install pymgclient build prerequisites.

After you have installed the prerequisites, run the following command:

pip install gqlalchemy

With the above command, you get the basic GQLAlchemy capabilities. To add additional import/export capabilities, install GQLAlchemy with one of the following commands:

  • pip install gqlalchemy[arrow] # Support for the CSV, Parquet, ORC and IPC/Feather/Arrow formats

  • pip install gqlalchemy[dgl] # DGL support (includes PyTorch)

  • pip install gqlalchemy[all] # All of the above

If you intend to use GQLAlchemy with PyTorch Geometric support, that library must be installed manually:

pip install gqlalchemy[torch_pyg] # prerequisite
pip install torch-scatter torch-sparse torch-cluster torch-spline-conv torch-geometric -f https://data.pyg.org/whl/torch-1.13.0+cpu.html"

If you are using Conda for Python environment management, you can install GQLAlchemy through pip.

Build & Test

The project uses Poetry to build the library. Clone or download the GQLAlchemy source code locally and run the following command to build it from source with Poetry:

poetry install --all-extras

The poetry install --all-extras command installs GQLAlchemy with all extras (optional dependencies). Alternatively, you can use the -E option to define what extras to install:

poetry install # No extras

poetry install -E arrow # Support for the CSV, Parquet, ORC and IPC/Feather/Arrow formats
poetry install -E dgl # DGL support (also includes torch)

To run the tests, make sure you have an active Memgraph instance, and execute one of the following commands:

poetry run pytest . -k "not slow" # If all extras installed

poetry run pytest . -k "not slow and not extras" # Otherwise

If you’ve installed only certain extras, it’s also possible to run their associated tests:

poetry run pytest . -k "arrow"
poetry run pytest . -k "dgl"

GQLAlchemy capabilities

🗺️ Object graph mapper

Below you can see an example of how to create User and Language node classes, and a relationship class of type SPEAKS. Along with that, you can see how to create a new node and relationship and how to save them in the database. After that, you can load those nodes and relationship from the database.

from gqlalchemy import Memgraph, Node, Relationship, Field
from typing import Optional

db = Memgraph()

class User(Node, index=True, db=db):
    id: str = Field(index=True, exist=True, unique=True, db=db)

class Language(Node):
    name: str = Field(unique=True, db=db)

class Speaks(Relationship, type="SPEAKS"):
    pass

user = User(id="3", username="John").save(db)
language = Language(name="en").save(db)
speaks_rel = Speaks(
    _start_node_id = user._id,
    _end_node_id = language._id
).save(db)

loaded_user = User(id="3").load(db=db)
print(loaded_user)
loaded_speaks = Speaks(
        _start_node_id=user._id,
        _end_node_id=language._id
    ).load(db)
print(loaded_speaks)
🔨 Query builder
When building a Cypher query, you can use a set of methods that are wrappers around Cypher clauses.

from gqlalchemy import create, match
from gqlalchemy.query_builder import Operator

query_create = create()
        .node(labels="Person", name="Leslie")
        .to(relationship_type="FRIENDS_WITH")
        .node(labels="Person", name="Ron")
        .execute()

query_match = match()
        .node(labels="Person", variable="p1")
        .to()
        .node(labels="Person", variable="p2")
        .where(item="p1.name", operator=Operator.EQUAL, literal="Leslie")
        .return_(results=["p1", ("p2", "second")])
        .execute()
🚰 Manage streams

You can create and start Kafka or Pulsar stream using GQLAlchemy.

Kafka stream

from gqlalchemy import MemgraphKafkaStream

stream = MemgraphKafkaStream(name="ratings_stream", topics=["ratings"], transform="movielens.rating", bootstrap_servers="localhost:9093")
db.create_stream(stream)
db.start_stream(stream)

Pulsar stream

from gqlalchemy import MemgraphPulsarStream

stream = MemgraphPulsarStream(name="ratings_stream", topics=["ratings"], transform="movielens.rating", service_url="localhost:6650")
db.create_stream(stream)
db.start_stream(stream)
🗄️ Import table data from different sources

Import table data to a graph database

You can translate table data from a file to graph data and import it to Memgraph. Currently, we support reading of CSV, Parquet, ORC and IPC/Feather/Arrow file formats via the PyArrow package.

Read all about it in table to graph importer how-to guide.

Make a custom file system importer

If you want to read from a file system not currently supported by GQLAlchemy, or use a file type currently not readable, you can implement your own by extending abstract classes FileSystemHandler and DataLoader, respectively.

Read all about it in custom file system importer how-to guide.

⚙️ Manage Memgraph instances

You can start, stop, connect to and monitor Memgraph instances with GQLAlchemy.

Manage Memgraph Docker instance

from gqlalchemy.instance_runner import (
    DockerImage,
    MemgraphInstanceDocker
)

memgraph_instance = MemgraphInstanceDocker(
    docker_image=DockerImage.MEMGRAPH, docker_image_tag="latest", host="0.0.0.0", port=7687
)
memgraph = memgraph_instance.start_and_connect(restart=False)

memgraph.execute_and_fetch("RETURN 'Memgraph is running' AS result"))[0]["result"]

Manage Memgraph binary instance

from gqlalchemy.instance_runner import MemgraphInstanceBinary

memgraph_instance = MemgraphInstanceBinary(
    host="0.0.0.0", port=7698, binary_path="/usr/lib/memgraph/memgraph", user="memgraph"
)
memgraph = memgraph_instance.start_and_connect(restart=False)

memgraph.execute_and_fetch("RETURN 'Memgraph is running' AS result"))[0]["result"]
🔫 Manage database triggers

Because Memgraph supports database triggers on CREATE, UPDATE and DELETE operations, GQLAlchemy also implements a simple interface for maintaining these triggers.

from gqlalchemy import Memgraph, MemgraphTrigger
from gqlalchemy.models import (
    TriggerEventType,
    TriggerEventObject,
    TriggerExecutionPhase,
)

db = Memgraph()

trigger = MemgraphTrigger(
    name="ratings_trigger",
    event_type=TriggerEventType.CREATE,
    event_object=TriggerEventObject.NODE,
    execution_phase=TriggerExecutionPhase.AFTER,
    statement="UNWIND createdVertices AS node SET node.created_at = LocalDateTime()",
)

db.create_trigger(trigger)
triggers = db.get_triggers()
print(triggers)
💽 On-disk storage

Since Memgraph is an in-memory graph database, the GQLAlchemy library provides an on-disk storage solution for large properties not used in graph algorithms. This is useful when nodes or relationships have metadata that doesn’t need to be used in any of the graph algorithms that need to be carried out in Memgraph, but can be fetched after. Learn all about it in the on-disk storage how-to guide.


If you want to learn more about OGM, query builder, managing streams, importing data from different source, managing Memgraph instances, managing database triggers and using on-disk storage, check out the GQLAlchemy how-to guides.

Development (how to build)

poetry run flake8 .
poetry run black .
poetry run pytest . -k "not slow and not extras"

Documentation

The GQLAlchemy documentation is available on memgraph.com/docs/gqlalchemy.

The documentation can be generated by executing:

pip3 install pydoc-markdown
pydoc-markdown

License

Copyright (c) 2016-2022 Memgraph Ltd.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

More Repositories

1

memgraph

Open-source graph database, built for real-time streaming data, compatible with Neo4j.
C++
1,997
star
2

odin

TypeScript
532
star
3

orb

Graph visualization library
TypeScript
296
star
4

mage

MAGE - Memgraph Advanced Graph Extensions 🔮
C++
232
star
5

docs

The official documentation for Memgraph, Memgraph Lab, GQLAlchemy and MAGE
MDX
55
star
6

example-streaming-app

An example repository on how to start building graph applications on streaming data. Just clone and start building 💻 💪
Rust
52
star
7

mgconsole

mgconsole is a command-line interface (CLI) used to interact with Memgraph from any terminal or operating system.
C++
45
star
8

reddit-network-explorer

A graph-powered Reddit explorer that can perform real-time graph visualizations and sentiment analysis.
Python
44
star
9

twitter-network-analysis

Analyzing a network of tweets and retweets using graph algorithms
JavaScript
38
star
10

spotify-song-recommender

A Spotify song recommendation engine built with the power of graph analytics.
Python
38
star
11

mgclient

C/C++ Memgraph Client
C++
37
star
12

rsmgclient

Memgraph database adapter for Rust programming language.
Rust
34
star
13

networkx-guide

We here are very big fans of NetworkX as a graph library and its comprehensive set of graph algorithms. For many though, working with NetworkX involves a steep learning curve. This guide is designed as an aid for beginners and experienced users to find specific tips and explore the world of complex networks.
JavaScript
31
star
14

twitch-analytics-demo

Visualization of Twitch analytics.
JavaScript
28
star
15

data-streams

Publicly available real-time data sets on Kafka, Redpanda, RabbitMQ & Apache Pulsar
Python
28
star
16

bluej

C++
27
star
17

jupyter-memgraph-tutorials

Learn to use Memgraph and GQLAlchemy quickly with the help of Jupyter Notebooks
Jupyter Notebook
27
star
18

memgraph-academy

Jupyter Notebook
27
star
19

bolt-proxy

Bolt protocol support for a Kubernetes cluster with authentication via Ingress
Go
25
star
20

cypher.vim

Vim syntax for the Cypher query language
Vim Script
24
star
21

slack-influence-bot

A slack bot that helps you understand and influence your slack community
Python
23
star
22

nodemgclient

Node.js Memgraph Client
C++
21
star
23

memgraph-platform

Memgraph Platform is a multi-container application containing Memgraph+MAGE and Memgraph Lab.
Shell
20
star
24

mgmigrate

mgmigrate is a tool for migrating data from MySQL or PostgreSQL to Memgraph and between Memgraph instances.
Cypher
20
star
25

bitclout-visualizing-hodlers

Visualizing BitClout 🪙☁️ HODLers
Python
20
star
26

protein-explorer

Visualizing protein-protein interaction networks
HTML
19
star
27

mgp

Pypi package used for type hinting when creating MAGE modules.
Python
18
star
28

physics-papers-recommender

Recommendation system used for blog post on physics papers recommendation system with node2vec
Python
17
star
29

graph-landscape-2022

A graph visualization of popular graph technologies and companies
Python
14
star
30

card-fraud

Python app for detecting credit card frauds using a graph database
SCSS
14
star
31

rune

TypeScript
12
star
32

memgraph-rs

Rust
12
star
33

starlink

This project implements dynamic shortest-path routing for Starlink using Memgraph. Starlink satellites are low earth orbit communications satellites currently being launched and operated by SpaceX.
JavaScript
12
star
34

helm-charts

Helm charts for deploying Memgraph, an open-source in-memory graph database.
Smarty
11
star
35

sng-demo

A Flask web application that displays a social network graph stored in Memgraph DB.
Python
10
star
36

documentation

The official documentation for Memgraph open-source graph database.
MDX
8
star
37

docs-recommendation-system

JavaScript
8
star
38

orbicon

Explore your userbase and community with the power of graph analytics.
Python
7
star
39

jsmgclient

JavaScript
6
star
40

hacker-news-analyzer

TypeScript
5
star
41

link-prediction-node-embeddings

Python
5
star
42

app-challenge-starter-pack

A Python starter pack for building streaming applications with Memgraph.
Python
5
star
43

insurance-fraud

Insurance companies lose a lot of money on different kinds of fraud. By using graphs along with machine learning, you can model and detect fraudulent insurance claims.
Jupyter Notebook
5
star
44

bor

Python
4
star
45

design

SCSS
4
star
46

MemFlights

Tutorial app using memgraph and C#
C#
4
star
47

mgui

Memgraph user interface library.
TypeScript
3
star
48

ecommerce-recommender-demo

E-Commerce recommender demo with real-time data and a graph database
Python
3
star
49

kafka-offset-demo

Demo showing how Kafka users can manually set the offset of the next consumed message with a call to the query procedure.
Python
3
star
50

benchgraph

TypeScript
2
star
51

cugraph-guide

JavaScript
1
star
52

conference-connector

TypeScript
1
star
53

depsy

Code dependencies analyzer
Python
1
star
54

cloud-interview-task

TypeScript
1
star
55

gasoline

A safe object-graph mapper and query builder for Rust.
1
star
56

blog

1
star
57

live-stream

C
1
star
58

cmake

This is a collection of CMake modules that are useful for all Memgraph projects.
CMake
1
star
59

mgcxx

Rust
1
star