FactKit - managing and querying simple factual knowledge bases
Project description
fk - FactKit: Functional Knowledge for AI
F.K. - FactKit is a lightweight Python package designed for managing and querying simple factual knowledge bases, enabling quick lookup and retrieval of structured data for AI applications. It provides a clean, Pythonic interface, abstracting away the complexities of data storage and manipulation by leveraging powerful existing libraries like pandas and dol.
Features
- Simple Knowledge Representation: Store facts as structured data (like rows in a table or key-value pairs).
- Intuitive Interface: Interact with your knowledge base using standard Python
MappingandMutableMapping(dictionary-like) behaviors. - Flexible Storage Backends: Easily read and write knowledge from/to local files (JSON, CSV) with extensible support for other storage types via
dol. - Efficient Querying: Quickly retrieve relevant facts using simple filtering mechanisms powered by
pandas. - Mall for Multi-Store Management: Organize and access multiple distinct knowledge stores (e.g., "facts", "metadata", "configurations") through a single dictionary-like "mall" object.
Installation
FactKit can be installed via pip:
pip install fk
Dependencies: FactKit relies on the following packages, which will be installed automatically:
pandasdol
Usage
1. The KnowledgeBase Object
The core of fk is the KnowledgeBase class, which behaves like a dictionary:
from fk import KnowledgeBase
# Create an empty knowledge base
kb = KnowledgeBase()
# Add facts (key-value pairs)
kb['apple_info'] = {'name': 'Apple', 'type': 'fruit', 'color': 'red', 'taste': 'sweet'}
kb['banana_info'] = {'name': 'Banana', 'type': 'fruit', 'color': 'yellow', 'taste': 'sweet'}
kb['carrot_info'] = {'name': 'Carrot', 'type': 'vegetable', 'color': 'orange', 'taste': 'earthy'}
# Access facts
print(kb['apple_info'])
# Output: {'name': 'Apple', 'type': 'fruit', 'color': 'red', 'taste': 'sweet'}
# Update a fact
kb['apple_info'] = {'name': 'Apple', 'type': 'fruit', 'color': 'green', 'taste': 'tart'}
print(kb['apple_info'])
# Delete a fact
del kb['banana_info']
print(len(kb)) # Output: 2
# Iterate over keys
for key in kb:
print(key)
# Querying with filters
fruits = kb.query(filters={'type': 'fruit'})
print(fruits)
# Output: [{'name': 'Apple', 'type': 'fruit', 'color': 'green', 'taste': 'tart'}]
# Get the underlying pandas DataFrame
df = kb.to_dataframe()
print(df)
# Initialize from existing data
initial_data = [
{'id': 'water', 'element': 'H2O', 'state': 'liquid'},
{'id': 'oxygen', 'element': 'O2', 'state': 'gas'}
]
kb2 = KnowledgeBase(initial_data)
print(kb2['water'])
2. File-Based Knowledge Storage (Facade over dol)
fk provides convenient functions to load and save KnowledgeBase objects from/to local files, and a create_store function to directly interface with file systems as MutableMapping objects.
Loading/Saving KnowledgeBase
from fk import KnowledgeBase, load_from_csv, save_to_json, save_to_csv, load_from_json
import os
# Example data
data = [
{'item_id': 1, 'name': 'Laptop', 'category': 'Electronics', 'price': 1200},
{'item_id': 2, 'name': 'Mouse', 'category': 'Electronics', 'price': 25},
{'item_id': 3, 'name': 'Keyboard', 'category': 'Electronics', 'price': 75}
]
initial_kb = KnowledgeBase(data)
# Save to JSON
save_to_json(initial_kb, 'my_knowledge.json')
print("Knowledge saved to my_knowledge.json")
# Load from JSON
loaded_kb = load_from_json('my_knowledge.json')
print(loaded_kb.query(filters={'category': 'Electronics'}))
# Save to CSV
save_to_csv(initial_kb, 'my_knowledge.csv', index=False) # index=False to avoid writing pandas index
print("Knowledge saved to my_knowledge.csv")
# Load from CSV (assuming the first column in CSV could be treated as an index)
loaded_kb_csv = load_from_csv('my_knowledge.csv', index_col='item_id') # Specify the index column
print(loaded_kb_csv[1]) # Access by item_id
# Cleanup
os.remove('my_knowledge.json')
os.remove('my_knowledge.csv')
Direct Store Interface (create_store)
For more granular control or when working with individual files as key-value pairs (for JSON), use create_store.
from fk import create_store
import os
import shutil
# Create a directory for JSON files
json_dir = './data_json_store'
os.makedirs(json_dir, exist_ok=True)
json_store = create_store(json_dir, format='json')
# Add/retrieve items to the store
json_store['user_123'] = {'name': 'Alice', 'email': 'alice@example.com'}
json_store['product_xyz'] = {'product_name': 'Widget', 'price': 19.99}
print(json_store['user_123'])
# Output: {'name': 'Alice', 'email': 'alice@example.com'}
# List keys in the store
print(list(json_store.keys()))
# Create a directory for CSV (single file mode)
csv_dir = './data_csv_store'
os.makedirs(csv_dir, exist_ok=True)
csv_store = create_store(csv_dir, format='csv')
# Add/retrieve items (these will be stored in a single 'knowledge.csv' file inside csv_dir)
csv_store['fact_1'] = {'subject': 'Earth', 'predicate': 'is', 'object': 'planet'}
csv_store['fact_2'] = {'subject': 'Sun', 'predicate': 'is', 'object': 'star'}
print(csv_store['fact_1'])
# Cleanup
shutil.rmtree(json_dir)
shutil.rmtree(csv_dir)
3. Managing Multiple Stores with create_mall
The create_mall function allows you to define and access multiple knowledge stores, each with its own path and format, from a single dictionary.
from fk import create_mall
import os
import shutil
# Define configurations for different stores
mall_configs = {
'users': {'path': './data/users', 'format': 'json'},
'products': {'path': './data/products.csv', 'format': 'csv'}, # Specific CSV file
'configurations': {'path': './data/configs', 'format': 'json'}
}
# Create the mall
my_mall = create_mall(mall_configs)
# Access individual stores through the mall
users_store = my_mall['users']
products_store = my_mall['products']
configs_store = my_mall['configurations']
# Use the stores
users_store['u1'] = {'name': 'Bob', 'role': 'admin'}
products_store['p101'] = {'name': 'Gizmo', 'stock': 150}
configs_store['default_settings'] = {'timeout': 30, 'log_level': 'INFO'}
print(users_store['u1'])
print(products_store['p101'])
# Cleanup
shutil.rmtree('./data')
Contributing
Contributions are welcome! If you have ideas for new features, improvements, or bug fixes, please open an issue or submit a pull request.
License
This project is licensed under the MIT License. See the LICENSE file for details.
Note: For the create_store and create_mall functions with csv format, especially when treating a directory as a CSV store, it will manage a single file named knowledge.csv within that directory. If you specify a direct .csv file path in the mall_configs, it will operate on that specific file. This design choice simplifies the MutableMapping facade for CSV, as CSV is inherently a tabular, not key-value, storage.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fk-0.0.9.tar.gz.
File metadata
- Download URL: fk-0.0.9.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7df419162a118bc526c2b910d438508c4e2c152d58a4bae0225885fe8c3424d
|
|
| MD5 |
293a37b280cd64f31a41e2325e96a81d
|
|
| BLAKE2b-256 |
27075d45672e618ba09b8ee298544a3120259f80e5faccbe15724db43ee9692a
|
File details
Details for the file fk-0.0.9-py3-none-any.whl.
File metadata
- Download URL: fk-0.0.9-py3-none-any.whl
- Upload date:
- Size: 11.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f830f5db39012c8bfcbc6808c9ed8f7052fc0d9567a52674cdd87029d14fb79a
|
|
| MD5 |
5080053f295891b362e5033e43d44442
|
|
| BLAKE2b-256 |
871f5ba293ee0bea7027426a6facff3eba96b51ca6790c17766033cee2dfc5b9
|