GithubHelp home page GithubHelp logo

memgraph / memgraph Goto Github PK

View Code? Open in Web Editor NEW
2.1K 21.0 94.0 36.44 MB

Open-source graph database, tuned for dynamic analytics environments. Easy to adopt, scale and own.

Home Page: https://memgraph.com

License: Other

GDB 0.01% Python 14.49% CMake 1.05% Shell 2.91% C++ 70.82% C 0.10% Dockerfile 0.17% Common Lisp 1.44% ANTLR 0.37% C# 0.11% Java 0.19% JavaScript 0.13% Gherkin 6.63% Emacs Lisp 0.01% Go 0.11% HTML 0.01% Clojure 0.39% Vim Script 0.01% Cypher 1.05% TypeScript 0.02%
graph-algorithms graph-database graph-analysis stream-processing streaming-data kafka-streams kafka cypher graph nosql

memgraph's Introduction


license license license

Discord

๐Ÿ“‹ Description

Memgraph is an open source graph database built for real-time streaming and compatible with Neo4j. Whether you're a developer or a data scientist with interconnected data, Memgraph will get you the immediate actionable insights fast.

Memgraph directly connects to your streaming infrastructure. You can ingest data from sources like Kafka, SQL, or plain CSV files. Memgraph provides a standard interface to query your data with Cypher, a widely-used and declarative query language that is easy to write, understand and optimize for performance. This is achieved by using the property graph data model, which stores data in terms of objects, their attributes, and the relationships that connect them. This is a natural and effective way to model many real-world problems without relying on complex SQL schemas.

Memgraph is implemented in C/C++ and leverages an in-memory first architecture to ensure that youโ€™re getting the best possible performance consistently and without surprises. Itโ€™s also ACID-compliant and highly available.

โšก Features

  • Custom query modules - Run Python, Rust, and C/C++ code natively; check out the MAGE graph algorithm library.
  • Deep-path traversals - Use advanced capabilities such as accumulators and path filtering without adding additional application logic.
  • Native support for machine learning
  • Streaming support & dynamic algorithms
  • Multi-tenancy
  • High availability replication
  • Authentication & authorization
  • Role-based and label-based access control
  • Monitoring via HTTP server

๐ŸŽฎ Memgraph Playground

You don't need to install anything to try out Memgraph. Check out our Memgraph Playground sandboxes in your browser.

Memgraph Playground

๐Ÿ’พ Download & Install

Windows

Windows Windows

macOS

macOS macOS

Linux

Linux Debian Ubuntu Cent OS Fedora RedHat

You can find the binaries and Docker images on the Download Hub and the installation instructions in the official documentation.

โ˜๏ธ Memgraph Cloud

Check out Memgraph Cloud - a cloud service fully managed on AWS and available in 6 geographic regions around the world. Memgraph Cloud allows you to create projects with Enterprise instances of MemgraphDB from your browser.

Memgraph Cloud

๐Ÿ”— Connect to Memgraph

Connect to the database using Memgraph Lab, mgconsole, various drivers (Python, C/C++ and others) and WebSocket.

๐Ÿ”ฌ Memgraph Lab

Visualize graphs and play with queries to understand your data. Memgraph Lab is a user interface that helps you explore and manipulate the data stored in Memgraph. Visualize graphs, execute ad hoc queries, and optimize their performance.

Memgraph Cloud

๐Ÿ“ Import data

Import data into Memgraph using Kafka, RedPanda or Pulsar streams, CSV and JSON files, or Cypher commands.

๐Ÿ“‘ Documentation

The Memgraph documentation is available at memgraph.com/docs.

โ“ Configuration

Command line options that Memgraph accepts are available in the reference guide.

๐Ÿ† Contributing

Welcome to the heart of Memgraph development! We're on a mission to supercharge Memgraph, making it faster, more user-friendly, and even more powerful. We owe a big thanks to our fantastic community of contributors who help us fix bugs and bring incredible improvements to life. If you're passionate about databases and open source, here's your chance to make a difference!

Compile from Source

Learn how to download, compile and run Memgraph from source with the Quick Start guide.

Explore Memgraph Internals

Interested in the nuts and bolts of Memgraph? Our internals documentation is where you can uncover the inner workings of Memgraph's architecture, learn how to build the project from scratch, and discover the secrets of effective contributions. Dive deep into the database!

Dive into the Contributing Guide

Ready to jump into the action? Explore our contributing guide to get the inside scoop on how we develop Memgraph. It's your roadmap for suggesting bug fixes and enhancements. Contribute your skills and ideas!

Code of Conduct

Our commitment to a respectful and professional community is unwavering. Every participant in Memgraph is expected to adhere to a stringent Code of Conduct. Please carefully review the complete text to gain a comprehensive understanding of the behaviors that are both expected and explicitly prohibited.

We maintain a zero-tolerance policy towards any violations. Our shared commitment to this Code of Conduct ensures that Memgraph remains a place where integrity and excellence are paramount.

๐Ÿ“œ License

Memgraph Community is available under the BSL license.
Memgraph Enterprise is available under the MEL license.

๐Ÿ‘ฅ Community

Back to top

memgraph's People

Contributors

42jeremy avatar andrejtonev avatar antaljanosbenjamin avatar antejavor avatar antepusic avatar antonio2368 avatar antoniofilipovic avatar as51340 avatar boristasevski avatar brunos252 avatar darych avatar davivek avatar dtomicevic avatar gitbuda avatar gvolfing avatar hal-eisen-mg avatar ignition avatar imilinovic avatar ipaljak avatar jbajic avatar josipmrden avatar katarinasupe avatar kostasrim avatar llugovicmg avatar markobarisic avatar mbradac avatar mferencevic avatar mpintaric55334 avatar th30n avatar the-joksim avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

memgraph's Issues

Add support for dropping all indexes with one command

At the moment Memgraph doesn't support something like DROP INDEX ON * that would delete all indexes.

If you have a larger number of indexes it can take some time to delete them one by one. Dropping them all with a single command would be much faster.

Can this be added to Memgraph?

Different results returned when executing the same queries on Memgraph and Neo4j, respectively

Memgraph version
2.1.1 Docker

Environment
Windows 11
Java API / Cypher

Describe the bug
I discovered that when I executed the following queries on Memgraph and Neo4j, respectively, different results were returned:

CREATE (n0 :L2{k17:''});
CREATE (n1 :L3{k20:330281481, k22:false});
CREATE (n2 :L0);
CREATE (n3 :L2);
CREATE (n4 :L3{k18:'8'});
CREATE (n5 :L1{k8:-2090394048, k11:false});
CREATE (n6 :L1{k9:'O4Kc5v'});
CREATE (n7 :L1);
CREATE (n8 :L1);
CREATE (n9 :L0{k1:1490197806, k2:true, k4:false, k5:1490197806});
CREATE (n10 :L1{k10:-2090394048});
MATCH (n10 :L1{k10:-2090394048}), (n8 :L1) MERGE (n10)-[r0 :T5{k63:true}]->(n8);
MATCH (n1) WHERE (0 = 1) MATCH (n1) RETURN sum(0) AS a0;

To Reproduce

  1. Start Memgraph 2.1.1 and Neo4j 4.3.10, respectively.
  2. Execute the mentioned queries on each graph database.
  3. Compare the result sets.

Expected behavior
The result sets are the same. But the actual behavior is:
Memgraph returns: [{a0:null}]
Neo4j returns: [{a0:0}]

Logs
Memgraph:
1

Neo4j:
2

Create a cypher query for checking Memgraph version from a bolt client

Hey ho. I filed a feature proposal at memgraph discourse.

Memgraph version
2.0.0

Environment
memgraph-platform

Describe the enhancement
I propose we create a SHOW VERSION cypher query that would return the version of the current running Memgraph instance.

Describe the use case
One connects to a Memgraph instance (a user that doesn't have access to the Memgraph instance, not a sys admin), and wants to check what version Memgraph is running so they know what features are supported.

Not executable query with two boolean values

Memgraph version
2.3.1

Environment
Windows, Docker

Describe the bug
If you run query RETURN true, false; you get error Client received exception: Multiple results with the same name 'true' are not allowed..

To Reproduce

  1. Run the following query 'RETURN true, false;'

Expected behavior
I expect to get result with two values true and false.

Throw exceptions when `null` is used in the simple form of CASE clause

CASE doesn't work well with null. This works as expected and prints 'works':

WITH 2 AS name
RETURN CASE name
    WHEN 2 THEN 'works'
    WHEN null THEN "doesn't work"
    ELSE 'something went wrong'
END

If we swap the first case from 2 to 3. It should print 'something went wrong', but instead it prints "doesn't work":

WITH 2 AS name
RETURN CASE name
    WHEN 3 THEN 'works'
    WHEN null THEN "doesn't work"
    ELSE 'something went wrong'
END

The correct way to write the query above would be using the generic form:

WITH 2 AS name
RETURN CASE
  WHEN name is NULL THEN "doesn't work"
  WHEN name = 2 THEN "works"
  ELSE "something went wrong"
END

User should get an error to prefer to general form when he has NULL in the simple form.

On PROFILE error still return partial results

When PROFILE is run, sometimes there is an error during execution. In the case of an error, it would be nice to get results back (even partial ones) because the user might get valuable info even if the whole query didn't finish well.

An alternative to the partial profile results is to split the query manually into parts and then execute part by part, which is time-consuming.

How to read Memgraph process environment variables from a query module?

In the real deployment case, a query module might be configured with environment variables. Sometimes that's the only case if the code inside the module has to be configured with some kind of a token or secret. As I tested, if a user passed ENV var to Memgraph, the query module can't read that same environment variable.

During development, that's not a problem, but in the deployment case, there has to be a way to configure the module without hardcoding values inside the module. An option is to read from a file, but that's not a convenient option from the deployment ease of use perspective.

[BUG] Memgraph Lab: Undo Query `CMD` `Z` not working

Memgraph version
Latest

Environment
Mac M1 / All

Describe the bug
Every time I run a query, I can not undo. I am a newbie to Cypher and MemGraph so I make a lot of mistakes... want to try things out. That is incredible tedious, because I can not simply hit CMD + Z to go back. Which is very very frustrating.

Kapture.2022-06-19.at.21.14.23.mp4

To Reproduce
Steps to reproduce the behavior:

  1. Open Memgraph Lab
  2. Write Query
  3. Run
  4. Change Query to a mistake
  5. Run
  6. Hit CMD + Z
  7. Can't revert the change.

Expected behavior

  • I'd expect that anything I type can be reverted like any other text field

Additional context
I am a react guy, so I don't know angular. It seems angular is unmounting and re-rendering the text field component on Run Query. Not doing that should allow the users operations system to track undo functionality without any extra coding like any text field.

A stretch goal on top in regards of user experience would be,

  • that if I hit CMD + S the query is saved in the log as saved
  • that on the top right, above the query text window is an easy forward, backward and list menu that allows to step through the query log without context switching into the "latest queries" section.

Import CSV files from remote locations

Description

It would be cool to import CSV files with the LOAD CSV clause from remote locations.

Feature usage

LOAD CSV FROM "https://github.com/memgraph/..." NO HEADER AS row
...

Add SHOW ARGUMENTS | FLAGS command

It would be convenient to get the set of all config flags (runtime arguments passed to Memgraph at the start time) by issuing a query, e.g.:

  • SHOW ARGUMENTS;
  • SHOW CONFIG;
  • SHOW FLAGS;

[BUG] Different results are returned when executing the same queries on Memgraph and Neo4j, respectively.

Memgraph version
2.1.1 Docker

Environment
Windows 11
Java API / Cypher

Describe the bug
Hi, I discovered that when I executed the following queries on Memgraph and Neo4j, respectively, different results were returned:

CREATE (n0);
CREATE (n1 :L2 :L4 :L6{k12:'', k24:false, k34:-209247559, k36:false, k38:-926512727, k39:-2086331942});
CREATE (n2);
CREATE (n3 :L0 :L6{k3:true, k4:674722176, k35:-2086331942});
CREATE (n4 :L3{k19:'7IihHC'});
CREATE (n5 :L4 :L5{k29:false, k31:true});
CREATE (n6 :L2{k14:-2071913622});
CREATE (n7);
CREATE (n8 :L0{k3:false});
CREATE (n9 :L2 :L3{k16:-2071913622});
MATCH (n0), (n5 :L4 :L5{k29:false, k31:true}) MERGE (n0)<-[r0 :T0]-(n5);
MATCH (n6 :L2{k14:-2071913622}), (n0) MERGE (n6)<-[r1 :T3]-(n0);
MATCH (n8 :L0{k3:false}), (n0) MERGE (n8)<-[r2 :T3]-(n0);
MATCH (n0)-[r0 :T0 *..2]-(n1) RETURN 2

To Reproduce

  1. Start Memgraph 2.1.1 and Neo4j 4.3.10, respectively.
  2. Execute the mentioned queries on each graph database.
  3. Compare the result sets.

Expected behavior
The result sets are the same. But the actual behavior is:
Memgraph returns 128 records,
Neo4j returns 109 records.

Logs
Memgraph:
memgraph

Neo4j:
neo4j

[BUG] Memgraph 1.6. and newer doesn't work on M1 Macs

Memgraph version
Docker from memgraph/memgraph:latest
(It's 2.1.1 at this point)

Environment
Docker Desktop on macOS, with Apple M1 SoC
docker run -p 7687:7687 memgraph/memgraph:latest

Describe the bug
Memgraph crashes as soon as I try to connect to it (I tried with Memgraph Lab).

To Reproduce
Steps to reproduce the behavior:

  1. docker run -p 7687:7687 memgraph/memgraph:latest
  2. Connect to Memgraph

Expected behavior
Memgraph in Docker starts normally.

Logs

> docker run -p 7687:7687 memgraph/memgraph
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
You are running Memgraph v2.1.1
To get started with Memgraph, visit https://memgr.ph/start
qemu: uncaught target signal 6 (Aborted) - core dumped

Logs inside the Docker container

memgraph@c0f636243bc9:/usr/lib/memgraph$ cat /var/log/memgraph/memgraph_2021-12-14.log
[2021-12-14 08:26:34.933] [memgraph_log] [warning] Invalid license key string. To use Enterprise features please set it to a valid string using the following query:
SET DATABASE SETTING "enterprise.license" TO "your-license-key"
[2021-12-14 08:26:34.959] [memgraph_log] [warning] No snapshot or WAL file found. For more details, visit https://memgr.ph/durability.
[2021-12-14 08:26:36.683] [memgraph_log] [warning] Using non-secure Bolt connection (without SSL). For more details, visit https://memgr.ph/ssl.
[2021-12-14 08:26:47.474] [memgraph_log] [critical]
Assertion failed in file /memgraph/src/utils/async_timer.cpp at line 144.
	Expression: 'timer_create(CLOCK_MONOTONIC, &notification_settings, &timer_id_) == 0'
	Message: 'Couldn't create timer: (22) Invalid argument'

Running the DFS algorithm in Memgraph

As the default relationship traversal algorithm is DFS, users could be confused when trying to switch between BFS and DFS.
It would be useful to include dfs as an explicit option just like bfs even though it wouldn't result in any changes in the underlying implementation. For example:

MATCH (a {id: 723})-[edge_list:Type *dfs..10]-(b {id: 882}) RETURN *;

Feature request fn keys() to work on Map

Hi.

I would to request upgrade on cypher function keys(). It will be nice if it works on Map and result would be list of keys from it.

RETURN keys({ a: 123, b: 456 });
// result: ["a", "b"]

Feature requests related to k8s and GCP

Hello,

Great work on the graph database, very impressive. I have a couple of minor feature requests/questions.

Helm Chart

When I google kubernetes helm chart I am forwarded to the documentation: https://memgraph.com/docs/memgraph/next/reference-guide/deployment/kubernetes. However there are only native kubernetes manifests. Is there a helm repo somewhere?

Ansible Playbook

Besides kubernetes; are there any plans to write a ansible playbook for non-kubernetes provisioning.

GCP Marketplace

And are there are any plans to include GCP in your cloud offering. And if so will it be available from within GCP Marketplace.

Keep up the good work!

Best Regards,

David

Improve Python query modules development experience

In the case of a query module that depends on a local submodule, e.g. foo:

import foo
import mgp
import importlib

@mgp.read_proc
def procedure(context...):
    importlib.reload(foo)
    foo.call()

if foo module changes, the procedure is still using the previous code (even after the execution of CALL mg.load_all()). One option is to use importlib.reload (as shown above) but that's not nice + it has a cost.

How to improve that? Ideally, a user should not care about manually reloading specific submodules.

[BUG] When executing the same queries on Memgraph and Neo4j, respectively, different results are returned.

Memgraph version
2.1.1 Docker

Environment
Windows 11
Java API / Cypher

Describe the bug
Hello! I discovered that when I executed the following queries on Memgraph and Neo4j, respectively, different results were returned:

CREATE (n0 :L3{k20:-919632443});
CREATE (n1 :L4{k30:'V', k31:true});
CREATE (n2);
CREATE (n3 :L1 :L4{k6:991112921});
CREATE (n4 :L0{k0:22253877, k4:-492205466});
CREATE (n5 :L1 :L4{k7:true, k8:'koj', k10:'XP'});
CREATE (n6 :L1);
CREATE (n7 :L3{k24:false, k25:''});
CREATE (n8 :L3 :L4{k29:false});
CREATE (n9 :L0 :L2 :L3{k26:'py'});
CREATE (n10 :L1 :L2 :L3{k9:false, k11:586155785, k16:false, k19:''});
CREATE (n11 :L0 :L4{k4:1451143570, k27:false, k29:false, k30:'vtj'});
CREATE (n12 :L2 :L4{k17:'', k30:'i', k31:true});
CREATE (n13 :L0 :L2{k0:22253877, k1:'o', k13:-1734668299, k19:''});
CREATE (n14 :L3{k26:'6'});
CREATE (n15 :L0 :L3{k1:'gcB', k20:1364188171, k24:false, k25:''});
CREATE (n16 :L0 :L1{k4:586155785});
CREATE (n17 :L3 :L4{k22:'j', k26:'eJ'});
MATCH (n5 :L1 :L4{k7:true, k8:'koj', k10:'XP'}), (n17 :L3 :L4{k22:'j', k26:'eJ'}) MERGE (n5)<-[r0 :T1{k41:112389219}]-(n17);
MATCH (n6 :L1), (n16 :L0 :L1{k4:586155785}) MERGE (n6)-[r1 :T4{k59:'PhC69i'}]->(n16);
MATCH (n11 :L0 :L4{k4:1451143570, k27:false, k29:false, k30:'vtj'}), (n1 :L4{k30:'V', k31:true}) MERGE (n11)<-[r2 :T2{k46:-1523562950, k51:992949812, k52:1046067056}]-(n1);
MATCH (n0)-[r0 :T4]-(n1) OPTIONAL MATCH (n2)<-[r1 :T3 *1..]-(n3 :L2) RETURN 1;

To Reproduce

  1. Start Memgraph 2.1.1 and Neo4j 4.3.10, respectively.
  2. Execute the mentioned queries on each graph database.
  3. Compare the result sets.

Expected behavior
The result sets are the same. But the actual behavior is:
Memgraph returns 9 records,
Neo4j returns 10 records.

Logs
Memgraph:
m

Neo4j:
n

Fix min int value throws error

Memgraph version
2.3.1

Environment
Windows, Docker, Bolt, PHP Bolt library

Describe the bug
When I run query with min int value I get error:
Integer literal exceeds 64 bits. (Memgraph.ClientError.MemgraphError.MemgraphError)

Min int value on x64 is -9223372036854775808

To Reproduce

  1. Run query RETURN $i over bolt protocol with min int value as parameter.

Expected behavior
I expect to get min int value instead of error.

Comparison for temporal types is not implemented

Memgraph version
Memgraph 2.0.0

Environment
Memgraph Mage Docker image

Describe the bug
Query results cannot be ordered using properties with temporal types.

Logs

[2021-11-14 18:40:21.416] [memgraph_log] [critical] Unhandled comparison for types

When executing the same queries on Memgraph and Neo4j, different results are returned

Memgraph version
2.1.1 Docker

Environment
Windows 11
Java API / Cypher

Describe the bug
I discovered that when I executed the following queries on Memgraph and Neo4j, respectively, different results were returned:

CREATE (n0 :L0);
CREATE (n1 :L4{k26:false, k27:false, k30:true});
CREATE (n2 :L3);
CREATE (n3 :L2{k17:987581285});
CREATE (n4 :L3{k20:'', k23:false, k25:true});
CREATE (n5 :L2{k17:987581285});
CREATE (n6 :L0{k2:1405310981});
CREATE (n7 :L3{k20:'Yl', k22:true, k23:false});
CREATE (n8 :L3);
CREATE (n9 :L4{k29:'g5r3Ra78'});
CREATE (n10 :L3{k21:1111252225});
CREATE (n11 :L4{k27:true});
MATCH (n1) OPTIONAL MATCH (n2)-->(n3 :L3) OPTIONAL MATCH (n4) OPTIONAL MATCH (n5 :L2), (n3) RETURN 0;

I'm curious if it is a bug. Looking forward to your reply! Thank you so much!

To Reproduce

  1. Start Memgraph 2.1.1 and Neo4j 4.3.10, respectively.
  2. Execute the mentioned queries on each graph database.
  3. Compare the result sets.

Expected behavior
The result sets are the same. But the actual behavior is:
Memgraph returns 288 records
Neo4j returns 144 records

Logs
Memgraph:
1

Neo4j:
2

[BUG] Memgraph doesn't recognize python submodule update on `call mg.load_all()`

Memgraph version
Which version did you use?

Memgraph v2.0.0

Environment
Some information about the environment you are using Memgraph on: operating
system, how do you connect, with or without docker, which driver etc.

Operating system: Ubuntu 20.04, without docker, connecting with mgconsole 1.0

Describe the bug
A clear and concise description of what the bug is.
Python submodule doesn't update on call mg.load_all();

To Reproduce
Steps to reproduce the behavior:

First, this is how I set up my folder structure

`python`
   test_module.py
   `mage`
      `test_submodule`
          __init__.py
         test_functions.py

This was my setup in /etc/memgraph/memgraph.conf
--query-modules-directory=/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python

Setup of test_functions.py

def test_function(a:int, b:int)->int:
    return a+b

Setup of test_module.py

import mgp

from mage.test_submodule.test_functions import test_function
@mgp.read_proc
def calculate(
    ctx: mgp.ProcCtx,
    a: mgp.Number,
    b: mgp.Number
) -> mgp.Record(result=mgp.Number):
    return mgp.Record(result=int(test_function(a,b)))

I started memgraph with following command:

antonio@antonio-ThinkPad-E480:~$ sudo runuser -l memgraph -c "/usr/lib/memgraph/memgraph"
You are running Memgraph v2.0.0

And then I started in the new terminal mgconsole and run the following commands:

antonio@antonio-ThinkPad-E480:~$ mgconsole --use-ssl=False
mgconsole 1.0
Connected to 'memgraph://127.0.0.1:7687'
Type :help for shell usage
Quit the shell by typing Ctrl-D(eof) or :quit
memgraph> call test_module.calculate(2,3) YIELD result RETURN result;
+--------+
| result |
+--------+
| 5      |
+--------+
1 row in set (0.052 sec)
memgraph> 

The result till now was as expected. But then I change what test_function to return a*b instead of a+b

New setup of test_functions.py

def test_function(a:int, b:int)->int:
    return a*b

And run these commands in mgconsole:

memgraph> call mg.load_all();
Empty set (0.075 sec)
memgraph> call test_module.calculate(2,3) YIELD result RETURN result;
+--------+
| result |
+--------+
| 5      |
+--------+
1 row in set (0.047 sec)

Expected behavior
A clear and concise description of what you expected to happen.
I expected the result to be 6.

Further note: I tried to add one more function in my test_functions.py

def test_function(a:int, b:int)->int:
    return a*b
def test_function2(a:int, b:int)->int:
    return a*b

And then changed test_module.py

import mgp

from mage.test_submodule.test_functions import test_function, test_function2


@mgp.read_proc
def calculate(
    ctx: mgp.ProcCtx,
    a: mgp.Number,
    b: mgp.Number
) -> mgp.Record(result=mgp.Number):
    return mgp.Record(result=int(test_function2(a,b)))

But got following result:

memgraph> call mg.load_all();
Empty set (0.093 sec)
memgraph> call test_module.calculate(2,3) YIELD result RETURN result;
Client received exception: There is no procedure named 'test_module.calculate'.
memgraph> 

And logs:

[2021-10-15 13:00:59.495] [memgraph_log] [info] Loading module "/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python/test_module.py"...
[2021-10-15 13:00:59.496] [memgraph_log] [error] Unable to load module "/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python/test_module.py"; Traceback (most recent call last):
  File "/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python/test_module.py", line 3, in <module>
    from mage.test_submodule.test_functions import test_function, test_function2
ImportError: cannot import name 'test_function2' from 'mage.test_submodule.test_functions' (/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python/mage/test_submodule/test_functions.py)

Logs

These are logs for problem for changing a+b to a*b
If applicable, add logs of Memgraph, CLI output or screenshots to help explain
your problem.


[2021-10-15 12:49:11.941] [memgraph_log] [debug] [Run] 'call test_module.calculate(2,3) YIELD result RETURN result'
[2021-10-15 12:52:25.618] [memgraph_log] [debug] [Run] 'call mg.load_all()'
....
[2021-10-15 12:52:25.620] [memgraph_log] [info] Closing module "/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python/test_module.py"...
[2021-10-15 12:52:25.621] [memgraph_log] [info] Closed module "/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python/test_module.py"
....

...
[2021-10-15 12:52:25.686] [memgraph_log] [info] Loading module "/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python/test_module.py"...
[2021-10-15 12:52:25.687] [memgraph_log] [info] Loaded module "/home/antonio/work/memgraph/github-repos/field/github-repos/mage/python/test_module.py"


Additional context
Add any other context about the problem here.

Issue also mentioned on Orbicon: memgraph/orbicon#26
I found out now that this issue is mention also here: #223 (comment)

toString function should accept date data type as argument

The signature for toString() function is: toString(value: any) -> (string)

but the function doesn't accept date data type as an argument:

WITH date("2022-01-15") AS value
RETURN toString(value);
-> 'toString' argument at position 1 must be either 'null', 'string', 'number' or 'boolean'.

Support for Unicode characters

Description

Memgraph doesn't support Unicode characters.
Even though nodes can contain such characters. functions don't work correctly with them.

Imgur

Requirement

Resources

Improve `WeightedShortestPath` in case the target node is known

Currently if we would like to find the weighted shortest path between two nodes, we have to use the following query (there is a LabelPropertyIndex on :TOPIC(title)):

memgraph> EXPLAIN MATCH (a:TOPIC) WHERE a.title = "Mewtwo"
       -> MATCH (b:TOPIC) WHERE b.title = "Fender Stratocaster"
       -> MATCH (b)-[edge_list *wShortest 10 (e, n | 1) total_weight]-(a)
       -> UNWIND edge_list AS edge
       -> RETURN startNode(edge), edge, endNode(edge);
+-----------------------------------------------------+
| QUERY PLAN                                          |
+-----------------------------------------------------+
| " * Produce {startNode(edge), edge, endNode(edge)}" |
| " * Unwind"                                         |
| " * Filter"                                         |
| " * WeightedShortestPath (b)-[edge_list]-(a)"       |
| " * ScanAllByLabelPropertyValue (b :TOPIC {title})" |
| " * Once"                                           |
+-----------------------------------------------------+
6 rows in set (0.000 sec)

How does this work is basically it first calculates all the weighted shortest paths from the source vertex and then filters out the results. Obviously this means the calculation might have a big overhead.

Instead, when we can figure out the possible destination vertices, we should abort the calculation as soon as we found the shortest path, or it would be even better to have a custom algorithm for that case similarly to STShortestPath.

[BUG] Using reserved words as variable names does not report any error.

Memgraph version
2.1.1 Docker

Environment
Windows 11
Java API / Cypher

Describe the bug
Hello, when I execute the following query on Memgraph, no error is reported. But the official document of openCypher9 says: "The reserved keywords are not permitted to be used as identifiers in the following contexts: Variables, Function names, Parameters". So I think Memgraph should report an error when executing the following query:
MATCH (RETURN) RETURN RETURN

To Reproduce
Execute the query:
MATCH (RETURN) RETURN RETURN

Expected behavior
An error should be reported, see:
5 FJ3DKG~SR0IJIX4NXC @8

Logs
ๅพฎไฟกๅ›พ็‰‡_20220315111516

[BUG] Replica in SYNC WITH TIMEOUT returns 0 for TIMEOUT

Memgraph version
Memgraph 2.2.1

Environment
Windows 10, Memgraph Lab, with Docker using memgraph-platform image

Describe the bug
When registering a REPLICA instance with the SYNC WITH TIMEOUT mode, then showing REPLICA instances' details, the TIMEOUT for that instance is 0.

To Reproduce

  1. Run two instances, demote one to REPLICA
  2. Register replica with the following query REGISTER REPLICA REP2 SYNC WITH TIMEOUT 1 TO "172.17.0.4";
  3. Run the following query to get details SHOW REPLICAS;
  4. Observe how the TIMEOUT for REP2 is 0

Expected behavior
Not sure if this column shows TRUE/FALSE, or s/ms of the TIMEOUT, but 0 is a wrong answer in both cases

Hacktoberfest 2021 - Fix a bug, improve a feature or add something new!

memgraph-hacktoberfest

For a meaningful contribution, get a Memgraph Hacktoberfest T-shirt!

You can fix bugs or provide better implementations for certain features! Feel free to inform the community by filling an issue and start hacking. If you're new to contributing code, please read our Contribution Guidelines for an overall understanding.

Discord

Memgraph has repositories with different programming languages and technology stacks, so find what works for you and start coding there:

  • MAGE - graph algorithm library (C or C++ or Python or Rust).
  • Memgraph - graph streaming platform for C/C++ wizards.
  • GQLAlchemy - object graph mapper (OGM) written in Python.

If you want to contribute to any other of our repositories, just follow the same principle and open an issue. We will handle the rest.

What can you do to participate?

  1. Read our Contribution Guidelines.
  2. Comment below or open an issue (for big ideas you may want the community to know) on your new implementations, fixes, or functionalities.
  3. Start hacking!
  4. Open a pull request for your contribution.
  5. Wait until your pull requests get reviewed or merged! In the meantime, you can review someone else's pull requests too.

Remarks

  • Join our Discord server to get started. It's definitely easier with the help of the Memgraph engineering team or other community members.
  • As part of the event, we would like to invite everyone to adhere to Hacktoberfest's values and our Code of Conduct.
  • Please observe Hacktoberfest's rules, terms, and FAQ. If a pull request is marked invalid or spam it would not be counted, and the person may be disqualified from the event.
  • Hacktoberfest 2021 is an event presented by DigitalOcean, Intel, appwrite, and deepsource.

How to extend Memgraph with a custom function?

Query modules (CALL procedure()) are great to extend Memgraph capabilities but is there a way to inject an arbitrary function that could be used in an expression (MATCH (n) WHERE my_fun(n) = True RETURN n;).

[BUG] Fix recovery on REPLICA

Memgraph version
Memgraph 2.2.1

Environment
Windows 10, Memgraph Lab, with Docker using memgraph-platform image

Describe the bug
While testing replication I created multiple instances:

1: docker run -it -p 7687:7687 -p 3000:3000 -v mg_lib:/var/lib/memgraph memgraph/memgraph-platform
2: docker run -it -p 7688:7687 -p 3001:3000 -v mg_lib2:/var/lib/memgraph memgraph/memgraph-platform
3: docker run -it -p 7689:7687 -p 3002:3000 -v mg_lib3:/var/lib/memgraph memgraph/memgraph-platform

I demoted 2 and 3 to replicas and registered them from the main in SYNC mode...

Issue 1: I shut down instance 3, brought it back up with the same IP address... its role is main again... it doesn't remember it was a replica
The docs say "Each Memgraph instance will remember what the configuration was set to and will automatically resume with its role when restarted."

Issue 2: Docs say that replication in SYNC mode will fail if all REPLICA instances cannot confirm that they received the data and synced to the same state as the MAIN instance... After shutting down and restarting instance 3 it is no longer a replica because of issue 1, then I shut down instance 2, created and deleted nodes and relationships on the MAIN.... no issues occurred and the MAIN committed the changes although the replica 2 couldn't confirm...

Expected behavior

  1. Restarted replica instance should remember it was a REPLICA instance and its configuration in regards to the replication process ONLY THIS HAS TO BE ADDRESSED
  2. In SYNC mode the MAIN shouldn't commit changes if one/all of its replicas are down

Docker gives out a warning while running Memgraph on an M1 Mac

Docker gives out a warning, but Memgraph works normally (under Rosetta 2). Not sure if this is something we can fix unless we build Memgraph for the host platform.

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
You are running Memgraph v1.6.0-community

Docker Warning

Add configuration settings Cypher query

It would be useful if there is a configuration settings Cypher query. For example, let's say I set --log-level=TRACE and I want to check whether the flag is set correctly. It would be useful to run something like:

SHOW CONFIGS;

and get the list of all configuration settings and their values. Above is just a suggestion on what that query would look like (SHOW STREAMS; was my inspiration). Personally, I see this being especially useful for --query-modules-directory, --kafka-bootstrap-servers and --log-level config settings.

This query can, later on, be wrapped with GQLAlchemy and serve to check whether all config settings are correctly set in a whole application.

Implement mgp object serialization

It would be useful if all objects from mgp are JSON serializable, that is, that there is some kind of method that returns Python Dict of mgp objects. For example, when I'm writing a query module for database export, I'm actually creating a JSON file with a list of nodes and relationships. Therefore, I have to reach every label, property, etc. of each Vertex and Edge. I would like to be able to just add properties as a list to my properties key, but then mgp.Vertex.properties is not JSON serializable. I solved this by going through all properties and creating new dictionary, but I think that the right place for this code would be inside mgp and not query module. Since we're going to create new utility modules similar to the export one, this feature may come in handy.

Unable to do a valgrind check on Memgraph with massif tool

Memgraph version
v2.3

Environment
Ubuntu 20.04

Describe the bug
I was trying to do a valgrind check with the massif tool to inspect memory usage by Memgraph. When I started the mgconsole, the tool crashed, and said that there were errors in memcheck, causing the crash. By inspecting valgrind memcheck, I got the stacktrace below, pointing at an asio method with an invalid free

To Reproduce
Steps to reproduce the behavior:

  1. run valgrind --tool=massif ./memgraph --also-log-to-stderr=true --log-level=TRACE --telemetry-enabled=false --storage-properties-on-edges=true --storage-recover-on-startup=true --data-directory=data (the arguments may be irrelevant
  2. Run mgconsole
  3. Observe the tool crashed
  4. Run valgrind --tool=memcheck ./memgraph --also-log-to-stderr=true --log-level=TRACE --telemetry-enabled=false --storage-properties-on-edges=true --storage-recover-on-startup=true --data-directory=data
  5. Observe the following result:
==9587== Invalid free() / delete / delete[] / realloc()
==9587==    at 0x483CA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==9587==    by 0x4B15F4: boost::asio::aligned_delete(void*) (memory.hpp:122)
==9587==    by 0x4C9844: void boost::asio::detail::thread_info_base::deallocate<boost::asio::detail::thread_info_base::default_tag>(boost::asio::detail::thread_info_base::default_tag, boost::asio::detail::thread_info_base*, void*, unsigned long) (thread_info_base.hpp:198)
==9587==    by 0x520F69: boost::asio::detail::recycling_allocator<boost::asio::detail::executor_op<boost::asio::detail::binder2<boost::asio::executor_binder<std::_Bind_front<void (memgraph::communication::v2::Session<BoltSession, SessionData>::*)(boost::system::error_code const&, unsigned long), std::shared_ptr<memgraph::communication::v2::Session<BoltSession, SessionData> > >, boost::asio::strand<boost::asio::executor> >, boost::system::error_code, unsigned long>, std::allocator<void>, boost::asio::detail::scheduler_operation>, boost::asio::detail::thread_info_base::default_tag>::deallocate(boost::asio::detail::executor_op<boost::asio::detail::binder2<boost::asio::executor_binder<std::_Bind_front<void (memgraph::communication::v2::Session<BoltSession, SessionData>::*)(boost::system::error_code const&, unsigned long), std::shared_ptr<memgraph::communication::v2::Session<BoltSession, SessionData> > >, boost::asio::strand<boost::asio::executor> >, boost::system::error_code, unsigned long>, std::allocator<void>, boost::asio::detail::scheduler_operation>*, unsigned long) (recycling_allocator.hpp:60)
==9587==    by 0x520EF5: boost::asio::detail::executor_op<boost::asio::detail::binder2<boost::asio::executor_binder<std::_Bind_front<void (memgraph::communication::v2::Session<BoltSession, SessionData>::*)(boost::system::error_code const&, unsigned long), std::shared_ptr<memgraph::communication::v2::Session<BoltSession, SessionData> > >, boost::asio::strand<boost::asio::executor> >, boost::system::error_code, unsigned long>, std::allocator<void>, boost::asio::detail::scheduler_operation>::ptr::reset() (executor_op.hpp:35)
==9587==    by 0x520DA1: boost::asio::detail::executor_op<boost::asio::detail::binder2<boost::asio::executor_binder<std::_Bind_front<void (memgraph::communication::v2::Session<BoltSession, SessionData>::*)(boost::system::error_code const&, unsigned long), std::shared_ptr<memgraph::communication::v2::Session<BoltSession, SessionData> > >, boost::asio::strand<boost::asio::executor> >, boost::system::error_code, unsigned long>, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:63)
==9587==    by 0x4B185D: boost::asio::detail::scheduler_operation::complete(void*, boost::system::error_code const&, unsigned long) (scheduler_operation.hpp:40)
==9587==    by 0x50DC8C: boost::asio::detail::strand_executor_service::run_ready_handlers(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl>&) (strand_executor_service.ipp:150)
==9587==    by 0x50DBC8: boost::asio::detail::strand_executor_service::invoker<boost::asio::executor const, void>::operator()() (strand_executor_service.hpp:192)
==9587==    by 0x50E4D4: void boost::asio::asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<boost::asio::executor const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::executor const, void>&, ...) (handler_invoke_hook.hpp:88)
==9587==    by 0x50E44E: void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::strand_executor_service::invoker<boost::asio::executor const, void>, boost::asio::detail::strand_executor_service::invoker<boost::asio::executor const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::executor const, void>&, boost::asio::detail::strand_executor_service::invoker<boost::asio::executor const, void>&) (handler_invoke_helpers.hpp:54)
==9587==    by 0x50E302: void boost::asio::detail::executor_function::complete<boost::asio::detail::strand_executor_service::invoker<boost::asio::executor const, void>, boost::asio::detail::recycling_allocator<void, boost::asio::detail::thread_info_base::default_tag> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==9587==  Address 0xe201000 is in a rw- anonymous segment
==9587== 

Expected behavior
I am able to profile memgraph with valgrind massif

Additional context
Additional arguments may be irrelevant. If needed, I ran Memgraph with Pokec small dataset inside when loading it.

[BUG] Wrong column name in SHOW REPLICATION ROLE results

Memgraph version
Memgraph 2.2.1

Environment
Windows 10, Memgraph Lab, with Docker using memgraph-platform image

Describe the bug
Wrong column name as a result of the SHOW REPLICATION ROLE query.

To Reproduce

  1. Run the SHOW REPLICATION ROLE query.
  2. Result column says "replication mode" and is showing replication role

Expected behavior
Column name should be "replication role"

Move to the toolchain-v5

  • Add LLVM standard libc++
  • Upgrade to Clang 14 and GCC 12
  • Upgrade all toolchain libs to the latest versions (fmt v9 is required to compile Memgraph with GCC)
  • Cover #558

[BUG] MERGE clause allows creating relationships without specifying the direction

When executing the query CREATE (p:Person)-[s:SPEAKS]-(l:Language) RETURN p, s, l;, you get the following error:

Error: Query failed: Bidirectional relationship are not supported when creating an edge

If you use MERGE instead of CREATE, the relationship is created:

MERGE (p:Person)-[s:SPEAKS]-(l:Language) RETURN p, s, l;

[BUG] wShortest doesn't work with temporal types

Memgraph version
v2.0.1

Environment
Ubuntu 20.04

Describe the bug
Weighted shortest path can't use temporal types inside the total_weight aggregator. Maybe the same applies for BFS, DFS...

To Reproduce

MATCH (n) DETACH DELETE n;
CREATE
    (apartment {name: "Apartment", current_time: localtime("T21:00")}),
    (car {name: "Car"}),
    (bike {name: "Bike"}),
    (burek {name: "Burek", opens: localtime("T08:00"), closes: localtime("T20:00")}),
    (pizza {name: "Pizza", opens: localtime("T08:00"), closes: localtime("T23:00")}),
    (cevosi {name: "ฤŒevosi", opens: localtime("T20:00"), closes: localtime("T23:00")}),
    (kebab {name: "Kebab", opens: localtime("T08:00"), closes: localtime("T21:00")}),
    (apartment)-[:Walk {duration: duration("PT10M")}]->(car),
    (apartment)-[:Walk {duration: duration("PT3M")}]->(bike),
    (car)-[:Drive {duration: duration("PT2M")}]->(burek),
    (car)-[:Drive {duration: duration("PT4M")}]->(pizza),
    (bike)-[:Ride {duration: duration("PT5M")}]->(cevosi),
    (bike)-[:Ride {duration: duration("PT6M")}]->(kebab)
;
MATCH (a {name: "Apartment"})-[edge_list *wShortest 10 (e, n | e.duration) travel_time]->(b)
RETURN *;

Screenshot from 2021-10-17 14-47-05

Expected behavior
Query failed: Calculated weight must be numeric, got duration. is wrong because total weight should be able to take any argument that is summable and orderable, not only numeric. + the query should actually work.

Not able to include mgp.py in IDE

When creating query modules for making procedures or transformations, would be nice to have a source code for mgp.py. This issue occured for multiple MAGE developers. One solution might be adding this file as some package (for example named mg-dev to) PyPI.

[BUG] When executing the same queries on Memgraph and Neo4j, respectively, different results are returned.

Memgraph version
2.1.1 Docker

Environment
Windows 11
Java API / Cypher

Describe the bug
Hello! I discovered that when I executed the following queries on Memgraph and Neo4j, respectively, different results were returned:

CREATE (n0 :L1{k6:248034764, k10:false});
CREATE (n1 :L2{k15:248034764, k16:'NWYfUF'});
CREATE (n2 :L0{k2:false, k4:true});
CREATE (n3 :L1{k7:false, k10:false});
CREATE (n4 :L2{k16:'CMx'});
CREATE (n5 :L2{k14:248034764});
CREATE (n6 :L1);
CREATE (n7 :L4);
CREATE (n8 :L4{k24:790915693});
CREATE (n9 :L1{k7:false, k9:false, k10:false});
CREATE (n10 :L1{k10:true});
CREATE (n11 :L1);
CREATE (n12 :L1{k6:1787778361});
CREATE (n13 :L4);
CREATE (n14 :L2{k13:'UI', k15:790915693});
CREATE (n15 :L4{k24:1787778361, k26:1136957655});
CREATE (n16 :L0{k2:true});
CREATE (n17 :L3);
MATCH (n0 :L1{k6:248034764, k10:false}), (n12 :L1{k6:1787778361}) MERGE (n0)<-[r0 :T3{k54:'TAA'}]-(n12);
MATCH (n1 :L2{k15:248034764, k16:'NWYfUF'}), (n9 :L1{k7:false, k9:false, k10:false}) MERGE (n1)<-[r1 :T1{k40:790915693}]-(n9);
MATCH (n2 :L0{k2:false, k4:true}), (n11 :L1) MERGE (n2)<-[r2 :T3{k54:'NkomQghhS'}]-(n11);
MATCH (n5 :L2{k14:248034764}), (n16 :L0{k2:true}) MERGE (n5)-[r3 :T2{k49:'RA5gg8Fl'}]->(n16);
MATCH (n9 :L1{k7:false, k9:false, k10:false}), (n5 :L2{k14:248034764}) MERGE (n9)<-[r4 :T0{k32:1787778361}]-(n5);
MATCH (n0) OPTIONAL MATCH (n1 :L2)-[r0 *]-(n2 :L3) OPTIONAL MATCH (n3 :L1),(n1) RETURN DISTINCT 1 AS a0, (n3.k10) AS a1, (n2.k19) AS a2;

To Reproduce

  1. Start Memgraph 2.1.1 and Neo4j 4.3.10, respectively.
  2. Execute the mentioned queries on each graph database.
  3. Compare the result sets.

Expected behavior
One record:
(1, null, null)
But the actual behavior is:
Three records:
(1, false, null)
(1, null, null)
(1, true, null)

Logs
Memgraph:
QQๅ›พ็‰‡20220303224126

Additional context
The explanation from a Neo4j developer (neo4j/neo4j#12839):
QQๅ›พ็‰‡20220303224309

Fix Bolt HELLO message response doesn't contains "server" (default value empty)

Memgraph version
2.3.1

Environment
Windows, Docker, PHP Bolt library

Describe the bug
After connecting to memgraph over bolt first message is "hello" to login into. Server response for this message should be map with keys "server" and "connection_id" (optional "hints"). Currently response contains only "connection_id".

To Reproduce
Steps to reproduce the behavior:

  1. Connect to database over bolt and run hello message
  2. Analyze response

Expected behavior
Response has to contain key "server". Missing key "server" have to contain server agent string identifier like "memgraph/2.3.1".

Fix Kafka consumer group name can't start with a number

Memgraph version
Memgraph v2.3.0

Environment
Mac M1, Docker - memgraph/memgraph image

Describe the bug
I noticed that if I want to create Kafka stream with consumer group starting with number, it is not accepted. If I add the a letter at the beginning and leave the numbers inside this consumer group name, it is accepted. I think that the literal after the CONSUMER_GROUP should be accepted as a string, no matter whether it's starting with a number.

To Reproduce
Steps to reproduce the behavior:

  1. Run the following query:
CREATE KAFKA STREAM amazon_stream
TOPICS book-ratings
TRANSFORM amazon_books.book_ratings
CONSUMER_GROUP 019168b8080945ecb4b1540fbc762a9f
BOOTSTRAP_SERVERS 'get.awesomedata.stream:9093'
CREDENTIALS {'sasl.username':'public',
                'sasl.password':'public',
                'security.protocol':'SASL_PLAINTEXT',
                'sasl.mechanism':'PLAIN'};

Expected behavior
Query Successful output

Logs
Screenshot 2022-07-11 at 14 36 44

Additional context
If I change the above query to:

CREATE KAFKA STREAM amazon_stream
TOPICS book-ratings
TRANSFORM amazon_books.book_ratings
CONSUMER_GROUP a019168b8080945ecb4b1540fbc762a9f
BOOTSTRAP_SERVERS 'get.awesomedata.stream:9093'
CREDENTIALS {'sasl.username':'public',
                'sasl.password':'public',
                'security.protocol':'SASL_PLAINTEXT',
                'sasl.mechanism':'PLAIN'};

the query is successfully executed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.