# TypeDB Python Driver
## Driver Architecture
To learn about the mechanism that TypeDB drivers use to set up communication with databases running on the TypeDB
Server, refer to the [Drivers Overview](https://typedb.com/docs/drivers/overview).
## API Reference
To learn about the methods available for executing queries and retrieving their answers using Python, refer to
the [API Reference](https://typedb.com/docs/drivers/python/api-reference).
## Install TypeDB Python Driver through Pip
1. Install `typedb-driver` using `pip`:
```bash
pip install typedb-driver
```
2. If multiple Python versions are available, you may wish to use:
```
pip3 install typedb-driver
```
3. Make sure the [TypeDB Server](https://docs.typedb.com/docs/running-typedb/install-and-run#start-the-typedb-server) is running.
4. In your python program, import from `typedb.driver` (see [Example usage](#example-usage) or `tests/integration` for examples):
```py
from typedb.driver import *
driver = TypeDB.core_driver(address=TypeDB.DEFAULT_ADDRESS)
```
## Example usage
### TypeDB Cloud / Enterprise (Cloud driver)
<!-- CLOUD_EXAMPLE_START_MARKER -->
```py
from typedb.driver import *
class TypeDBExample:
def typedb_example():
# Open a driver connection. The connection will be automatically closed on the "with" block exit
with TypeDB.cloud_driver(TypeDB.DEFAULT_ADDRESS, Credentials("admin", "password"), DriverOptions()) as driver:
# Create a database
driver.databases.create("typedb")
database = driver.databases.get("typedb")
# Use "try" blocks to catch driver exceptions
try:
# Open transactions of 3 types
tx = driver.transaction(database.name, TransactionType.READ)
# Execute any TypeDB query using TypeQL. Wrong queries are rejected with an explicit exception
result_promise = tx.query("define entity i-cannot-be-defined-in-read-transactions;")
print("The result is still promised, so it needs resolving even in case of errors!")
result_promise.resolve()
except TypeDBDriverException as expected_exception:
print(f"Once the query's promise is resolved, the exception is revealed: {expected_exception}")
finally:
# Don't forget to close the transaction!
tx.close()
# Open a schema transaction to make schema changes
# Use "with" blocks to forget about "close" operations (similarly to connections)
with driver.transaction(database.name, TransactionType.SCHEMA) as tx:
define_query = """
define
entity person, owns name, owns age;
attribute name, value string;
attribute age, value integer;
"""
answer = tx.query(define_query).resolve()
if answer.is_ok():
print(f"OK results do not give any extra interesting information, but they mean that the query "
f"is successfully executed!")
# Commit automatically closes the transaction. It can still be safely called inside "with" blocks
tx.commit()
# Open a read transaction to safely read anything without database modifications
with driver.transaction(database.name, TransactionType.READ) as tx:
answer = tx.query("match entity $x;").resolve()
# Collect concept rows that represent the answer as a table
rows = list(answer.as_concept_rows())
row = rows[0]
# Collect column names to get concepts by index if the variable names are lost
header = list(row.column_names())
column_name = header[0]
# Get concept by the variable name (column name)
concept_by_name = row.get(column_name)
# Get concept by the header's index
concept_by_index = row.get_index(0)
print(f"Getting concepts by variable names ({concept_by_name.get_label()}) and "
f"indexes ({concept_by_index.get_label()}) is equally correct. ")
# Check if it's an entity type before the conversion
if concept_by_name.is_entity_type():
print(f"Both represent the defined entity type: '{concept_by_name.as_entity_type().get_label()}' "
f"(in case of a doubt: '{concept_by_index.as_entity_type().get_label()}')")
# Continue querying in the same transaction if needed
answer = tx.query("match attribute $a;").resolve()
# Concept rows can be used as any other iterator
rows = [row for row in answer.as_concept_rows()]
for row in rows:
# Same for column names
column_names_iter = row.column_names()
column_name = next(column_names_iter)
concept_by_name = row.get(column_name)
# Check if it's an attribute type before the conversion
if concept_by_name.is_attribute_type():
attribute_type = concept_by_name.as_attribute_type()
print(f"Defined attribute type's label: '{attribute_type.get_label()}', "
f"value type: '{attribute_type.try_get_value_type()}'")
print(f"It is also possible to just print the concept itself: '{concept_by_name}'")
# Open a write transaction to insert data
with driver.transaction(database.name, TransactionType.WRITE) as tx:
insert_query = "insert $z isa person, has age 10; $x isa person, has age 20, has name \"John\";"
answer = tx.query(insert_query).resolve()
# Insert queries also return concept rows
rows = list(answer.as_concept_rows())
row = rows[0]
for column_name in row.column_names():
inserted_concept = row.get(column_name)
print(f"Successfully inserted ${column_name}: {inserted_concept}")
if inserted_concept.is_entity():
print("This time, it's an entity, not a type!")
# It is possible to ask for the column names again
header = [name for name in row.column_names()]
x = row.get_index(header.index("x"))
print(
"As we expect an entity instance, we can try to get its IID (unique identification): {x.try_get_iid()}. ")
if x.is_entity():
print(f"It can also be retrieved directly and safely after a cast: {x.as_entity().get_iid()}")
# Do not forget to commit if the changes should be persisted
tx.commit()
# Open another write transaction to try inserting even more data
with driver.transaction(database.name, TransactionType.WRITE) as tx:
# When loading a large dataset, it's often better not to resolve every query's promise immediately.
# Instead, collect promises and handle them later. Alternatively, if a commit is expected in the end,
# just call `commit`, which will wait for all ongoing operations to finish before executing.
queries = ["insert $a isa person, has name \"Alice\";", "insert $b isa person, has name \"Bob\";"]
for query in queries:
tx.query(query)
tx.commit()
with driver.transaction(database.name, TransactionType.WRITE) as tx:
# Commit will still fail if at least one of the queries produce an error.
queries = ["insert $c isa not-person, has name \"Chris\";", "insert $d isa person, has name \"David\";"]
promises = []
for query in queries:
promises.append(tx.query(query))
try:
tx.commit()
assert False, "TypeDBDriverException is expected"
except TypeDBDriverException as expected_exception:
print(f"Commit result will contain the unresolved query's error: {expected_exception}")
# Open a read transaction to verify that the previously inserted data is saved
with driver.transaction(database.name, TransactionType.READ) as tx:
# A match query can be used for concept row outputs
var = "x"
answer = tx.query(f"match ${var} isa person;").resolve()
# Simple match queries always return concept rows
count = 0
for row in answer.as_concept_rows():
x = row.get(var)
x_type = x.as_entity().get_type().as_entity_type()
count += 1
print(f"Found a person {x} of type {x_type}")
print(f"Total persons found: {count}")
# A fetch query can be used for concept document outputs with flexible structure
fetch_query = """
match
$x isa! person, has $a;
$a isa! $t;
fetch {
"single attribute type": $t,
"single attribute": $a,
"all attributes": { $x.* },
};
"""
answer = tx.query(fetch_query).resolve()
# Fetch queries always return concept documents
count = 0
for document in answer.as_concept_documents():
count += 1
print(f"Fetched a document: {document}.")
print(f"This document contains an attribute of type: {document['single attribute type']['label']}")
print(f"Total documents fetched: {count}")
print("More examples can be found in the API reference and the documentation.\nWelcome to TypeDB!")
```
<!-- CLOUD_EXAMPLE_END_MARKER -->
### TypeDB CE (Core driver)
<!-- CORE_EXAMPLE_START_MARKER -->
```py
from typedb.driver import *
class TypeDBExample:
def typedb_example():
# Open a driver connection. The connection will be automatically closed on the "with" block exit
with TypeDB.core_driver(TypeDB.DEFAULT_ADDRESS, Credentials("admin", "password"), DriverOptions()) as driver:
# Create a database
driver.databases.create("typedb")
database = driver.databases.get("typedb")
# Use "try" blocks to catch driver exceptions
try:
# Open transactions of 3 types
tx = driver.transaction(database.name, TransactionType.READ)
# Execute any TypeDB query using TypeQL. Wrong queries are rejected with an explicit exception
result_promise = tx.query("define entity i-cannot-be-defined-in-read-transactions;")
print("The result is still promised, so it needs resolving even in case of errors!")
result_promise.resolve()
except TypeDBDriverException as expected_exception:
print(f"Once the query's promise is resolved, the exception is revealed: {expected_exception}")
finally:
# Don't forget to close the transaction!
tx.close()
# Open a schema transaction to make schema changes
# Use "with" blocks to forget about "close" operations (similarly to connections)
with driver.transaction(database.name, TransactionType.SCHEMA) as tx:
define_query = """
define
entity person, owns name, owns age;
attribute name, value string;
attribute age, value integer;
"""
answer = tx.query(define_query).resolve()
if answer.is_ok():
print(f"OK results do not give any extra interesting information, but they mean that the query "
f"is successfully executed!")
# Commit automatically closes the transaction. It can still be safely called inside "with" blocks
tx.commit()
# Open a read transaction to safely read anything without database modifications
with driver.transaction(database.name, TransactionType.READ) as tx:
answer = tx.query("match entity $x;").resolve()
# Collect concept rows that represent the answer as a table
rows = list(answer.as_concept_rows())
row = rows[0]
# Collect column names to get concepts by index if the variable names are lost
header = list(row.column_names())
column_name = header[0]
# Get concept by the variable name (column name)
concept_by_name = row.get(column_name)
# Get concept by the header's index
concept_by_index = row.get_index(0)
print(f"Getting concepts by variable names ({concept_by_name.get_label()}) and "
f"indexes ({concept_by_index.get_label()}) is equally correct. ")
# Check if it's an entity type before the conversion
if concept_by_name.is_entity_type():
print(f"Both represent the defined entity type: '{concept_by_name.as_entity_type().get_label()}' "
f"(in case of a doubt: '{concept_by_index.as_entity_type().get_label()}')")
# Continue querying in the same transaction if needed
answer = tx.query("match attribute $a;").resolve()
# Concept rows can be used as any other iterator
rows = [row for row in answer.as_concept_rows()]
for row in rows:
# Same for column names
column_names_iter = row.column_names()
column_name = next(column_names_iter)
concept_by_name = row.get(column_name)
# Check if it's an attribute type before the conversion
if concept_by_name.is_attribute_type():
attribute_type = concept_by_name.as_attribute_type()
print(f"Defined attribute type's label: '{attribute_type.get_label()}', "
f"value type: '{attribute_type.try_get_value_type()}'")
print(f"It is also possible to just print the concept itself: '{concept_by_name}'")
# Open a write transaction to insert data
with driver.transaction(database.name, TransactionType.WRITE) as tx:
insert_query = "insert $z isa person, has age 10; $x isa person, has age 20, has name \"John\";"
answer = tx.query(insert_query).resolve()
# Insert queries also return concept rows
rows = list(answer.as_concept_rows())
row = rows[0]
for column_name in row.column_names():
inserted_concept = row.get(column_name)
print(f"Successfully inserted ${column_name}: {inserted_concept}")
if inserted_concept.is_entity():
print("This time, it's an entity, not a type!")
# It is possible to ask for the column names again
header = [name for name in row.column_names()]
x = row.get_index(header.index("x"))
print(
"As we expect an entity instance, we can try to get its IID (unique identification): {x.try_get_iid()}. ")
if x.is_entity():
print(f"It can also be retrieved directly and safely after a cast: {x.as_entity().get_iid()}")
# Do not forget to commit if the changes should be persisted
tx.commit()
# Open another write transaction to try inserting even more data
with driver.transaction(database.name, TransactionType.WRITE) as tx:
# When loading a large dataset, it's often better not to resolve every query's promise immediately.
# Instead, collect promises and handle them later. Alternatively, if a commit is expected in the end,
# just call `commit`, which will wait for all ongoing operations to finish before executing.
queries = ["insert $a isa person, has name \"Alice\";", "insert $b isa person, has name \"Bob\";"]
for query in queries:
tx.query(query)
tx.commit()
with driver.transaction(database.name, TransactionType.WRITE) as tx:
# Commit will still fail if at least one of the queries produce an error.
queries = ["insert $c isa not-person, has name \"Chris\";", "insert $d isa person, has name \"David\";"]
promises = []
for query in queries:
promises.append(tx.query(query))
try:
tx.commit()
assert False, "TypeDBDriverException is expected"
except TypeDBDriverException as expected_exception:
print(f"Commit result will contain the unresolved query's error: {expected_exception}")
# Open a read transaction to verify that the previously inserted data is saved
with driver.transaction(database.name, TransactionType.READ) as tx:
# A match query can be used for concept row outputs
var = "x"
answer = tx.query(f"match ${var} isa person;").resolve()
# Simple match queries always return concept rows
count = 0
for row in answer.as_concept_rows():
x = row.get(var)
x_type = x.as_entity().get_type().as_entity_type()
count += 1
print(f"Found a person {x} of type {x_type}")
print(f"Total persons found: {count}")
# A fetch query can be used for concept document outputs with flexible structure
fetch_query = """
match
$x isa! person, has $a;
$a isa! $t;
fetch {
"single attribute type": $t,
"single attribute": $a,
"all attributes": { $x.* },
};
"""
answer = tx.query(fetch_query).resolve()
# Fetch queries always return concept documents
count = 0
for document in answer.as_concept_documents():
count += 1
print(f"Fetched a document: {document}.")
print(f"This document contains an attribute of type: {document['single attribute type']['label']}")
print(f"Total documents fetched: {count}")
print("More examples can be found in the API reference and the documentation.\nWelcome to TypeDB!")
```
<!-- CORE_EXAMPLE_END_MARKER -->
Raw data
{
"_id": null,
"home_page": "https://github.com/typedb/typedb-driver-python/",
"name": "typedb-driver",
"maintainer": null,
"docs_url": null,
"requires_python": ">0",
"maintainer_email": null,
"keywords": "typedb database graph knowledgebase knowledge-engineering",
"author": "TypeDB Community",
"author_email": "community@typedb.com",
"download_url": null,
"platform": null,
"description": "# TypeDB Python Driver\n\n## Driver Architecture\n\nTo learn about the mechanism that TypeDB drivers use to set up communication with databases running on the TypeDB\nServer, refer to the [Drivers Overview](https://typedb.com/docs/drivers/overview).\n\n## API Reference\n\nTo learn about the methods available for executing queries and retrieving their answers using Python, refer to\nthe [API Reference](https://typedb.com/docs/drivers/python/api-reference).\n\n## Install TypeDB Python Driver through Pip\n1. Install `typedb-driver` using `pip`:\n```bash\npip install typedb-driver\n```\n2. If multiple Python versions are available, you may wish to use:\n```\npip3 install typedb-driver\n```\n3. Make sure the [TypeDB Server](https://docs.typedb.com/docs/running-typedb/install-and-run#start-the-typedb-server) is running.\n4. In your python program, import from `typedb.driver` (see [Example usage](#example-usage) or `tests/integration` for examples):\n```py\nfrom typedb.driver import *\n\ndriver = TypeDB.core_driver(address=TypeDB.DEFAULT_ADDRESS)\n```\n\n## Example usage\n\n### TypeDB Cloud / Enterprise (Cloud driver)\n\n<!-- CLOUD_EXAMPLE_START_MARKER -->\n\n```py\nfrom typedb.driver import *\n\n\nclass TypeDBExample:\n\n def typedb_example():\n # Open a driver connection. The connection will be automatically closed on the \"with\" block exit\n with TypeDB.cloud_driver(TypeDB.DEFAULT_ADDRESS, Credentials(\"admin\", \"password\"), DriverOptions()) as driver:\n # Create a database\n driver.databases.create(\"typedb\")\n database = driver.databases.get(\"typedb\")\n\n # Use \"try\" blocks to catch driver exceptions\n try:\n # Open transactions of 3 types\n tx = driver.transaction(database.name, TransactionType.READ)\n\n # Execute any TypeDB query using TypeQL. Wrong queries are rejected with an explicit exception\n result_promise = tx.query(\"define entity i-cannot-be-defined-in-read-transactions;\")\n\n print(\"The result is still promised, so it needs resolving even in case of errors!\")\n result_promise.resolve()\n except TypeDBDriverException as expected_exception:\n print(f\"Once the query's promise is resolved, the exception is revealed: {expected_exception}\")\n finally:\n # Don't forget to close the transaction!\n tx.close()\n\n # Open a schema transaction to make schema changes\n # Use \"with\" blocks to forget about \"close\" operations (similarly to connections)\n with driver.transaction(database.name, TransactionType.SCHEMA) as tx:\n define_query = \"\"\"\n define \n entity person, owns name, owns age; \n attribute name, value string;\n attribute age, value integer;\n \"\"\"\n answer = tx.query(define_query).resolve()\n if answer.is_ok():\n print(f\"OK results do not give any extra interesting information, but they mean that the query \"\n f\"is successfully executed!\")\n\n # Commit automatically closes the transaction. It can still be safely called inside \"with\" blocks\n tx.commit()\n\n # Open a read transaction to safely read anything without database modifications\n with driver.transaction(database.name, TransactionType.READ) as tx:\n answer = tx.query(\"match entity $x;\").resolve()\n\n # Collect concept rows that represent the answer as a table\n rows = list(answer.as_concept_rows())\n row = rows[0]\n\n # Collect column names to get concepts by index if the variable names are lost\n header = list(row.column_names())\n\n column_name = header[0]\n\n # Get concept by the variable name (column name)\n concept_by_name = row.get(column_name)\n\n # Get concept by the header's index\n concept_by_index = row.get_index(0)\n\n print(f\"Getting concepts by variable names ({concept_by_name.get_label()}) and \"\n f\"indexes ({concept_by_index.get_label()}) is equally correct. \")\n\n # Check if it's an entity type before the conversion\n if concept_by_name.is_entity_type():\n print(f\"Both represent the defined entity type: '{concept_by_name.as_entity_type().get_label()}' \"\n f\"(in case of a doubt: '{concept_by_index.as_entity_type().get_label()}')\")\n\n # Continue querying in the same transaction if needed\n answer = tx.query(\"match attribute $a;\").resolve()\n\n # Concept rows can be used as any other iterator\n rows = [row for row in answer.as_concept_rows()]\n\n for row in rows:\n # Same for column names\n column_names_iter = row.column_names()\n column_name = next(column_names_iter)\n\n concept_by_name = row.get(column_name)\n\n # Check if it's an attribute type before the conversion\n if concept_by_name.is_attribute_type():\n attribute_type = concept_by_name.as_attribute_type()\n print(f\"Defined attribute type's label: '{attribute_type.get_label()}', \"\n f\"value type: '{attribute_type.try_get_value_type()}'\")\n\n\n print(f\"It is also possible to just print the concept itself: '{concept_by_name}'\")\n\n # Open a write transaction to insert data\n with driver.transaction(database.name, TransactionType.WRITE) as tx:\n insert_query = \"insert $z isa person, has age 10; $x isa person, has age 20, has name \\\"John\\\";\"\n answer = tx.query(insert_query).resolve()\n\n # Insert queries also return concept rows\n rows = list(answer.as_concept_rows())\n row = rows[0]\n\n for column_name in row.column_names():\n inserted_concept = row.get(column_name)\n print(f\"Successfully inserted ${column_name}: {inserted_concept}\")\n if inserted_concept.is_entity():\n print(\"This time, it's an entity, not a type!\")\n\n # It is possible to ask for the column names again\n header = [name for name in row.column_names()]\n\n x = row.get_index(header.index(\"x\"))\n print(\n \"As we expect an entity instance, we can try to get its IID (unique identification): {x.try_get_iid()}. \")\n if x.is_entity():\n print(f\"It can also be retrieved directly and safely after a cast: {x.as_entity().get_iid()}\")\n\n # Do not forget to commit if the changes should be persisted\n tx.commit()\n\n # Open another write transaction to try inserting even more data\n with driver.transaction(database.name, TransactionType.WRITE) as tx:\n # When loading a large dataset, it's often better not to resolve every query's promise immediately.\n # Instead, collect promises and handle them later. Alternatively, if a commit is expected in the end,\n # just call `commit`, which will wait for all ongoing operations to finish before executing.\n queries = [\"insert $a isa person, has name \\\"Alice\\\";\", \"insert $b isa person, has name \\\"Bob\\\";\"]\n for query in queries:\n tx.query(query)\n tx.commit()\n\n with driver.transaction(database.name, TransactionType.WRITE) as tx:\n # Commit will still fail if at least one of the queries produce an error.\n queries = [\"insert $c isa not-person, has name \\\"Chris\\\";\", \"insert $d isa person, has name \\\"David\\\";\"]\n promises = []\n for query in queries:\n promises.append(tx.query(query))\n\n try:\n tx.commit()\n assert False, \"TypeDBDriverException is expected\"\n except TypeDBDriverException as expected_exception:\n print(f\"Commit result will contain the unresolved query's error: {expected_exception}\")\n\n # Open a read transaction to verify that the previously inserted data is saved\n with driver.transaction(database.name, TransactionType.READ) as tx:\n # A match query can be used for concept row outputs\n var = \"x\"\n answer = tx.query(f\"match ${var} isa person;\").resolve()\n\n # Simple match queries always return concept rows\n count = 0\n for row in answer.as_concept_rows():\n x = row.get(var)\n x_type = x.as_entity().get_type().as_entity_type()\n count += 1\n print(f\"Found a person {x} of type {x_type}\")\n print(f\"Total persons found: {count}\")\n\n # A fetch query can be used for concept document outputs with flexible structure\n fetch_query = \"\"\"\n match\n $x isa! person, has $a;\n $a isa! $t;\n fetch {\n \"single attribute type\": $t,\n \"single attribute\": $a,\n \"all attributes\": { $x.* },\n };\n \"\"\"\n answer = tx.query(fetch_query).resolve()\n\n # Fetch queries always return concept documents\n count = 0\n for document in answer.as_concept_documents():\n count += 1\n print(f\"Fetched a document: {document}.\")\n print(f\"This document contains an attribute of type: {document['single attribute type']['label']}\")\n print(f\"Total documents fetched: {count}\")\n\n print(\"More examples can be found in the API reference and the documentation.\\nWelcome to TypeDB!\")\n```\n\n<!-- CLOUD_EXAMPLE_END_MARKER -->\n\n### TypeDB CE (Core driver)\n\n<!-- CORE_EXAMPLE_START_MARKER -->\n\n```py\nfrom typedb.driver import *\n\n\nclass TypeDBExample:\n\n def typedb_example():\n # Open a driver connection. The connection will be automatically closed on the \"with\" block exit\n with TypeDB.core_driver(TypeDB.DEFAULT_ADDRESS, Credentials(\"admin\", \"password\"), DriverOptions()) as driver:\n # Create a database\n driver.databases.create(\"typedb\")\n database = driver.databases.get(\"typedb\")\n\n # Use \"try\" blocks to catch driver exceptions\n try:\n # Open transactions of 3 types\n tx = driver.transaction(database.name, TransactionType.READ)\n\n # Execute any TypeDB query using TypeQL. Wrong queries are rejected with an explicit exception\n result_promise = tx.query(\"define entity i-cannot-be-defined-in-read-transactions;\")\n\n print(\"The result is still promised, so it needs resolving even in case of errors!\")\n result_promise.resolve()\n except TypeDBDriverException as expected_exception:\n print(f\"Once the query's promise is resolved, the exception is revealed: {expected_exception}\")\n finally:\n # Don't forget to close the transaction!\n tx.close()\n\n # Open a schema transaction to make schema changes\n # Use \"with\" blocks to forget about \"close\" operations (similarly to connections)\n with driver.transaction(database.name, TransactionType.SCHEMA) as tx:\n define_query = \"\"\"\n define \n entity person, owns name, owns age; \n attribute name, value string;\n attribute age, value integer;\n \"\"\"\n answer = tx.query(define_query).resolve()\n if answer.is_ok():\n print(f\"OK results do not give any extra interesting information, but they mean that the query \"\n f\"is successfully executed!\")\n\n # Commit automatically closes the transaction. It can still be safely called inside \"with\" blocks\n tx.commit()\n\n # Open a read transaction to safely read anything without database modifications\n with driver.transaction(database.name, TransactionType.READ) as tx:\n answer = tx.query(\"match entity $x;\").resolve()\n\n # Collect concept rows that represent the answer as a table\n rows = list(answer.as_concept_rows())\n row = rows[0]\n\n # Collect column names to get concepts by index if the variable names are lost\n header = list(row.column_names())\n\n column_name = header[0]\n\n # Get concept by the variable name (column name)\n concept_by_name = row.get(column_name)\n\n # Get concept by the header's index\n concept_by_index = row.get_index(0)\n\n print(f\"Getting concepts by variable names ({concept_by_name.get_label()}) and \"\n f\"indexes ({concept_by_index.get_label()}) is equally correct. \")\n\n # Check if it's an entity type before the conversion\n if concept_by_name.is_entity_type():\n print(f\"Both represent the defined entity type: '{concept_by_name.as_entity_type().get_label()}' \"\n f\"(in case of a doubt: '{concept_by_index.as_entity_type().get_label()}')\")\n\n # Continue querying in the same transaction if needed\n answer = tx.query(\"match attribute $a;\").resolve()\n\n # Concept rows can be used as any other iterator\n rows = [row for row in answer.as_concept_rows()]\n\n for row in rows:\n # Same for column names\n column_names_iter = row.column_names()\n column_name = next(column_names_iter)\n\n concept_by_name = row.get(column_name)\n\n # Check if it's an attribute type before the conversion\n if concept_by_name.is_attribute_type():\n attribute_type = concept_by_name.as_attribute_type()\n print(f\"Defined attribute type's label: '{attribute_type.get_label()}', \"\n f\"value type: '{attribute_type.try_get_value_type()}'\")\n\n\n print(f\"It is also possible to just print the concept itself: '{concept_by_name}'\")\n\n # Open a write transaction to insert data\n with driver.transaction(database.name, TransactionType.WRITE) as tx:\n insert_query = \"insert $z isa person, has age 10; $x isa person, has age 20, has name \\\"John\\\";\"\n answer = tx.query(insert_query).resolve()\n\n # Insert queries also return concept rows\n rows = list(answer.as_concept_rows())\n row = rows[0]\n\n for column_name in row.column_names():\n inserted_concept = row.get(column_name)\n print(f\"Successfully inserted ${column_name}: {inserted_concept}\")\n if inserted_concept.is_entity():\n print(\"This time, it's an entity, not a type!\")\n\n # It is possible to ask for the column names again\n header = [name for name in row.column_names()]\n\n x = row.get_index(header.index(\"x\"))\n print(\n \"As we expect an entity instance, we can try to get its IID (unique identification): {x.try_get_iid()}. \")\n if x.is_entity():\n print(f\"It can also be retrieved directly and safely after a cast: {x.as_entity().get_iid()}\")\n\n # Do not forget to commit if the changes should be persisted\n tx.commit()\n\n # Open another write transaction to try inserting even more data\n with driver.transaction(database.name, TransactionType.WRITE) as tx:\n # When loading a large dataset, it's often better not to resolve every query's promise immediately.\n # Instead, collect promises and handle them later. Alternatively, if a commit is expected in the end,\n # just call `commit`, which will wait for all ongoing operations to finish before executing.\n queries = [\"insert $a isa person, has name \\\"Alice\\\";\", \"insert $b isa person, has name \\\"Bob\\\";\"]\n for query in queries:\n tx.query(query)\n tx.commit()\n\n with driver.transaction(database.name, TransactionType.WRITE) as tx:\n # Commit will still fail if at least one of the queries produce an error.\n queries = [\"insert $c isa not-person, has name \\\"Chris\\\";\", \"insert $d isa person, has name \\\"David\\\";\"]\n promises = []\n for query in queries:\n promises.append(tx.query(query))\n\n try:\n tx.commit()\n assert False, \"TypeDBDriverException is expected\"\n except TypeDBDriverException as expected_exception:\n print(f\"Commit result will contain the unresolved query's error: {expected_exception}\")\n\n # Open a read transaction to verify that the previously inserted data is saved\n with driver.transaction(database.name, TransactionType.READ) as tx:\n # A match query can be used for concept row outputs\n var = \"x\"\n answer = tx.query(f\"match ${var} isa person;\").resolve()\n\n # Simple match queries always return concept rows\n count = 0\n for row in answer.as_concept_rows():\n x = row.get(var)\n x_type = x.as_entity().get_type().as_entity_type()\n count += 1\n print(f\"Found a person {x} of type {x_type}\")\n print(f\"Total persons found: {count}\")\n\n # A fetch query can be used for concept document outputs with flexible structure\n fetch_query = \"\"\"\n match\n $x isa! person, has $a;\n $a isa! $t;\n fetch {\n \"single attribute type\": $t,\n \"single attribute\": $a,\n \"all attributes\": { $x.* },\n };\n \"\"\"\n answer = tx.query(fetch_query).resolve()\n\n # Fetch queries always return concept documents\n count = 0\n for document in answer.as_concept_documents():\n count += 1\n print(f\"Fetched a document: {document}.\")\n print(f\"This document contains an attribute of type: {document['single attribute type']['label']}\")\n print(f\"Total documents fetched: {count}\")\n\n print(\"More examples can be found in the API reference and the documentation.\\nWelcome to TypeDB!\")\n```\n\n<!-- CORE_EXAMPLE_END_MARKER -->\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "TypeDB Driver for Python",
"version": "3.0.5",
"project_urls": {
"Homepage": "https://github.com/typedb/typedb-driver-python/"
},
"split_keywords": [
"typedb",
"database",
"graph",
"knowledgebase",
"knowledge-engineering"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "bed85615e80502ab8ccd2b187ee19eb9c9ee004ed331d3ba8db85b1bbf74bb8b",
"md5": "e9642aa124dd8afc25c901f328711243",
"sha256": "e65981711cf4b21c92fad4e928f4a4ddf804b348671d5808fb0fffc76e24b37d"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py310-none-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "e9642aa124dd8afc25c901f328711243",
"packagetype": "bdist_wheel",
"python_version": "py310",
"requires_python": ">0",
"size": 5001323,
"upload_time": "2025-01-31T16:22:19",
"upload_time_iso_8601": "2025-01-31T16:22:19.453617Z",
"url": "https://files.pythonhosted.org/packages/be/d8/5615e80502ab8ccd2b187ee19eb9c9ee004ed331d3ba8db85b1bbf74bb8b/typedb_driver-3.0.5-py310-none-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0008c504eecf1a2e7589d4da91ea8048a0a8f5fb9caa10f3823a1c562269eaaf",
"md5": "eb4a8a4f9cfc9bdf973ab8e67abb0a17",
"sha256": "bf7af10cc91a0926c78a6caedd2d0493308c2931dd558203c46dca5b5feebc08"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py310-none-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "eb4a8a4f9cfc9bdf973ab8e67abb0a17",
"packagetype": "bdist_wheel",
"python_version": "py310",
"requires_python": ">0",
"size": 5090634,
"upload_time": "2025-01-31T16:28:10",
"upload_time_iso_8601": "2025-01-31T16:28:10.076584Z",
"url": "https://files.pythonhosted.org/packages/00/08/c504eecf1a2e7589d4da91ea8048a0a8f5fb9caa10f3823a1c562269eaaf/typedb_driver-3.0.5-py310-none-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "76d07468aca69c30494799ddaa02da294d57a4b8705ccc4354389a5599aade21",
"md5": "9c98b30ef0e5435784dd656b3273552a",
"sha256": "e6bf26866b917c906c1d930ae05716d6803704a843a53ee0dc71e50c6e9707a0"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py310-none-manylinux_2_17_aarch64.whl",
"has_sig": false,
"md5_digest": "9c98b30ef0e5435784dd656b3273552a",
"packagetype": "bdist_wheel",
"python_version": "py310",
"requires_python": ">0",
"size": 6057268,
"upload_time": "2025-01-31T16:29:08",
"upload_time_iso_8601": "2025-01-31T16:29:08.191987Z",
"url": "https://files.pythonhosted.org/packages/76/d0/7468aca69c30494799ddaa02da294d57a4b8705ccc4354389a5599aade21/typedb_driver-3.0.5-py310-none-manylinux_2_17_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "961884e8cd0259656d06b5fc528ee1ed8a0546ec2f414941aadf5249c22f06de",
"md5": "54f0a31a392bc725b7f90f96d67df4d9",
"sha256": "34f6331f7aed7866056d3af25fd4a444423ade05f96f066101e9228ef73d7137"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py310-none-manylinux_2_17_x86_64.whl",
"has_sig": false,
"md5_digest": "54f0a31a392bc725b7f90f96d67df4d9",
"packagetype": "bdist_wheel",
"python_version": "py310",
"requires_python": ">0",
"size": 6125385,
"upload_time": "2025-01-31T16:25:12",
"upload_time_iso_8601": "2025-01-31T16:25:12.866959Z",
"url": "https://files.pythonhosted.org/packages/96/18/84e8cd0259656d06b5fc528ee1ed8a0546ec2f414941aadf5249c22f06de/typedb_driver-3.0.5-py310-none-manylinux_2_17_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "19ad1dd2eb025746e31436f03b6efa61102d6126e5d4e5a891ea1e5720efd9c1",
"md5": "43b95bd59207e038303bfc8b169fd73d",
"sha256": "7f6c2b4f5f8619c61f5dc7b118a34f2906a6a60885220da1422c099c4ce9411b"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py310-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "43b95bd59207e038303bfc8b169fd73d",
"packagetype": "bdist_wheel",
"python_version": "py310",
"requires_python": ">0",
"size": 2906226,
"upload_time": "2025-01-31T16:26:46",
"upload_time_iso_8601": "2025-01-31T16:26:46.684937Z",
"url": "https://files.pythonhosted.org/packages/19/ad/1dd2eb025746e31436f03b6efa61102d6126e5d4e5a891ea1e5720efd9c1/typedb_driver-3.0.5-py310-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "60f5e893ea23bb3725b18c03d9116281f7dbf9d2055bafdbfca74c74c3f3bccd",
"md5": "f0d18f99f7e7e20f1a415d4dbc518e4e",
"sha256": "a5118316c8a1c04caa01093ec9afab7b687faef7952696ebcfe7c83b77b762f6"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py311-none-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "f0d18f99f7e7e20f1a415d4dbc518e4e",
"packagetype": "bdist_wheel",
"python_version": "py311",
"requires_python": ">0",
"size": 5001317,
"upload_time": "2025-01-31T16:22:30",
"upload_time_iso_8601": "2025-01-31T16:22:30.175603Z",
"url": "https://files.pythonhosted.org/packages/60/f5/e893ea23bb3725b18c03d9116281f7dbf9d2055bafdbfca74c74c3f3bccd/typedb_driver-3.0.5-py311-none-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "76df68f4a8386092e309cbb72dc8a4f91914b86af2e2876085c2552f1dd28656",
"md5": "4fd7c70c88d5d69a0aa6c8c3faa53d4b",
"sha256": "61f4692aa9fbdc6d15ebe1a804e2b0adda91a8dc10cd99c76a5ae53c9547030b"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py311-none-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "4fd7c70c88d5d69a0aa6c8c3faa53d4b",
"packagetype": "bdist_wheel",
"python_version": "py311",
"requires_python": ">0",
"size": 5090638,
"upload_time": "2025-01-31T16:28:32",
"upload_time_iso_8601": "2025-01-31T16:28:32.656211Z",
"url": "https://files.pythonhosted.org/packages/76/df/68f4a8386092e309cbb72dc8a4f91914b86af2e2876085c2552f1dd28656/typedb_driver-3.0.5-py311-none-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0e5ae15cc083a47da5e57a9f1a5dc5e21588f1dab63790a124cecd6bcdc20d47",
"md5": "35dcac3d3f1a94506fc3f68ec54cba16",
"sha256": "cc84724154ce0d3c044e96815b3e3cc18efc006c4231cb052595325616d88839"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py311-none-manylinux_2_17_aarch64.whl",
"has_sig": false,
"md5_digest": "35dcac3d3f1a94506fc3f68ec54cba16",
"packagetype": "bdist_wheel",
"python_version": "py311",
"requires_python": ">0",
"size": 6056948,
"upload_time": "2025-01-31T16:29:29",
"upload_time_iso_8601": "2025-01-31T16:29:29.646277Z",
"url": "https://files.pythonhosted.org/packages/0e/5a/e15cc083a47da5e57a9f1a5dc5e21588f1dab63790a124cecd6bcdc20d47/typedb_driver-3.0.5-py311-none-manylinux_2_17_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e5ad6bece99fd6355ce25de8840cead024b74841afb261d25e3f23594dc26f97",
"md5": "6d534ee0ad4682ff539d9e24b3eb98b8",
"sha256": "711b1aa0d9cdb296eea2b199757567d3d213f52d81ea0593918091613ab3f9ff"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py311-none-manylinux_2_17_x86_64.whl",
"has_sig": false,
"md5_digest": "6d534ee0ad4682ff539d9e24b3eb98b8",
"packagetype": "bdist_wheel",
"python_version": "py311",
"requires_python": ">0",
"size": 6125551,
"upload_time": "2025-01-31T16:25:38",
"upload_time_iso_8601": "2025-01-31T16:25:38.565798Z",
"url": "https://files.pythonhosted.org/packages/e5/ad/6bece99fd6355ce25de8840cead024b74841afb261d25e3f23594dc26f97/typedb_driver-3.0.5-py311-none-manylinux_2_17_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a593da3ecc0a655d586a417142e9c0472dc05f9ba18d88d26bf02330b1f5e408",
"md5": "bec460dd09f1c52184c59d16eaed65bd",
"sha256": "6fe89f32c721ba78ec601654ba2f470ad46d6f43f8f9493713acaec02b4f558f"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py311-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "bec460dd09f1c52184c59d16eaed65bd",
"packagetype": "bdist_wheel",
"python_version": "py311",
"requires_python": ">0",
"size": 2906315,
"upload_time": "2025-01-31T16:28:13",
"upload_time_iso_8601": "2025-01-31T16:28:13.016313Z",
"url": "https://files.pythonhosted.org/packages/a5/93/da3ecc0a655d586a417142e9c0472dc05f9ba18d88d26bf02330b1f5e408/typedb_driver-3.0.5-py311-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "acf60da4c6a0b7efeadb3801f8050861e4d98655c037acc8a4fa62814364ab34",
"md5": "2e9274ce38bf7ff3e49b8e15ff83000a",
"sha256": "fbcbf66080b28cf117da12efba26bcc9cb1c7e78cb6ae3a89a3fb68d5f91bc2e"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py312-none-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "2e9274ce38bf7ff3e49b8e15ff83000a",
"packagetype": "bdist_wheel",
"python_version": "py312",
"requires_python": ">0",
"size": 5001776,
"upload_time": "2025-01-31T16:22:43",
"upload_time_iso_8601": "2025-01-31T16:22:43.251211Z",
"url": "https://files.pythonhosted.org/packages/ac/f6/0da4c6a0b7efeadb3801f8050861e4d98655c037acc8a4fa62814364ab34/typedb_driver-3.0.5-py312-none-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4c058bcba5129693a9feab01c8e734c77401acc4a11c2b8148872d04000c3188",
"md5": "e4da1952e7e6773e8641438fc9b4c1c3",
"sha256": "03a3d768415fd2d52f7a148c91ceb3bd0d3dadee431c919d7768052cfe121f2b"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py312-none-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "e4da1952e7e6773e8641438fc9b4c1c3",
"packagetype": "bdist_wheel",
"python_version": "py312",
"requires_python": ">0",
"size": 5091341,
"upload_time": "2025-01-31T16:28:49",
"upload_time_iso_8601": "2025-01-31T16:28:49.997397Z",
"url": "https://files.pythonhosted.org/packages/4c/05/8bcba5129693a9feab01c8e734c77401acc4a11c2b8148872d04000c3188/typedb_driver-3.0.5-py312-none-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "12e1523255256740101ca0e901579dd4914a23d5f51a705da590fda83f78066c",
"md5": "c3a04d2c8931aa5a4fdfb20c9f1f2ae1",
"sha256": "9dd89bf34d254bf5d73a86ee423b8c524578b58facdd31e760bce1f5581aa616"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py312-none-manylinux_2_17_aarch64.whl",
"has_sig": false,
"md5_digest": "c3a04d2c8931aa5a4fdfb20c9f1f2ae1",
"packagetype": "bdist_wheel",
"python_version": "py312",
"requires_python": ">0",
"size": 6057324,
"upload_time": "2025-01-31T16:29:51",
"upload_time_iso_8601": "2025-01-31T16:29:51.824370Z",
"url": "https://files.pythonhosted.org/packages/12/e1/523255256740101ca0e901579dd4914a23d5f51a705da590fda83f78066c/typedb_driver-3.0.5-py312-none-manylinux_2_17_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e971cdd422c28ee33bd4d3add6095643f6700a7ce11ce86caf85477bb9eef889",
"md5": "7a2793acc4998dfdd4ca77f0682fd204",
"sha256": "f670aaf773a23a2801f5b9a8f1ccc6b686cdeb667fada021d1c100c5867ef5d9"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py312-none-manylinux_2_17_x86_64.whl",
"has_sig": false,
"md5_digest": "7a2793acc4998dfdd4ca77f0682fd204",
"packagetype": "bdist_wheel",
"python_version": "py312",
"requires_python": ">0",
"size": 6125747,
"upload_time": "2025-01-31T16:26:05",
"upload_time_iso_8601": "2025-01-31T16:26:05.689813Z",
"url": "https://files.pythonhosted.org/packages/e9/71/cdd422c28ee33bd4d3add6095643f6700a7ce11ce86caf85477bb9eef889/typedb_driver-3.0.5-py312-none-manylinux_2_17_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5c80d425ae46b2fcb32d5061175793264d61ff9cd6edd96cfd498aa64ebbf60e",
"md5": "2d34941c7382c274be8a52706e132a61",
"sha256": "17c42113def0cd3532dde1871368c3810e144893ccee28616c137e986b211d9e"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py312-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "2d34941c7382c274be8a52706e132a61",
"packagetype": "bdist_wheel",
"python_version": "py312",
"requires_python": ">0",
"size": 2906024,
"upload_time": "2025-01-31T16:29:08",
"upload_time_iso_8601": "2025-01-31T16:29:08.031973Z",
"url": "https://files.pythonhosted.org/packages/5c/80/d425ae46b2fcb32d5061175793264d61ff9cd6edd96cfd498aa64ebbf60e/typedb_driver-3.0.5-py312-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "71ecc72fbb5af90a2bb50af4cacab6ce8c5b851e6b1684016a4f3c133c66cdbc",
"md5": "5a23eac3623eb940b83cf2918414d093",
"sha256": "76e313ccbf92969cb2029dbf1d5d7d382615d32410a5365a611e639bfde501b1"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py39-none-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "5a23eac3623eb940b83cf2918414d093",
"packagetype": "bdist_wheel",
"python_version": "py39",
"requires_python": ">0",
"size": 5000944,
"upload_time": "2025-01-31T16:22:08",
"upload_time_iso_8601": "2025-01-31T16:22:08.123857Z",
"url": "https://files.pythonhosted.org/packages/71/ec/c72fbb5af90a2bb50af4cacab6ce8c5b851e6b1684016a4f3c133c66cdbc/typedb_driver-3.0.5-py39-none-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8af4b67f36fb507effcb0582d5ffffe62383fd46d75b265ac8a521bf19a01a3a",
"md5": "6a2ed35a5ef219a51ea48a8b8aeec391",
"sha256": "9574adb3ae07c8e25d9dd62085591dfb6c75c781ccffb50c7ef517ea38c4628a"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py39-none-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "6a2ed35a5ef219a51ea48a8b8aeec391",
"packagetype": "bdist_wheel",
"python_version": "py39",
"requires_python": ">0",
"size": 5090983,
"upload_time": "2025-01-31T16:27:44",
"upload_time_iso_8601": "2025-01-31T16:27:44.274374Z",
"url": "https://files.pythonhosted.org/packages/8a/f4/b67f36fb507effcb0582d5ffffe62383fd46d75b265ac8a521bf19a01a3a/typedb_driver-3.0.5-py39-none-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5eaaecb61a613b0a95a929fd7dbb22d3f3de32c7f4b9641fbcb53589188606f3",
"md5": "b4ca23d5f19a172b13d91b8c09a9d59f",
"sha256": "ec07c0154c477feac78bd885f0f9e1990f01229ee2ed4b0bad2086947d7a7bdf"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py39-none-manylinux_2_17_aarch64.whl",
"has_sig": false,
"md5_digest": "b4ca23d5f19a172b13d91b8c09a9d59f",
"packagetype": "bdist_wheel",
"python_version": "py39",
"requires_python": ">0",
"size": 6056988,
"upload_time": "2025-01-31T16:28:45",
"upload_time_iso_8601": "2025-01-31T16:28:45.132543Z",
"url": "https://files.pythonhosted.org/packages/5e/aa/ecb61a613b0a95a929fd7dbb22d3f3de32c7f4b9641fbcb53589188606f3/typedb_driver-3.0.5-py39-none-manylinux_2_17_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "133b7fde5eb96bff9a76c0fcd7c2cf010301b25a562d62e3ad7057e80b95c8f8",
"md5": "c576ee53b7f0b95cc2cdbc0123d0cc6d",
"sha256": "85d8e095857a5fed9ecf8087de257639b569e4fac5b733f197730122710f768d"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py39-none-manylinux_2_17_x86_64.whl",
"has_sig": false,
"md5_digest": "c576ee53b7f0b95cc2cdbc0123d0cc6d",
"packagetype": "bdist_wheel",
"python_version": "py39",
"requires_python": ">0",
"size": 6125399,
"upload_time": "2025-01-31T16:24:46",
"upload_time_iso_8601": "2025-01-31T16:24:46.580509Z",
"url": "https://files.pythonhosted.org/packages/13/3b/7fde5eb96bff9a76c0fcd7c2cf010301b25a562d62e3ad7057e80b95c8f8/typedb_driver-3.0.5-py39-none-manylinux_2_17_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c7a97c51658f8621e42ef4ce7f4a176d963143349fe1a3ac2d48a2ae20972db8",
"md5": "24a13242dfcb232a3dba3f4eb06cd15e",
"sha256": "aae1ede70973628202769b4d4d88e1f54b1c6ff0e6133c87005cafc4c7254c03"
},
"downloads": -1,
"filename": "typedb_driver-3.0.5-py39-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "24a13242dfcb232a3dba3f4eb06cd15e",
"packagetype": "bdist_wheel",
"python_version": "py39",
"requires_python": ">0",
"size": 2906230,
"upload_time": "2025-01-31T16:25:15",
"upload_time_iso_8601": "2025-01-31T16:25:15.640226Z",
"url": "https://files.pythonhosted.org/packages/c7/a9/7c51658f8621e42ef4ce7f4a176d963143349fe1a3ac2d48a2ae20972db8/typedb_driver-3.0.5-py39-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-31 16:22:19",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "typedb",
"github_project": "typedb-driver-python",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "parse",
"specs": [
[
"==",
"1.18.0"
]
]
}
],
"lcname": "typedb-driver"
}