diff --git a/README.md b/README.md index 98dc6bd2..4ba23f95 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ poetry add graphiti-core ```python from graphiti_core import Graphiti from graphiti_core.nodes import EpisodeType -from datetime import datetime +from datetime import datetime, timezone # Initialize Graphiti graphiti = Graphiti("bolt://localhost:7687", "neo4j", "password") @@ -128,7 +128,7 @@ for i, episode in enumerate(episodes): episode_body=episode, source=EpisodeType.text, source_description="podcast", - reference_time=datetime.now() + reference_time=datetime.now(timezone.utc) ) # Search the graph diff --git a/examples/ecommerce/runner.ipynb b/examples/ecommerce/runner.ipynb index c44af252..b7316c03 100644 --- a/examples/ecommerce/runner.ipynb +++ b/examples/ecommerce/runner.ipynb @@ -30,7 +30,7 @@ "import logging\n", "import os\n", "import sys\n", - "from datetime import datetime\n", + "from datetime import datetime, timezone\n", "from pathlib import Path\n", "\n", "from dotenv import load_dotenv\n", @@ -111,7 +111,7 @@ " name=f'{prefix}-{i}',\n", " episode_body=message,\n", " source=EpisodeType.message,\n", - " reference_time=datetime.now(),\n", + " reference_time=datetime.now(timezone.utc),\n", " source_description='Shoe conversation',\n", " )" ] @@ -135,7 +135,7 @@ " content=str({k: v for k, v in product.items() if k != 'images'}),\n", " source_description='ManyBirds products',\n", " source=EpisodeType.json,\n", - " reference_time=datetime.now(),\n", + " reference_time=datetime.now(timezone.utc),\n", " )\n", " for i, product in enumerate(products)\n", " ]\n", @@ -463,7 +463,7 @@ " name='Inventory management 0',\n", " episode_body=('All Tinybirds Wool Runners styles are out of stock until December 25th 2024'),\n", " source=EpisodeType.text,\n", - " reference_time=datetime.now(),\n", + " reference_time=datetime.now(timezone.utc),\n", " source_description='Inventory Management Bot',\n", ")" ] @@ -499,18 +499,18 @@ "\n" ], "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'150fce971e43402582df51d83e09dddf'\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'a06d832a07fc403f8e43df6b2b650f1a'\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'138a288fc46f40a18623ccf970d49813'\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m34\u001b[0m, \u001b[1;36m12\u001b[0m, \u001b[1;36m9589\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'PROVIDES_AVAILABILITY_INFO'\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m'AI Assistant informs that all TinyBirds Wool Runners styles are out of stock until December 25th 2024'\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'1de5e192b93149b5a11ede5667d99a40'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m34\u001b[0m, \u001b[1;36m16\u001b[0m, \u001b[1;36m47041\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m12\u001b[0m, \u001b[1;36m25\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[33mtzinfo\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mUTC\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" + "\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'150fce971e43402582df51d83e09dddf'\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'a06d832a07fc403f8e43df6b2b650f1a'\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'138a288fc46f40a18623ccf970d49813'\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m34\u001B[0m, \u001B[1;36m12\u001B[0m, \u001B[1;36m9589\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'PROVIDES_AVAILABILITY_INFO'\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m'AI Assistant informs that all TinyBirds Wool Runners styles are out of stock until December 25th 2024'\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'1de5e192b93149b5a11ede5667d99a40'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m34\u001B[0m, \u001B[1;36m16\u001B[0m, \u001B[1;36m47041\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m12\u001B[0m, \u001B[1;36m25\u001B[0m, \u001B[1;36m0\u001B[0m, \u001B[1;36m0\u001B[0m, \u001B[33mtzinfo\u001B[0m=\u001B[1m<\u001B[0m\u001B[1;95mUTC\u001B[0m\u001B[1m>\u001B[0m\u001B[1m)\u001B[0m\n", + "\u001B[1m}\u001B[0m\n" ] }, "metadata": {}, @@ -992,32 +992,32 @@ "\n" ], "text/plain": [ - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'6a19ae37d5074d808d4f951ab347e2b1'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'fcea4a4539244cd28aac1bb11def0cab'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m35\u001b[0m, \u001b[1;36m44\u001b[0m, \u001b[1;36m738829\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'HAS_SHOE_SIZE'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m\"John's shoe size is 10\"\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'6b41a387ca504a2686b636a20b5673a3'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m7\u001b[0m, \u001b[1;36m30\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m3\u001b[0m, \u001b[33mtzinfo\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mUTC\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'0c150ca1debc423eb7e3bd535413c782'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'0e96a1b72fe145a79ec2b36842ac6fd9'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'0e96a1b72fe145a79ec2b36842ac6fd9'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m33\u001b[0m, \u001b[1;36m39\u001b[0m, \u001b[1;36m424173\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'IS_VARIANT_OF'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m\"The Men's SuperLight Wool Runners - Dark Grey \u001b[0m\u001b[32m(\u001b[0m\u001b[32mMedium Grey Sole\u001b[0m\u001b[32m)\u001b[0m\u001b[32m is a specific variant of the SuperLight Wool Runner line\"\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'4a302ac072c94f9da876535b1130e03d'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" + "\u001B[1m[\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'6a19ae37d5074d808d4f951ab347e2b1'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'fcea4a4539244cd28aac1bb11def0cab'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m35\u001B[0m, \u001B[1;36m44\u001B[0m, \u001B[1;36m738829\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'HAS_SHOE_SIZE'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m\"John's shoe size is 10\"\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'6b41a387ca504a2686b636a20b5673a3'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m7\u001B[0m, \u001B[1;36m30\u001B[0m, \u001B[1;36m0\u001B[0m, \u001B[1;36m3\u001B[0m, \u001B[33mtzinfo\u001B[0m=\u001B[1m<\u001B[0m\u001B[1;95mUTC\u001B[0m\u001B[1m>\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'0c150ca1debc423eb7e3bd535413c782'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'0e96a1b72fe145a79ec2b36842ac6fd9'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'0e96a1b72fe145a79ec2b36842ac6fd9'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m33\u001B[0m, \u001B[1;36m39\u001B[0m, \u001B[1;36m424173\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'IS_VARIANT_OF'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m\"The Men's SuperLight Wool Runners - Dark Grey \u001B[0m\u001B[32m(\u001B[0m\u001B[32mMedium Grey Sole\u001B[0m\u001B[32m)\u001B[0m\u001B[32m is a specific variant of the SuperLight Wool Runner line\"\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'4a302ac072c94f9da876535b1130e03d'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" ] }, "metadata": {}, @@ -1057,14 +1057,14 @@ "\n" ], "text/plain": [ - "\u001b[1;35mEntityNode\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33muuid\u001b[0m=\u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mname\u001b[0m=\u001b[32m'John'\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mlabels\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'Entity'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mcreated_at\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m34\u001b[0m, \u001b[1;36m52\u001b[0m, \u001b[1;36m870658\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mname_embedding\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33msummary\u001b[0m=\u001b[32m'Customer looking for a new pair of shoes'\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" + "\u001B[1;35mEntityNode\u001B[0m\u001B[1m(\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[33muuid\u001B[0m=\u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[33mname\u001B[0m=\u001B[32m'John'\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[33mlabels\u001B[0m=\u001B[1m[\u001B[0m\u001B[32m'Entity'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[33mcreated_at\u001B[0m=\u001B[1;35mdatetime\u001B[0m\u001B[1;35m.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m34\u001B[0m, \u001B[1;36m52\u001B[0m, \u001B[1;36m870658\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[33mname_embedding\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[33msummary\u001B[0m=\u001B[32m'Customer looking for a new pair of shoes'\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" ] }, "metadata": {}, @@ -1072,7 +1072,9 @@ } ], "source": [ - "nl = await client.get_nodes_by_query('John')\n", + "from graphiti_core.search.search_config_recipes import NODE_HYBRID_SEARCH_RRF\n", + "\n", + "nl = await client._search('John', NODE_HYBRID_SEARCH_RRF)\n", "\n", "pretty_print(nl[0])\n", "\n", @@ -1397,44 +1399,44 @@ "\n" ], "text/plain": [ - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'199ec767d52c47d2a5965f3197b1c4d2'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'b30e3ba27aa14f88895156331a435237'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m36\u001b[0m, \u001b[1;36m42\u001b[0m, \u001b[1;36m827088\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'PURCHASES'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m\"John purchased the Men's Couriers shoes but later decided to return them due to discomfort caused by his wide feet\"\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'4c8afb4aa1b446899a85249df475bc66'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m38\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m818497\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m7\u001b[0m, \u001b[1;36m30\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m5\u001b[0m, \u001b[33mtzinfo\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mUTC\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'2a9cf189e19649c19ec127c4024cfe51'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'77f8b23b74014a7f85fffa0067dbf815'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m34\u001b[0m, \u001b[1;36m57\u001b[0m, \u001b[1;36m412667\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'INTERESTED_IN'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m'John is looking for a new pair of shoes'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'c2ebc79d2a204efb845be84b6dbf69d7'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'aa657e8bcb9446e19552f99a1c2299d8'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'8b43988e689b437095c7e75aa1044490'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m37\u001b[0m, \u001b[1;36m39\u001b[0m, \u001b[1;36m665400\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'HAS_CHARACTERISTIC'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m'John has wide feet'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'37c0e9ecaa424caea59854d1d8c2c756'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" + "\u001B[1m[\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'199ec767d52c47d2a5965f3197b1c4d2'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'b30e3ba27aa14f88895156331a435237'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m36\u001B[0m, \u001B[1;36m42\u001B[0m, \u001B[1;36m827088\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'PURCHASES'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m\"John purchased the Men's Couriers shoes but later decided to return them due to discomfort caused by his wide feet\"\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'4c8afb4aa1b446899a85249df475bc66'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m38\u001B[0m, \u001B[1;36m14\u001B[0m, \u001B[1;36m818497\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m7\u001B[0m, \u001B[1;36m30\u001B[0m, \u001B[1;36m0\u001B[0m, \u001B[1;36m5\u001B[0m, \u001B[33mtzinfo\u001B[0m=\u001B[1m<\u001B[0m\u001B[1;95mUTC\u001B[0m\u001B[1m>\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'2a9cf189e19649c19ec127c4024cfe51'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'77f8b23b74014a7f85fffa0067dbf815'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m34\u001B[0m, \u001B[1;36m57\u001B[0m, \u001B[1;36m412667\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'INTERESTED_IN'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m'John is looking for a new pair of shoes'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'c2ebc79d2a204efb845be84b6dbf69d7'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'aa657e8bcb9446e19552f99a1c2299d8'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'8b43988e689b437095c7e75aa1044490'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m37\u001B[0m, \u001B[1;36m39\u001B[0m, \u001B[1;36m665400\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'HAS_CHARACTERISTIC'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m'John has wide feet'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'37c0e9ecaa424caea59854d1d8c2c756'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" ] }, "metadata": {}, @@ -1528,68 +1530,68 @@ "\n" ], "text/plain": [ - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'199ec767d52c47d2a5965f3197b1c4d2'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'b30e3ba27aa14f88895156331a435237'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m36\u001b[0m, \u001b[1;36m42\u001b[0m, \u001b[1;36m827088\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'PURCHASES'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m\"John purchased the Men's Couriers shoes but later decided to return them due to discomfort caused by his wide feet\"\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'4c8afb4aa1b446899a85249df475bc66'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m38\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m818497\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m7\u001b[0m, \u001b[1;36m30\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m5\u001b[0m, \u001b[33mtzinfo\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mUTC\u001b[0m\u001b[39m>\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'2a9cf189e19649c19ec127c4024cfe51'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'77f8b23b74014a7f85fffa0067dbf815'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m34\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m57\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m412667\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'INTERESTED_IN'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'John is looking for a new pair of shoes'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[32m'c2ebc79d2a204efb845be84b6dbf69d7'\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'aa657e8bcb9446e19552f99a1c2299d8'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'8b43988e689b437095c7e75aa1044490'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m37\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m39\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m665400\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'HAS_CHARACTERISTIC'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'John has wide feet'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[32m'37c0e9ecaa424caea59854d1d8c2c756'\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'df1d2e82a40e40e1b3734c2298774a6b'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'588989497641456fb33243f035731f98'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m36\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m42\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m828745\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'LIKES'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'John expresses that he likes the Basin Blue color for the shoes'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[32m'4c8afb4aa1b446899a85249df475bc66'\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m30\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m, \u001b[0m\u001b[33mtzinfo\u001b[0m\u001b[39m=\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'6a19ae37d5074d808d4f951ab347e2b1'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'fcea4a4539244cd28aac1bb11def0cab'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m35\u001b[0m, \u001b[1;36m44\u001b[0m, \u001b[1;36m738829\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'HAS_SHOE_SIZE'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m\"John's shoe size is 10\"\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'6b41a387ca504a2686b636a20b5673a3'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" + "\u001B[1m[\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'199ec767d52c47d2a5965f3197b1c4d2'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'b30e3ba27aa14f88895156331a435237'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m36\u001B[0m, \u001B[1;36m42\u001B[0m, \u001B[1;36m827088\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'PURCHASES'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m\"John purchased the Men's Couriers shoes but later decided to return them due to discomfort caused by his wide feet\"\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'4c8afb4aa1b446899a85249df475bc66'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m38\u001B[0m, \u001B[1;36m14\u001B[0m, \u001B[1;36m818497\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m7\u001B[0m, \u001B[1;36m30\u001B[0m, \u001B[1;36m0\u001B[0m, \u001B[1;36m5\u001B[0m, \u001B[33mtzinfo\u001B[0m=\u001B[1m<\u001B[0m\u001B[1;95mUTC\u001B[0m\u001B[39m>\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m}\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'2a9cf189e19649c19ec127c4024cfe51'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'77f8b23b74014a7f85fffa0067dbf815'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m8\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m31\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m11\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m34\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m57\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m412667\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'INTERESTED_IN'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'John is looking for a new pair of shoes'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;39m[\u001B[0m\u001B[32m'c2ebc79d2a204efb845be84b6dbf69d7'\u001B[0m\u001B[1;39m]\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m}\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'aa657e8bcb9446e19552f99a1c2299d8'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'8b43988e689b437095c7e75aa1044490'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m8\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m31\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m11\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m37\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m39\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m665400\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'HAS_CHARACTERISTIC'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'John has wide feet'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;39m[\u001B[0m\u001B[32m'37c0e9ecaa424caea59854d1d8c2c756'\u001B[0m\u001B[1;39m]\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m}\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'df1d2e82a40e40e1b3734c2298774a6b'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'588989497641456fb33243f035731f98'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m8\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m31\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m11\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m36\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m42\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m828745\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'LIKES'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'John expresses that he likes the Basin Blue color for the shoes'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;39m[\u001B[0m\u001B[32m'4c8afb4aa1b446899a85249df475bc66'\u001B[0m\u001B[1;39m]\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m7\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m30\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m0\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m5\u001B[0m\u001B[39m, \u001B[0m\u001B[33mtzinfo\u001B[0m\u001B[39m=\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'6a19ae37d5074d808d4f951ab347e2b1'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'fcea4a4539244cd28aac1bb11def0cab'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m35\u001B[0m, \u001B[1;36m44\u001B[0m, \u001B[1;36m738829\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'HAS_SHOE_SIZE'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m\"John's shoe size is 10\"\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'6b41a387ca504a2686b636a20b5673a3'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" ] }, "metadata": {}, @@ -1683,68 +1685,68 @@ "\n" ], "text/plain": [ - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'e4cd07dfddc84072985aa8cf4e1dc01b'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'ccd7590b3601440f9ae816507da79130'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m35\u001b[0m, \u001b[1;36m44\u001b[0m, \u001b[1;36m738205\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'IS_ALLERGIC_TO'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m'John is allergic to wool'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'6b41a387ca504a2686b636a20b5673a3'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'aa657e8bcb9446e19552f99a1c2299d8'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'8b43988e689b437095c7e75aa1044490'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m37\u001b[0m, \u001b[1;36m39\u001b[0m, \u001b[1;36m665400\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'HAS_CHARACTERISTIC'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m'John has wide feet'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'37c0e9ecaa424caea59854d1d8c2c756'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'6a19ae37d5074d808d4f951ab347e2b1'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'fcea4a4539244cd28aac1bb11def0cab'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m35\u001b[0m, \u001b[1;36m44\u001b[0m, \u001b[1;36m738829\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'HAS_SHOE_SIZE'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m\"John's shoe size is 10\"\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'6b41a387ca504a2686b636a20b5673a3'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'518d5ef539004ceca7b9b9a750e22bd4'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'd362076a1e584227bcf51239914e39ad'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m37\u001b[0m, \u001b[1;36m15\u001b[0m, \u001b[1;36m423989\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'ASSISTS'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m'SalesBot offers assistance to John'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'7087342bfe86423bb702060fa9cc612b'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m20\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[33mtzinfo\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mUTC\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'2a9cf189e19649c19ec127c4024cfe51'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'77f8b23b74014a7f85fffa0067dbf815'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m34\u001b[0m, \u001b[1;36m57\u001b[0m, \u001b[1;36m412667\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'INTERESTED_IN'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m'John is looking for a new pair of shoes'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'c2ebc79d2a204efb845be84b6dbf69d7'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" + "\u001B[1m[\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'e4cd07dfddc84072985aa8cf4e1dc01b'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'ccd7590b3601440f9ae816507da79130'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m35\u001B[0m, \u001B[1;36m44\u001B[0m, \u001B[1;36m738205\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'IS_ALLERGIC_TO'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m'John is allergic to wool'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'6b41a387ca504a2686b636a20b5673a3'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'aa657e8bcb9446e19552f99a1c2299d8'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'8b43988e689b437095c7e75aa1044490'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m37\u001B[0m, \u001B[1;36m39\u001B[0m, \u001B[1;36m665400\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'HAS_CHARACTERISTIC'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m'John has wide feet'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'37c0e9ecaa424caea59854d1d8c2c756'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'6a19ae37d5074d808d4f951ab347e2b1'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'fcea4a4539244cd28aac1bb11def0cab'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m35\u001B[0m, \u001B[1;36m44\u001B[0m, \u001B[1;36m738829\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'HAS_SHOE_SIZE'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m\"John's shoe size is 10\"\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'6b41a387ca504a2686b636a20b5673a3'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'518d5ef539004ceca7b9b9a750e22bd4'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'd362076a1e584227bcf51239914e39ad'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m37\u001B[0m, \u001B[1;36m15\u001B[0m, \u001B[1;36m423989\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'ASSISTS'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m'SalesBot offers assistance to John'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'7087342bfe86423bb702060fa9cc612b'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m20\u001B[0m, \u001B[1;36m0\u001B[0m, \u001B[1;36m2\u001B[0m, \u001B[33mtzinfo\u001B[0m=\u001B[1m<\u001B[0m\u001B[1;95mUTC\u001B[0m\u001B[1m>\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m,\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'2a9cf189e19649c19ec127c4024cfe51'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'77f8b23b74014a7f85fffa0067dbf815'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m34\u001B[0m, \u001B[1;36m57\u001B[0m, \u001B[1;36m412667\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'INTERESTED_IN'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m'John is looking for a new pair of shoes'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'c2ebc79d2a204efb845be84b6dbf69d7'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" ] }, "metadata": {}, @@ -1838,68 +1840,68 @@ "\n" ], "text/plain": [ - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m: \u001b[32m'1055fb8279af4c4c8c3fb78350d610d0'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m: \u001b[32m'8b43988e689b437095c7e75aa1044490'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m: \u001b[32m'b30e3ba27aa14f88895156331a435237'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m31\u001b[0m, \u001b[1;36m11\u001b[0m, \u001b[1;36m37\u001b[0m, \u001b[1;36m39\u001b[0m, \u001b[1;36m664102\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'CAUSES_DISCOMFORT'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m: \u001b[32m\"John's wide feet cause discomfort with the Men's Couriers shoes\"\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m: \u001b[1m[\u001b[0m\u001b[32m'37c0e9ecaa424caea59854d1d8c2c756'\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m: \u001b[1;35mdatetime.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2024\u001b[0m, \u001b[1;36m8\u001b[0m, \u001b[1;36m20\u001b[0m, \u001b[1;36m0\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[33mtzinfo\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mUTC\u001b[0m\u001b[39m>\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'199ec767d52c47d2a5965f3197b1c4d2'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'b30e3ba27aa14f88895156331a435237'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m36\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m42\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m827088\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'PURCHASES'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m\"John purchased the Men's Couriers shoes but later decided to return them due to discomfort caused by his wide feet\"\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[32m'4c8afb4aa1b446899a85249df475bc66'\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m38\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m818497\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m30\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m, \u001b[0m\u001b[33mtzinfo\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'2a9cf189e19649c19ec127c4024cfe51'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'77f8b23b74014a7f85fffa0067dbf815'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m34\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m57\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m412667\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'INTERESTED_IN'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'John is looking for a new pair of shoes'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[32m'c2ebc79d2a204efb845be84b6dbf69d7'\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'4721330c8f2b45e69e07f520773f8794'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'd362076a1e584227bcf51239914e39ad'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'ed9688ba1e9940ff87d3e26bcf5d7ae4'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m36\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m540437\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'RECOMMENDS'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m\"SalesBot recommends Men's Couriers shoes to the customer\"\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[32m'e7c29d5d38854cac801bc07d236240a8'\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;39m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'df1d2e82a40e40e1b3734c2298774a6b'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'source_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'c4091c3ffc814f2c9017304361898585'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'target_node_uuid'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'588989497641456fb33243f035731f98'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'created_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m36\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m42\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m828745\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'name'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'LIKES'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'fact'\u001b[0m\u001b[39m: \u001b[0m\u001b[32m'John expresses that he likes the Basin Blue color for the shoes'\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'episodes'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[32m'4c8afb4aa1b446899a85249df475bc66'\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'expired_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'valid_at'\u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mdatetime.datetime\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;36m2024\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m30\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m, \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m, \u001b[0m\u001b[33mtzinfo\u001b[0m\u001b[39m=\u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[32m'invalid_at'\u001b[0m: \u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" + "\u001B[1m[\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m: \u001B[32m'1055fb8279af4c4c8c3fb78350d610d0'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m: \u001B[32m'8b43988e689b437095c7e75aa1044490'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m: \u001B[32m'b30e3ba27aa14f88895156331a435237'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m31\u001B[0m, \u001B[1;36m11\u001B[0m, \u001B[1;36m37\u001B[0m, \u001B[1;36m39\u001B[0m, \u001B[1;36m664102\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m: \u001B[32m'CAUSES_DISCOMFORT'\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m: \u001B[32m\"John's wide feet cause discomfort with the Men's Couriers shoes\"\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'37c0e9ecaa424caea59854d1d8c2c756'\u001B[0m\u001B[1m]\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m: \u001B[1;35mdatetime.datetime\u001B[0m\u001B[1m(\u001B[0m\u001B[1;36m2024\u001B[0m, \u001B[1;36m8\u001B[0m, \u001B[1;36m20\u001B[0m, \u001B[1;36m0\u001B[0m, \u001B[1;36m1\u001B[0m, \u001B[33mtzinfo\u001B[0m=\u001B[1m<\u001B[0m\u001B[1;95mUTC\u001B[0m\u001B[39m>\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m}\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'199ec767d52c47d2a5965f3197b1c4d2'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'b30e3ba27aa14f88895156331a435237'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m8\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m31\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m11\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m36\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m42\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m827088\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'PURCHASES'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m\"John purchased the Men's Couriers shoes but later decided to return them due to discomfort caused by his wide feet\"\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;39m[\u001B[0m\u001B[32m'4c8afb4aa1b446899a85249df475bc66'\u001B[0m\u001B[1;39m]\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m8\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m31\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m11\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m38\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m14\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m818497\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m7\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m30\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m0\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m5\u001B[0m\u001B[39m, \u001B[0m\u001B[33mtzinfo\u001B[0m\u001B[39m=\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m}\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'2a9cf189e19649c19ec127c4024cfe51'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'77f8b23b74014a7f85fffa0067dbf815'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m8\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m31\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m11\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m34\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m57\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m412667\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'INTERESTED_IN'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'John is looking for a new pair of shoes'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;39m[\u001B[0m\u001B[32m'c2ebc79d2a204efb845be84b6dbf69d7'\u001B[0m\u001B[1;39m]\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m}\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'4721330c8f2b45e69e07f520773f8794'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'd362076a1e584227bcf51239914e39ad'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'ed9688ba1e9940ff87d3e26bcf5d7ae4'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m8\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m31\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m11\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m36\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m12\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m540437\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'RECOMMENDS'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m\"SalesBot recommends Men's Couriers shoes to the customer\"\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;39m[\u001B[0m\u001B[32m'e7c29d5d38854cac801bc07d236240a8'\u001B[0m\u001B[1;39m]\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m}\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1;39m{\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'df1d2e82a40e40e1b3734c2298774a6b'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'source_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'c4091c3ffc814f2c9017304361898585'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'target_node_uuid'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'588989497641456fb33243f035731f98'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'created_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m8\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m31\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m11\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m36\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m42\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m828745\u001B[0m\u001B[1;39m)\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'name'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'LIKES'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'fact'\u001B[0m\u001B[39m: \u001B[0m\u001B[32m'John expresses that he likes the Basin Blue color for the shoes'\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'episodes'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;39m[\u001B[0m\u001B[32m'4c8afb4aa1b446899a85249df475bc66'\u001B[0m\u001B[1;39m]\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'expired_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[3;35mNone\u001B[0m\u001B[39m,\u001B[0m\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'valid_at'\u001B[0m\u001B[39m: \u001B[0m\u001B[1;35mdatetime.datetime\u001B[0m\u001B[1;39m(\u001B[0m\u001B[1;36m2024\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m7\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m30\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m0\u001B[0m\u001B[39m, \u001B[0m\u001B[1;36m5\u001B[0m\u001B[39m, \u001B[0m\u001B[33mtzinfo\u001B[0m\u001B[39m=\u001B[0m\u001B[1m)\u001B[0m,\n", + "\u001B[2;32m│ │ \u001B[0m\u001B[32m'invalid_at'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + "\u001B[2;32m│ \u001B[0m\u001B[1m}\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" ] }, "metadata": {}, diff --git a/examples/langgraph-agent/agent.ipynb b/examples/langgraph-agent/agent.ipynb index e58dbc3a..688c25ce 100644 --- a/examples/langgraph-agent/agent.ipynb +++ b/examples/langgraph-agent/agent.ipynb @@ -45,7 +45,7 @@ "import sys\n", "import uuid\n", "from contextlib import suppress\n", - "from datetime import datetime\n", + "from datetime import datetime, timezone\n", "from pathlib import Path\n", "from typing import Annotated\n", "\n", @@ -191,7 +191,7 @@ " content=str({k: v for k, v in product.items() if k != 'images'}),\n", " source_description='ManyBirds products',\n", " source=EpisodeType.json,\n", - " reference_time=datetime.now(),\n", + " reference_time=datetime.now(timezone.utc),\n", " )\n", " for i, product in enumerate(products)\n", " ]\n", @@ -217,23 +217,25 @@ "metadata": {}, "outputs": [], "source": [ + "from graphiti_core.search.search_config_recipes import NODE_HYBRID_SEARCH_RRF\n", + "\n", "user_name = 'jess'\n", "\n", "await client.add_episode(\n", " name='User Creation',\n", " episode_body=(f'{user_name} is interested in buying a pair of shoes'),\n", " source=EpisodeType.text,\n", - " reference_time=datetime.now(),\n", + " reference_time=datetime.now(timezone.utc),\n", " source_description='SalesBot',\n", ")\n", "\n", "# let's get Jess's node uuid\n", - "nl = await client.get_nodes_by_query(user_name)\n", + "nl = await client._search(user_name, NODE_HYBRID_SEARCH_RRF)\n", "\n", "user_node_uuid = nl[0].uuid\n", "\n", "# and the ManyBirds node uuid\n", - "nl = await client.get_nodes_by_query('ManyBirds')\n", + "nl = await client._search('ManyBirds', NODE_HYBRID_SEARCH_RRF)\n", "manybirds_node_uuid = nl[0].uuid" ] }, @@ -390,7 +392,7 @@ " name='Chatbot Response',\n", " episode_body=f\"{state['user_name']}: {state['messages'][-1]}\\nSalesBot: {response.content}\",\n", " source=EpisodeType.message,\n", - " reference_time=datetime.now(),\n", + " reference_time=datetime.now(timezone.utc),\n", " source_description='Chatbot',\n", " )\n", " )\n", @@ -443,7 +445,6 @@ "graph_builder.add_conditional_edges('agent', should_continue, {'continue': 'tools', 'end': END})\n", "graph_builder.add_edge('tools', 'agent')\n", "\n", - "\n", "graph = graph_builder.compile(checkpointer=memory)" ] }, diff --git a/graphiti_core/graphiti.py b/graphiti_core/graphiti.py index c82e0630..74d5edec 100644 --- a/graphiti_core/graphiti.py +++ b/graphiti_core/graphiti.py @@ -35,8 +35,6 @@ from graphiti_core.search.search_config_recipes import ( EDGE_HYBRID_SEARCH_NODE_DISTANCE, EDGE_HYBRID_SEARCH_RRF, - NODE_HYBRID_SEARCH_NODE_DISTANCE, - NODE_HYBRID_SEARCH_RRF, ) from graphiti_core.search.search_utils import ( RELEVANT_SCHEMA_LIMIT, @@ -318,7 +316,7 @@ async def add_episode_endpoint(episode_data: EpisodeData): now = datetime.now(timezone.utc) previous_episodes = await self.retrieve_episodes( - reference_time, last_n=3, group_ids=[group_id] + reference_time, last_n=RELEVANT_SCHEMA_LIMIT, group_ids=[group_id] ) episode = EpisodicNode( name=name, @@ -343,13 +341,14 @@ async def add_episode_endpoint(episode_data: EpisodeData): *[node.generate_name_embedding(self.embedder) for node in extracted_nodes] ) - # Resolve extracted nodes with nodes already in the graph and extract facts + # Find relevant nodes already in the graph existing_nodes_lists: list[list[EntityNode]] = list( await asyncio.gather( - *[get_relevant_nodes([node], self.driver) for node in extracted_nodes] + *[get_relevant_nodes(self.driver, [node]) for node in extracted_nodes] ) ) + # Resolve extracted nodes with nodes already in the graph and extract facts logger.debug(f'Extracted nodes: {[(n.name, n.uuid) for n in extracted_nodes]}') (mentioned_nodes, uuid_map), extracted_edges = await asyncio.gather( @@ -693,67 +692,6 @@ async def _search( bfs_origin_node_uuids, ) - async def get_nodes_by_query( - self, - query: str, - center_node_uuid: str | None = None, - group_ids: list[str] | None = None, - limit: int = DEFAULT_SEARCH_LIMIT, - ) -> list[EntityNode]: - """ - Retrieve nodes from the graph database based on a text query. - - This method performs a hybrid search using both text-based and - embedding-based approaches to find relevant nodes. - - Parameters - ---------- - query : str - The text query to search for in the graph - center_node_uuid: str, optional - Facts will be reranked based on proximity to this node. - group_ids : list[str | None] | None, optional - The graph partitions to return data from. - limit : int | None, optional - The maximum number of results to return per search method. - If None, a default limit will be applied. - - Returns - ------- - list[EntityNode] - A list of EntityNode objects that match the search criteria. - - Notes - ----- - This method uses the following steps: - 1. Generates an embedding for the input query using the LLM client's embedder. - 2. Calls the hybrid_node_search function with both the text query and its embedding. - 3. The hybrid search combines fulltext search and vector similarity search - to find the most relevant nodes. - - The method leverages the LLM client's embedding capabilities to enhance - the search with semantic similarity matching. The 'limit' parameter is applied - to each individual search method before results are combined and deduplicated. - If not specified, a default limit (defined in the search functions) will be used. - """ - search_config = ( - NODE_HYBRID_SEARCH_RRF if center_node_uuid is None else NODE_HYBRID_SEARCH_NODE_DISTANCE - ) - search_config.limit = limit - - nodes = ( - await search( - self.driver, - self.embedder, - self.cross_encoder, - query, - group_ids, - search_config, - center_node_uuid, - ) - ).nodes - return nodes - async def get_episode_mentions(self, episode_uuids: list[str]) -> SearchResults: episodes = await EpisodicNode.get_by_uuids(self.driver, episode_uuids) @@ -781,8 +719,8 @@ async def add_triplet(self, source_node: EntityNode, edge: EntityEdge, target_no self.llm_client, [source_node, target_node], [ - await get_relevant_nodes([source_node], self.driver), - await get_relevant_nodes([target_node], self.driver), + await get_relevant_nodes(self.driver, [source_node]), + await get_relevant_nodes(self.driver, [target_node]), ], ) diff --git a/graphiti_core/search/search_utils.py b/graphiti_core/search/search_utils.py index c981950c..fb8bb0c8 100644 --- a/graphiti_core/search/search_utils.py +++ b/graphiti_core/search/search_utils.py @@ -146,7 +146,7 @@ async def edge_fulltext_search( return [] cypher_query = Query(""" - CALL db.index.fulltext.queryRelationships("edge_name_and_fact", $query) + CALL db.index.fulltext.queryRelationships("edge_name_and_fact", $query, {limit: $limit}) YIELD relationship AS rel, score MATCH (n:Entity)-[r {uuid: rel.uuid}]->(m:Entity) WHERE ($source_uuid IS NULL OR n.uuid IN [$source_uuid, $target_uuid]) @@ -296,7 +296,7 @@ async def node_fulltext_search( records, _, _ = await driver.execute_query( """ - CALL db.index.fulltext.queryNodes("node_name_and_summary", $query) + CALL db.index.fulltext.queryNodes("node_name_and_summary", $query, {limit: $limit}) YIELD node AS n, score RETURN n.uuid AS uuid, @@ -407,7 +407,7 @@ async def community_fulltext_search( records, _, _ = await driver.execute_query( """ - CALL db.index.fulltext.queryNodes("community_name", $query) + CALL db.index.fulltext.queryNodes("community_name", $query, {limit: $limit}) YIELD node AS comm, score RETURN comm.uuid AS uuid, @@ -539,8 +539,8 @@ async def hybrid_node_search( async def get_relevant_nodes( - nodes: list[EntityNode], driver: AsyncDriver, + nodes: list[EntityNode], ) -> list[EntityNode]: """ Retrieve relevant nodes based on the provided list of EntityNodes. @@ -573,6 +573,7 @@ async def get_relevant_nodes( driver, [node.group_id for node in nodes], ) + return relevant_nodes diff --git a/graphiti_core/utils/bulk_utils.py b/graphiti_core/utils/bulk_utils.py index d57dc6bd..7b4ebf02 100644 --- a/graphiti_core/utils/bulk_utils.py +++ b/graphiti_core/utils/bulk_utils.py @@ -169,7 +169,7 @@ async def dedupe_nodes_bulk( existing_nodes_chunks: list[list[EntityNode]] = list( await asyncio.gather( - *[get_relevant_nodes(node_chunk, driver) for node_chunk in node_chunks] + *[get_relevant_nodes(driver, node_chunk) for node_chunk in node_chunks] ) ) diff --git a/graphiti_core/utils/maintenance/community_operations.py b/graphiti_core/utils/maintenance/community_operations.py index 897b7d7d..805ebe12 100644 --- a/graphiti_core/utils/maintenance/community_operations.py +++ b/graphiti_core/utils/maintenance/community_operations.py @@ -305,7 +305,7 @@ async def update_community( community.name = new_name if is_new: - community_edge = (build_community_edges([entity], community, datetime.now()))[0] + community_edge = (build_community_edges([entity], community, datetime.now(timezone.utc)))[0] await community_edge.save(driver) await community.generate_name_embedding(embedder) diff --git a/tests/test_graphiti_int.py b/tests/test_graphiti_int.py index 5c4ce04c..5ce2ad74 100644 --- a/tests/test_graphiti_int.py +++ b/tests/test_graphiti_int.py @@ -98,14 +98,10 @@ async def test_graphiti_init(): await graphiti.add_triplet(alice_node, entity_edge, bob_node) - episodes = await graphiti.retrieve_episodes(datetime.now(timezone.utc), group_ids=None) - episode_uuids = [episode.uuid for episode in episodes] - results = await graphiti._search( "Emily: I can't log in", COMBINED_HYBRID_SEARCH_CROSS_ENCODER, - bfs_origin_node_uuids=episode_uuids, - group_ids=None, + group_ids=['test'], ) pretty_results = { 'edges': [edge.fact for edge in results.edges],