We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
run GraphCommands.explain raise TypeError

**Version**: 4.1.0

**Python Version**: 3.8

**Platform**: MacOS 12.0.1

**Description**: I'm using redisgraph:2.8.7 with redis-py. I met a error when I run explain. Error:
```python
graph.explain('match (n:person) where n.name = "ken" return n')
```
raise exception
```  
File "/lib/python3.8/site-packages/redis/commands/graph/commands.py", line 140, in explain
    return "\n".join(plan)
TypeError: sequence item 0: expected str instance, bytes found
```

```python
graph.execute_command('GRAPH.EXPLAIN', graph.name, 'match (n:person) where n.name = "ken" return n')
```
return
```python
[b'Results',
 b'    Project',
 b'        Filter',
 b'            Node By Label Scan | (n:person)']
```

The problem is the result that type is List[byte].
I guess the code should modify as this:
```python
    def explain(self, query, params=None):
        """
        Get the execution plan for given query,
        Returns an array of operations.
        For more information see `GRAPH.EXPLAIN <https://oss.redis.com/redisgraph/master/commands/#graphexplain>`_. # noqa

        Args:

        -------
        query:
            The query that will be executed.
        params: dict
            Query parameters.
        """
        if params is not None:
            query = self._build_params_header(params) + query

        plan = self.execute_command("GRAPH.EXPLAIN", self.name, query)
        return "\n".join([b.decode() for b in plan])
```
or
```python
    def explain(self, query, params=None):
        """
        Get the execution plan for given query,
        Returns an array of operations.
        For more information see `GRAPH.EXPLAIN <https://oss.redis.com/redisgraph/master/commands/#graphexplain>`_. # noqa

        Args:

        -------
        query:
            The query that will be executed.
        params: dict
            Query parameters.
        """
        if params is not None:
            query = self._build_params_header(params) + query

        plan = self.execute_command("GRAPH.EXPLAIN", self.name, query)
        return plan
```


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `redis/commands/graph/commands.py`
Content:
```
1 from redis import DataError
2 from redis.exceptions import ResponseError
3 
4 from .exceptions import VersionMismatchException
5 from .query_result import QueryResult
6 
7 
8 class GraphCommands:
9     """RedisGraph Commands"""
10 
11     def commit(self):
12         """
13         Create entire graph.
14         For more information see `CREATE <https://oss.redis.com/redisgraph/master/commands/#create>`_. # noqa
15         """
16         if len(self.nodes) == 0 and len(self.edges) == 0:
17             return None
18 
19         query = "CREATE "
20         for _, node in self.nodes.items():
21             query += str(node) + ","
22 
23         query += ",".join([str(edge) for edge in self.edges])
24 
25         # Discard leading comma.
26         if query[-1] == ",":
27             query = query[:-1]
28 
29         return self.query(query)
30 
31     def query(self, q, params=None, timeout=None, read_only=False, profile=False):
32         """
33         Executes a query against the graph.
34         For more information see `GRAPH.QUERY <https://oss.redis.com/redisgraph/master/commands/#graphquery>`_. # noqa
35 
36         Args:
37 
38         q : str
39             The query.
40         params : dict
41             Query parameters.
42         timeout : int
43             Maximum runtime for read queries in milliseconds.
44         read_only : bool
45             Executes a readonly query if set to True.
46         profile : bool
47             Return details on results produced by and time
48             spent in each operation.
49         """
50 
51         # maintain original 'q'
52         query = q
53 
54         # handle query parameters
55         if params is not None:
56             query = self._build_params_header(params) + query
57 
58         # construct query command
59         # ask for compact result-set format
60         # specify known graph version
61         if profile:
62             cmd = "GRAPH.PROFILE"
63         else:
64             cmd = "GRAPH.RO_QUERY" if read_only else "GRAPH.QUERY"
65         command = [cmd, self.name, query, "--compact"]
66 
67         # include timeout is specified
68         if timeout:
69             if not isinstance(timeout, int):
70                 raise Exception("Timeout argument must be a positive integer")
71             command += ["timeout", timeout]
72 
73         # issue query
74         try:
75             response = self.execute_command(*command)
76             return QueryResult(self, response, profile)
77         except ResponseError as e:
78             if "wrong number of arguments" in str(e):
79                 print(
80                     "Note: RedisGraph Python requires server version 2.2.8 or above"
81                 )  # noqa
82             if "unknown command" in str(e) and read_only:
83                 # `GRAPH.RO_QUERY` is unavailable in older versions.
84                 return self.query(q, params, timeout, read_only=False)
85             raise e
86         except VersionMismatchException as e:
87             # client view over the graph schema is out of sync
88             # set client version and refresh local schema
89             self.version = e.version
90             self._refresh_schema()
91             # re-issue query
92             return self.query(q, params, timeout, read_only)
93 
94     def merge(self, pattern):
95         """
96         Merge pattern.
97         For more information see `MERGE <https://oss.redis.com/redisgraph/master/commands/#merge>`_. # noqa
98         """
99         query = "MERGE "
100         query += str(pattern)
101 
102         return self.query(query)
103 
104     def delete(self):
105         """
106         Deletes graph.
107         For more information see `DELETE <https://oss.redis.com/redisgraph/master/commands/#delete>`_. # noqa
108         """
109         self._clear_schema()
110         return self.execute_command("GRAPH.DELETE", self.name)
111 
112     # declared here, to override the built in redis.db.flush()
113     def flush(self):
114         """
115         Commit the graph and reset the edges and the nodes to zero length.
116         """
117         self.commit()
118         self.nodes = {}
119         self.edges = []
120 
121     def explain(self, query, params=None):
122         """
123         Get the execution plan for given query,
124         Returns an array of operations.
125         For more information see `GRAPH.EXPLAIN <https://oss.redis.com/redisgraph/master/commands/#graphexplain>`_. # noqa
126 
127         Args:
128 
129         query:
130             The query that will be executed.
131         params: dict
132             Query parameters.
133         """
134         if params is not None:
135             query = self._build_params_header(params) + query
136 
137         plan = self.execute_command("GRAPH.EXPLAIN", self.name, query)
138         return "\n".join(plan)
139 
140     def bulk(self, **kwargs):
141         """Internal only. Not supported."""
142         raise NotImplementedError(
143             "GRAPH.BULK is internal only. "
144             "Use https://github.com/redisgraph/redisgraph-bulk-loader."
145         )
146 
147     def profile(self, query):
148         """
149         Execute a query and produce an execution plan augmented with metrics
150         for each operation's execution. Return a string representation of a
151         query execution plan, with details on results produced by and time
152         spent in each operation.
153         For more information see `GRAPH.PROFILE <https://oss.redis.com/redisgraph/master/commands/#graphprofile>`_. # noqa
154         """
155         return self.query(query, profile=True)
156 
157     def slowlog(self):
158         """
159         Get a list containing up to 10 of the slowest queries issued
160         against the given graph ID.
161         For more information see `GRAPH.SLOWLOG <https://oss.redis.com/redisgraph/master/commands/#graphslowlog>`_. # noqa
162 
163         Each item in the list has the following structure:
164         1. A unix timestamp at which the log entry was processed.
165         2. The issued command.
166         3. The issued query.
167         4. The amount of time needed for its execution, in milliseconds.
168         """
169         return self.execute_command("GRAPH.SLOWLOG", self.name)
170 
171     def config(self, name, value=None, set=False):
172         """
173         Retrieve or update a RedisGraph configuration.
174         For more information see `GRAPH.CONFIG <https://oss.redis.com/redisgraph/master/commands/#graphconfig>`_. # noqa
175 
176         Args:
177 
178         name : str
179             The name of the configuration
180         value :
181             The value we want to set (can be used only when `set` is on)
182         set : bool
183             Turn on to set a configuration. Default behavior is get.
184         """
185         params = ["SET" if set else "GET", name]
186         if value is not None:
187             if set:
188                 params.append(value)
189             else:
190                 raise DataError(
191                     "``value`` can be provided only when ``set`` is True"
192                 )  # noqa
193         return self.execute_command("GRAPH.CONFIG", *params)
194 
195     def list_keys(self):
196         """
197         Lists all graph keys in the keyspace.
198         For more information see `GRAPH.LIST <https://oss.redis.com/redisgraph/master/commands/#graphlist>`_. # noqa
199         """
200         return self.execute_command("GRAPH.LIST")
201
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/redis/commands/graph/commands.py b/redis/commands/graph/commands.py
--- a/redis/commands/graph/commands.py
+++ b/redis/commands/graph/commands.py
@@ -135,6 +135,8 @@
             query = self._build_params_header(params) + query
 
         plan = self.execute_command("GRAPH.EXPLAIN", self.name, query)
+        if isinstance(plan[0], bytes):
+            plan = [b.decode() for b in plan]
         return "\n".join(plan)
 
     def bulk(self, **kwargs):

{"golden_diff": "diff --git a/redis/commands/graph/commands.py b/redis/commands/graph/commands.py\n--- a/redis/commands/graph/commands.py\n+++ b/redis/commands/graph/commands.py\n@@ -135,6 +135,8 @@\n             query = self._build_params_header(params) + query\n \n         plan = self.execute_command(\"GRAPH.EXPLAIN\", self.name, query)\n+        if isinstance(plan[0], bytes):\n+            plan = [b.decode() for b in plan]\n         return \"\\n\".join(plan)\n \n     def bulk(self, **kwargs):\n", "issue": "run GraphCommands.explain raise TypeError\n\r\n**Version**: 4.1.0\r\n\r\n**Python Version**: 3.8\r\n\r\n**Platform**: MacOS 12.0.1\r\n\r\n**Description**: I'm using redisgraph:2.8.7 with redis-py. I met a error when I run explain. Error:\r\n```python\r\ngraph.explain('match (n:person) where n.name = \"ken\" return n')\r\n```\r\nraise exception\r\n```  \r\nFile \"/lib/python3.8/site-packages/redis/commands/graph/commands.py\", line 140, in explain\r\n    return \"\\n\".join(plan)\r\nTypeError: sequence item 0: expected str instance, bytes found\r\n```\r\n\r\n```python\r\ngraph.execute_command('GRAPH.EXPLAIN', graph.name, 'match (n:person) where n.name = \"ken\" return n')\r\n```\r\nreturn\r\n```python\r\n[b'Results',\r\n b'    Project',\r\n b'        Filter',\r\n b'            Node By Label Scan | (n:person)']\r\n```\r\n\r\nThe problem is the result that type is List[byte].\r\nI guess the code should modify as this:\r\n```python\r\n    def explain(self, query, params=None):\r\n        \"\"\"\r\n        Get the execution plan for given query,\r\n        Returns an array of operations.\r\n        For more information see `GRAPH.EXPLAIN <https://oss.redis.com/redisgraph/master/commands/#graphexplain>`_. # noqa\r\n\r\n        Args:\r\n\r\n        -------\r\n        query:\r\n            The query that will be executed.\r\n        params: dict\r\n            Query parameters.\r\n        \"\"\"\r\n        if params is not None:\r\n            query = self._build_params_header(params) + query\r\n\r\n        plan = self.execute_command(\"GRAPH.EXPLAIN\", self.name, query)\r\n        return \"\\n\".join([b.decode() for b in plan])\r\n```\r\nor\r\n```python\r\n    def explain(self, query, params=None):\r\n        \"\"\"\r\n        Get the execution plan for given query,\r\n        Returns an array of operations.\r\n        For more information see `GRAPH.EXPLAIN <https://oss.redis.com/redisgraph/master/commands/#graphexplain>`_. # noqa\r\n\r\n        Args:\r\n\r\n        -------\r\n        query:\r\n            The query that will be executed.\r\n        params: dict\r\n            Query parameters.\r\n        \"\"\"\r\n        if params is not None:\r\n            query = self._build_params_header(params) + query\r\n\r\n        plan = self.execute_command(\"GRAPH.EXPLAIN\", self.name, query)\r\n        return plan\r\n```\r\n\n", "before_files": [{"content": "from redis import DataError\nfrom redis.exceptions import ResponseError\n\nfrom .exceptions import VersionMismatchException\nfrom .query_result import QueryResult\n\n\nclass GraphCommands:\n    \"\"\"RedisGraph Commands\"\"\"\n\n    def commit(self):\n        \"\"\"\n        Create entire graph.\n        For more information see `CREATE <https://oss.redis.com/redisgraph/master/commands/#create>`_. # noqa\n        \"\"\"\n        if len(self.nodes) == 0 and len(self.edges) == 0:\n            return None\n\n        query = \"CREATE \"\n        for _, node in self.nodes.items():\n            query += str(node) + \",\"\n\n        query += \",\".join([str(edge) for edge in self.edges])\n\n        # Discard leading comma.\n        if query[-1] == \",\":\n            query = query[:-1]\n\n        return self.query(query)\n\n    def query(self, q, params=None, timeout=None, read_only=False, profile=False):\n        \"\"\"\n        Executes a query against the graph.\n        For more information see `GRAPH.QUERY <https://oss.redis.com/redisgraph/master/commands/#graphquery>`_. # noqa\n\n        Args:\n\n        q : str\n            The query.\n        params : dict\n            Query parameters.\n        timeout : int\n            Maximum runtime for read queries in milliseconds.\n        read_only : bool\n            Executes a readonly query if set to True.\n        profile : bool\n            Return details on results produced by and time\n            spent in each operation.\n        \"\"\"\n\n        # maintain original 'q'\n        query = q\n\n        # handle query parameters\n        if params is not None:\n            query = self._build_params_header(params) + query\n\n        # construct query command\n        # ask for compact result-set format\n        # specify known graph version\n        if profile:\n            cmd = \"GRAPH.PROFILE\"\n        else:\n            cmd = \"GRAPH.RO_QUERY\" if read_only else \"GRAPH.QUERY\"\n        command = [cmd, self.name, query, \"--compact\"]\n\n        # include timeout is specified\n        if timeout:\n            if not isinstance(timeout, int):\n                raise Exception(\"Timeout argument must be a positive integer\")\n            command += [\"timeout\", timeout]\n\n        # issue query\n        try:\n            response = self.execute_command(*command)\n            return QueryResult(self, response, profile)\n        except ResponseError as e:\n            if \"wrong number of arguments\" in str(e):\n                print(\n                    \"Note: RedisGraph Python requires server version 2.2.8 or above\"\n                )  # noqa\n            if \"unknown command\" in str(e) and read_only:\n                # `GRAPH.RO_QUERY` is unavailable in older versions.\n                return self.query(q, params, timeout, read_only=False)\n            raise e\n        except VersionMismatchException as e:\n            # client view over the graph schema is out of sync\n            # set client version and refresh local schema\n            self.version = e.version\n            self._refresh_schema()\n            # re-issue query\n            return self.query(q, params, timeout, read_only)\n\n    def merge(self, pattern):\n        \"\"\"\n        Merge pattern.\n        For more information see `MERGE <https://oss.redis.com/redisgraph/master/commands/#merge>`_. # noqa\n        \"\"\"\n        query = \"MERGE \"\n        query += str(pattern)\n\n        return self.query(query)\n\n    def delete(self):\n        \"\"\"\n        Deletes graph.\n        For more information see `DELETE <https://oss.redis.com/redisgraph/master/commands/#delete>`_. # noqa\n        \"\"\"\n        self._clear_schema()\n        return self.execute_command(\"GRAPH.DELETE\", self.name)\n\n    # declared here, to override the built in redis.db.flush()\n    def flush(self):\n        \"\"\"\n        Commit the graph and reset the edges and the nodes to zero length.\n        \"\"\"\n        self.commit()\n        self.nodes = {}\n        self.edges = []\n\n    def explain(self, query, params=None):\n        \"\"\"\n        Get the execution plan for given query,\n        Returns an array of operations.\n        For more information see `GRAPH.EXPLAIN <https://oss.redis.com/redisgraph/master/commands/#graphexplain>`_. # noqa\n\n        Args:\n\n        query:\n            The query that will be executed.\n        params: dict\n            Query parameters.\n        \"\"\"\n        if params is not None:\n            query = self._build_params_header(params) + query\n\n        plan = self.execute_command(\"GRAPH.EXPLAIN\", self.name, query)\n        return \"\\n\".join(plan)\n\n    def bulk(self, **kwargs):\n        \"\"\"Internal only. Not supported.\"\"\"\n        raise NotImplementedError(\n            \"GRAPH.BULK is internal only. \"\n            \"Use https://github.com/redisgraph/redisgraph-bulk-loader.\"\n        )\n\n    def profile(self, query):\n        \"\"\"\n        Execute a query and produce an execution plan augmented with metrics\n        for each operation's execution. Return a string representation of a\n        query execution plan, with details on results produced by and time\n        spent in each operation.\n        For more information see `GRAPH.PROFILE <https://oss.redis.com/redisgraph/master/commands/#graphprofile>`_. # noqa\n        \"\"\"\n        return self.query(query, profile=True)\n\n    def slowlog(self):\n        \"\"\"\n        Get a list containing up to 10 of the slowest queries issued\n        against the given graph ID.\n        For more information see `GRAPH.SLOWLOG <https://oss.redis.com/redisgraph/master/commands/#graphslowlog>`_. # noqa\n\n        Each item in the list has the following structure:\n        1. A unix timestamp at which the log entry was processed.\n        2. The issued command.\n        3. The issued query.\n        4. The amount of time needed for its execution, in milliseconds.\n        \"\"\"\n        return self.execute_command(\"GRAPH.SLOWLOG\", self.name)\n\n    def config(self, name, value=None, set=False):\n        \"\"\"\n        Retrieve or update a RedisGraph configuration.\n        For more information see `GRAPH.CONFIG <https://oss.redis.com/redisgraph/master/commands/#graphconfig>`_. # noqa\n\n        Args:\n\n        name : str\n            The name of the configuration\n        value :\n            The value we want to set (can be used only when `set` is on)\n        set : bool\n            Turn on to set a configuration. Default behavior is get.\n        \"\"\"\n        params = [\"SET\" if set else \"GET\", name]\n        if value is not None:\n            if set:\n                params.append(value)\n            else:\n                raise DataError(\n                    \"``value`` can be provided only when ``set`` is True\"\n                )  # noqa\n        return self.execute_command(\"GRAPH.CONFIG\", *params)\n\n    def list_keys(self):\n        \"\"\"\n        Lists all graph keys in the keyspace.\n        For more information see `GRAPH.LIST <https://oss.redis.com/redisgraph/master/commands/#graphlist>`_. # noqa\n        \"\"\"\n        return self.execute_command(\"GRAPH.LIST\")\n", "path": "redis/commands/graph/commands.py"}], "after_files": [{"content": "from redis import DataError\nfrom redis.exceptions import ResponseError\n\nfrom .exceptions import VersionMismatchException\nfrom .query_result import QueryResult\n\n\nclass GraphCommands:\n    \"\"\"RedisGraph Commands\"\"\"\n\n    def commit(self):\n        \"\"\"\n        Create entire graph.\n        For more information see `CREATE <https://oss.redis.com/redisgraph/master/commands/#create>`_. # noqa\n        \"\"\"\n        if len(self.nodes) == 0 and len(self.edges) == 0:\n            return None\n\n        query = \"CREATE \"\n        for _, node in self.nodes.items():\n            query += str(node) + \",\"\n\n        query += \",\".join([str(edge) for edge in self.edges])\n\n        # Discard leading comma.\n        if query[-1] == \",\":\n            query = query[:-1]\n\n        return self.query(query)\n\n    def query(self, q, params=None, timeout=None, read_only=False, profile=False):\n        \"\"\"\n        Executes a query against the graph.\n        For more information see `GRAPH.QUERY <https://oss.redis.com/redisgraph/master/commands/#graphquery>`_. # noqa\n\n        Args:\n\n        q : str\n            The query.\n        params : dict\n            Query parameters.\n        timeout : int\n            Maximum runtime for read queries in milliseconds.\n        read_only : bool\n            Executes a readonly query if set to True.\n        profile : bool\n            Return details on results produced by and time\n            spent in each operation.\n        \"\"\"\n\n        # maintain original 'q'\n        query = q\n\n        # handle query parameters\n        if params is not None:\n            query = self._build_params_header(params) + query\n\n        # construct query command\n        # ask for compact result-set format\n        # specify known graph version\n        if profile:\n            cmd = \"GRAPH.PROFILE\"\n        else:\n            cmd = \"GRAPH.RO_QUERY\" if read_only else \"GRAPH.QUERY\"\n        command = [cmd, self.name, query, \"--compact\"]\n\n        # include timeout is specified\n        if timeout:\n            if not isinstance(timeout, int):\n                raise Exception(\"Timeout argument must be a positive integer\")\n            command += [\"timeout\", timeout]\n\n        # issue query\n        try:\n            response = self.execute_command(*command)\n            return QueryResult(self, response, profile)\n        except ResponseError as e:\n            if \"wrong number of arguments\" in str(e):\n                print(\n                    \"Note: RedisGraph Python requires server version 2.2.8 or above\"\n                )  # noqa\n            if \"unknown command\" in str(e) and read_only:\n                # `GRAPH.RO_QUERY` is unavailable in older versions.\n                return self.query(q, params, timeout, read_only=False)\n            raise e\n        except VersionMismatchException as e:\n            # client view over the graph schema is out of sync\n            # set client version and refresh local schema\n            self.version = e.version\n            self._refresh_schema()\n            # re-issue query\n            return self.query(q, params, timeout, read_only)\n\n    def merge(self, pattern):\n        \"\"\"\n        Merge pattern.\n        For more information see `MERGE <https://oss.redis.com/redisgraph/master/commands/#merge>`_. # noqa\n        \"\"\"\n        query = \"MERGE \"\n        query += str(pattern)\n\n        return self.query(query)\n\n    def delete(self):\n        \"\"\"\n        Deletes graph.\n        For more information see `DELETE <https://oss.redis.com/redisgraph/master/commands/#delete>`_. # noqa\n        \"\"\"\n        self._clear_schema()\n        return self.execute_command(\"GRAPH.DELETE\", self.name)\n\n    # declared here, to override the built in redis.db.flush()\n    def flush(self):\n        \"\"\"\n        Commit the graph and reset the edges and the nodes to zero length.\n        \"\"\"\n        self.commit()\n        self.nodes = {}\n        self.edges = []\n\n    def explain(self, query, params=None):\n        \"\"\"\n        Get the execution plan for given query,\n        Returns an array of operations.\n        For more information see `GRAPH.EXPLAIN <https://oss.redis.com/redisgraph/master/commands/#graphexplain>`_. # noqa\n\n        Args:\n\n        query:\n            The query that will be executed.\n        params: dict\n            Query parameters.\n        \"\"\"\n        if params is not None:\n            query = self._build_params_header(params) + query\n\n        plan = self.execute_command(\"GRAPH.EXPLAIN\", self.name, query)\n        if isinstance(plan[0], bytes):\n            plan = [b.decode() for b in plan]\n        return \"\\n\".join(plan)\n\n    def bulk(self, **kwargs):\n        \"\"\"Internal only. Not supported.\"\"\"\n        raise NotImplementedError(\n            \"GRAPH.BULK is internal only. \"\n            \"Use https://github.com/redisgraph/redisgraph-bulk-loader.\"\n        )\n\n    def profile(self, query):\n        \"\"\"\n        Execute a query and produce an execution plan augmented with metrics\n        for each operation's execution. Return a string representation of a\n        query execution plan, with details on results produced by and time\n        spent in each operation.\n        For more information see `GRAPH.PROFILE <https://oss.redis.com/redisgraph/master/commands/#graphprofile>`_. # noqa\n        \"\"\"\n        return self.query(query, profile=True)\n\n    def slowlog(self):\n        \"\"\"\n        Get a list containing up to 10 of the slowest queries issued\n        against the given graph ID.\n        For more information see `GRAPH.SLOWLOG <https://oss.redis.com/redisgraph/master/commands/#graphslowlog>`_. # noqa\n\n        Each item in the list has the following structure:\n        1. A unix timestamp at which the log entry was processed.\n        2. The issued command.\n        3. The issued query.\n        4. The amount of time needed for its execution, in milliseconds.\n        \"\"\"\n        return self.execute_command(\"GRAPH.SLOWLOG\", self.name)\n\n    def config(self, name, value=None, set=False):\n        \"\"\"\n        Retrieve or update a RedisGraph configuration.\n        For more information see `GRAPH.CONFIG <https://oss.redis.com/redisgraph/master/commands/#graphconfig>`_. # noqa\n\n        Args:\n\n        name : str\n            The name of the configuration\n        value :\n            The value we want to set (can be used only when `set` is on)\n        set : bool\n            Turn on to set a configuration. Default behavior is get.\n        \"\"\"\n        params = [\"SET\" if set else \"GET\", name]\n        if value is not None:\n            if set:\n                params.append(value)\n            else:\n                raise DataError(\n                    \"``value`` can be provided only when ``set`` is True\"\n                )  # noqa\n        return self.execute_command(\"GRAPH.CONFIG\", *params)\n\n    def list_keys(self):\n        \"\"\"\n        Lists all graph keys in the keyspace.\n        For more information see `GRAPH.LIST <https://oss.redis.com/redisgraph/master/commands/#graphlist>`_. # noqa\n        \"\"\"\n        return self.execute_command(\"GRAPH.LIST\")\n", "path": "redis/commands/graph/commands.py"}]}