pyrdfrules


Namepyrdfrules JSON
Version 1.0.2 PyPI version JSON
download
home_pageNone
SummaryPython wrapper for RDFRules.
upload_time2025-01-19 12:08:04
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseMIT
keywords rdf rdfrules rules
VCS
bugtrack_url
requirements annotated-types anyio appnope argcomplete asttokens black certifi charset-normalizer click comm datamodel-code-generator debugpy decorator dnspython email_validator executing flake8 genson h11 httpcore httpx idna inflect iniconfig install-jdk ipykernel ipython isort jedi Jinja2 JPype1 jupyter_client jupyter_core markdown-it-py markdown-table-generator MarkupSafe matplotlib-inline mccabe mdurl mypy-extensions nest-asyncio packaging pandas parso pathspec pdoc pexpect platformdirs pluggy prompt_toolkit psutil ptyprocess pure_eval py-markdown-table pycodestyle pydantic pydantic_core pyflakes Pygments python-dateutil pytz PyYAML pyzmq requests rich six sniffio stack-data tornado tqdm traitlets typing typing_extensions tzdata urllib3 wcwidth
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
[![PyPI - Version](https://img.shields.io/pypi/v/pyrdfrules.svg)](https://pypi.org/project/pyrdfrules)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pyrdfrules.svg)](https://pypi.org/project/pyrdfrules)
[![PyPI - Python Version](https://raw.githubusercontent.com/KIZI/pyrdfrules/python-coverage-comment-action-data/badge.svg)](https://htmlpreview.github.io/?https://github.com/KIZI/pyrdfrules/blob/python-coverage-comment-action-data/htmlcov/index.html)

<p align="center">
  <img src="https://s3.dualstack.us-east-2.amazonaws.com/pythondotorg-assets/media/files/python-logo-only.svg">
</p>

<h1 align="center">
PyRDFRules
</h1>

<p align="center">
  <a href="https://github.com/propi/rdfrules">
    RDFRules
  </a>
  •
  <a href="#quickstart">
    Quickstart
  </a>
  •
  <a href="https://kizi.github.io/pyrdfrules/pyrdfrules.html">
    Documentation
  </a>
  •
  <a href="https://www.vse.cz/">
   VŠE
  </a>
</p>

-----

**Table of Contents**

- [PyRDFRules](#pyrdfrules)
  - [RDFRules](#rdfrules)
- [Quickstart](#quickstart)
- [Getting started](#getting-started)
  - [Prerequisites](#prerequisites)
  - [Installation](#installation)
  - [Usage](#usage)
    - [Remote instance](#remote-instance)
    - [Local instance](#local-instance)
    - [Run a task](#run-a-task)
- [Developing](#developing)
- [Releasing a new version](#releasing-a-new-version)
  - [Updating RDFRules](#updating-rdfrules)
- [Roadmap](#roadmap)
- [Contributing](#contributing)
- [License](#license)
- [Acknowledgments](#acknowledgments)

## PyRDFRules

PyRDFRules is a Python wrapper for the graph rule mining tool RDFRules. Currently supports the RDFRules version `1.9.0`. The added value of this library is exposing a Pythonic interface to define pipelines for tasks that can be handled by RDFRules, as well as provisioning RDFRules locally, and finally, some convenience methods and other APIs are added to faciliate easier usage of RDFRules.

### RDFRules

> RDFRules is a powerful analytical tool for rule mining from RDF knowledge graphs. It offers a complex rule mining solution including RDF data pre-processing, rules post-processing and prediction abilities from rules. The core of RDFRules is written in the Scala language. Besides the Scala API, RDFRules also provides REST web service with graphical user interface via a web browser.

Repository for RDFRules can be found at [propi/rdfrules](https://github.com/propi/rdfrules).

## Quickstart

To try out PyRDFRules, you can use Google Colab to provision an environment for you.

* [Template RDFRules Notebook](https://colab.research.google.com/drive/1KCyv7b6RtQgQXk-V-oTjYpiQsC-_mFHp?usp=sharing) - use this notebook as a start for your analysis workloads, provisions the PyRDFRules library and local RDFRules.
* [Pipeline sample](https://colab.research.google.com/drive/192YaNsbpqoD9-he32OaY2nTi-E_ctXYT?usp=sharing) - a sample pipeline on a local instance of RDFRules, from starting the instance to getting the results.
* [Histogram example](https://colab.research.google.com/drive/1WfvvDTj3Zv0EJcLRiWl2EqEFgV42grra?usp=sharing) Showcases the histogram functionality of (Py)RDFRules, and can be used as a first step in analysis workloads for to understand the data.
* 

## Getting started

PyRDFRules is distributed as a Python library through PyPi. The primary goal of this API is to faciliate the easy use of RDFRules through a Python interface.

### Prerequisites

A minimum Python version of `3.12.2` is required. You can check your Python version using `python --version`.

### Installation

```console
pip install pyrdfrules
```

### Usage

Full documentation is available at [a dedicated documentation site](https://kizi.github.io/pyrdfrules/pyrdfrules.html). Code samples can be found in the sample directory, including a Python notebook.

Currently, using a remote HTTP instance of RDFRules or a local instance of RDFRules is supported. Automatic installation of JVM if not present and of RDFRules is supported, and the library takes care of running the RDFRules application.

#### Remote instance

To connect to a remote instance of RDFRules, create an application and use the start_remote method.

```python
from pydantic_core import Url

import pyrdfrules.application

app = pyrdfrules.application.Application()

rdfrules = app.start_remote(
    url = Url("http://YOUR_RDFRULES_INSTANCE/api/")
)
```

#### Local instance

To set up a local instance of PyRDFRules

```python
# Recommended: Configure your workspace directory.

config = Config(
    workspace_path=os.path.realpath("YOUR_WORKSPACE_DIRECTORY")
)

app = pyrdfrules.application.Application()
        
app.start_local(
    install_jvm = True, # If you wish for Python to install JVM for you, set to true.
    install_rdfrules = True, # If you wish for Python to install RDFRules, set to true.
    rdfrules_path = "...", # Installation path for RDFRules. If you set install_rdfrules to False, it will expect RDFRule to be installed in this location.
    jvm_path = "", # Installation path for the JVM.
    config = config
)
```

As a last step, launch the pipeline, wait for all results and print the head, body and measures of each mined rule.

#### Run a task

A task is a series of steps (a pipeline) provided to RDFRules. Tasks are used to mine rules, index, cache or otherwise manipulate data...

If you have a JSON task ready, you can execute it in the following way:

```python
from pyrdfrules.common.task.task import Task

task : Task = None

with open("./task.json", "r") as file:        
    task_json_from_file = file.read()
    task = rdfrules.task.create_task_from_string(task_json_from_file)
```

You can also specify the pipeline in code.

```python

pipeline = Pipeline(
    tasks=[
        LoadGraph(
            graphName = "<dbpedia>",
            path = "/dbpedia_yago/mappingbased_objects_sample.ttl"
        ),
        ... # your other tasks go here
        GetRules()
    ]
)

task = self.rdfrules.task.create_task(pipeline)
    
for step in self.rdfrules.task.run_task(task):
      print(step)
  
print(task.result) # access task result dictionary - pure output from RDFRules
print(task.get_result()) # returns formatted outputs
```

Task execution is non blocking and you can stop it, as long as it is not finished in RDFRules.

Full pipeline sample matching the DBpedia & YAGO example from the RDFRules web instance can be found in documentation [doc](https://kizi.github.io/pyrdfrules/pyrdfrules.html), or in `src/tests/test_pipeline.py`.

## Developing

To initialize your environment:

```console
./init.sh
```

To run a build and run jupyter lab:

```console
./run.sh
```

## Releasing a new version

* Up the version in `src/__about__.py`.
* Run hatch build
* Run hatch publish

Alternatively, after upping the version, run `./build.sh`.

### Updating RDFRules
* In `src/pyrdfrules/rdfrules/release.py` update the URI to the RDFRules HTTP ZIP path.
* If the startup options change, please ensure that the function `start_rdfrules` in  `src/pyrdfrules/engine/util/jvm.py` matches the changes.

## Roadmap

- [x] Sample interface
- [x] Implement JSON serialization of pipeline
- [x] Implement communication with RDFRules

## Contributing

If you have a suggestion to improve this project, please fork the repo and create a pull request. If you encounter any issues, please do raise an [issue](https://github.com/KIZI/pyrdfrules/issues) with an appropriate tag. Feature requests, enhancements and bug reports are welcome.

To contribute to this project, first:

- Fork the Project
- Create your Feature Branch (git checkout -b feature/AmazingFeature)
- Commit your Changes (git commit -m 'Add some AmazingFeature')
- Push to the Branch (git push origin feature/AmazingFeature)
- Open a Pull Request

## License

`pyrdfrules` is distributed under the terms of the Apache License. See `LICENSE` for more information.

## Acknowledgments
* [RDFRules@propi/rdfrules](https://github.com/propi/rdfrules)
* [VŠE](https://www.vse.cz/)
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pyrdfrules",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "rdf, rdfrules, rules",
    "author": null,
    "author_email": "Karel Douda <kareldouda1@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/5a/9d/221a2a011cee39272d8b8a1daa5c3f7103873ca80e3955d27e2324e7cc7d/pyrdfrules-1.0.2.tar.gz",
    "platform": null,
    "description": "\n[![PyPI - Version](https://img.shields.io/pypi/v/pyrdfrules.svg)](https://pypi.org/project/pyrdfrules)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pyrdfrules.svg)](https://pypi.org/project/pyrdfrules)\n[![PyPI - Python Version](https://raw.githubusercontent.com/KIZI/pyrdfrules/python-coverage-comment-action-data/badge.svg)](https://htmlpreview.github.io/?https://github.com/KIZI/pyrdfrules/blob/python-coverage-comment-action-data/htmlcov/index.html)\n\n<p align=\"center\">\n  <img src=\"https://s3.dualstack.us-east-2.amazonaws.com/pythondotorg-assets/media/files/python-logo-only.svg\">\n</p>\n\n<h1 align=\"center\">\nPyRDFRules\n</h1>\n\n<p align=\"center\">\n  <a href=\"https://github.com/propi/rdfrules\">\n    RDFRules\n  </a>\n  \u2022\n  <a href=\"#quickstart\">\n    Quickstart\n  </a>\n  \u2022\n  <a href=\"https://kizi.github.io/pyrdfrules/pyrdfrules.html\">\n    Documentation\n  </a>\n  \u2022\n  <a href=\"https://www.vse.cz/\">\n   V\u0160E\n  </a>\n</p>\n\n-----\n\n**Table of Contents**\n\n- [PyRDFRules](#pyrdfrules)\n  - [RDFRules](#rdfrules)\n- [Quickstart](#quickstart)\n- [Getting started](#getting-started)\n  - [Prerequisites](#prerequisites)\n  - [Installation](#installation)\n  - [Usage](#usage)\n    - [Remote instance](#remote-instance)\n    - [Local instance](#local-instance)\n    - [Run a task](#run-a-task)\n- [Developing](#developing)\n- [Releasing a new version](#releasing-a-new-version)\n  - [Updating RDFRules](#updating-rdfrules)\n- [Roadmap](#roadmap)\n- [Contributing](#contributing)\n- [License](#license)\n- [Acknowledgments](#acknowledgments)\n\n## PyRDFRules\n\nPyRDFRules is a Python wrapper for the graph rule mining tool RDFRules. Currently supports the RDFRules version `1.9.0`. The added value of this library is exposing a Pythonic interface to define pipelines for tasks that can be handled by RDFRules, as well as provisioning RDFRules locally, and finally, some convenience methods and other APIs are added to faciliate easier usage of RDFRules.\n\n### RDFRules\n\n> RDFRules is a powerful analytical tool for rule mining from RDF knowledge graphs. It offers a complex rule mining solution including RDF data pre-processing, rules post-processing and prediction abilities from rules. The core of RDFRules is written in the Scala language. Besides the Scala API, RDFRules also provides REST web service with graphical user interface via a web browser.\n\nRepository for RDFRules can be found at [propi/rdfrules](https://github.com/propi/rdfrules).\n\n## Quickstart\n\nTo try out PyRDFRules, you can use Google Colab to provision an environment for you.\n\n* [Template RDFRules Notebook](https://colab.research.google.com/drive/1KCyv7b6RtQgQXk-V-oTjYpiQsC-_mFHp?usp=sharing) - use this notebook as a start for your analysis workloads, provisions the PyRDFRules library and local RDFRules.\n* [Pipeline sample](https://colab.research.google.com/drive/192YaNsbpqoD9-he32OaY2nTi-E_ctXYT?usp=sharing) - a sample pipeline on a local instance of RDFRules, from starting the instance to getting the results.\n* [Histogram example](https://colab.research.google.com/drive/1WfvvDTj3Zv0EJcLRiWl2EqEFgV42grra?usp=sharing) Showcases the histogram functionality of (Py)RDFRules, and can be used as a first step in analysis workloads for to understand the data.\n* \n\n## Getting started\n\nPyRDFRules is distributed as a Python library through PyPi. The primary goal of this API is to faciliate the easy use of RDFRules through a Python interface.\n\n### Prerequisites\n\nA minimum Python version of `3.12.2` is required. You can check your Python version using `python --version`.\n\n### Installation\n\n```console\npip install pyrdfrules\n```\n\n### Usage\n\nFull documentation is available at [a dedicated documentation site](https://kizi.github.io/pyrdfrules/pyrdfrules.html). Code samples can be found in the sample directory, including a Python notebook.\n\nCurrently, using a remote HTTP instance of RDFRules or a local instance of RDFRules is supported. Automatic installation of JVM if not present and of RDFRules is supported, and the library takes care of running the RDFRules application.\n\n#### Remote instance\n\nTo connect to a remote instance of RDFRules, create an application and use the start_remote method.\n\n```python\nfrom pydantic_core import Url\n\nimport pyrdfrules.application\n\napp = pyrdfrules.application.Application()\n\nrdfrules = app.start_remote(\n    url = Url(\"http://YOUR_RDFRULES_INSTANCE/api/\")\n)\n```\n\n#### Local instance\n\nTo set up a local instance of PyRDFRules\n\n```python\n# Recommended: Configure your workspace directory.\n\nconfig = Config(\n    workspace_path=os.path.realpath(\"YOUR_WORKSPACE_DIRECTORY\")\n)\n\napp = pyrdfrules.application.Application()\n        \napp.start_local(\n    install_jvm = True, # If you wish for Python to install JVM for you, set to true.\n    install_rdfrules = True, # If you wish for Python to install RDFRules, set to true.\n    rdfrules_path = \"...\", # Installation path for RDFRules. If you set install_rdfrules to False, it will expect RDFRule to be installed in this location.\n    jvm_path = \"\", # Installation path for the JVM.\n    config = config\n)\n```\n\nAs a last step, launch the pipeline, wait for all results and print the head, body and measures of each mined rule.\n\n#### Run a task\n\nA task is a series of steps (a pipeline) provided to RDFRules. Tasks are used to mine rules, index, cache or otherwise manipulate data...\n\nIf you have a JSON task ready, you can execute it in the following way:\n\n```python\nfrom pyrdfrules.common.task.task import Task\n\ntask : Task = None\n\nwith open(\"./task.json\", \"r\") as file:        \n    task_json_from_file = file.read()\n    task = rdfrules.task.create_task_from_string(task_json_from_file)\n```\n\nYou can also specify the pipeline in code.\n\n```python\n\npipeline = Pipeline(\n    tasks=[\n        LoadGraph(\n            graphName = \"<dbpedia>\",\n            path = \"/dbpedia_yago/mappingbased_objects_sample.ttl\"\n        ),\n        ... # your other tasks go here\n        GetRules()\n    ]\n)\n\ntask = self.rdfrules.task.create_task(pipeline)\n    \nfor step in self.rdfrules.task.run_task(task):\n      print(step)\n  \nprint(task.result) # access task result dictionary - pure output from RDFRules\nprint(task.get_result()) # returns formatted outputs\n```\n\nTask execution is non blocking and you can stop it, as long as it is not finished in RDFRules.\n\nFull pipeline sample matching the DBpedia & YAGO example from the RDFRules web instance can be found in documentation [doc](https://kizi.github.io/pyrdfrules/pyrdfrules.html), or in `src/tests/test_pipeline.py`.\n\n## Developing\n\nTo initialize your environment:\n\n```console\n./init.sh\n```\n\nTo run a build and run jupyter lab:\n\n```console\n./run.sh\n```\n\n## Releasing a new version\n\n* Up the version in `src/__about__.py`.\n* Run hatch build\n* Run hatch publish\n\nAlternatively, after upping the version, run `./build.sh`.\n\n### Updating RDFRules\n* In `src/pyrdfrules/rdfrules/release.py` update the URI to the RDFRules HTTP ZIP path.\n* If the startup options change, please ensure that the function `start_rdfrules` in  `src/pyrdfrules/engine/util/jvm.py` matches the changes.\n\n## Roadmap\n\n- [x] Sample interface\n- [x] Implement JSON serialization of pipeline\n- [x] Implement communication with RDFRules\n\n## Contributing\n\nIf you have a suggestion to improve this project, please fork the repo and create a pull request. If you encounter any issues, please do raise an [issue](https://github.com/KIZI/pyrdfrules/issues) with an appropriate tag. Feature requests, enhancements and bug reports are welcome.\n\nTo contribute to this project, first:\n\n- Fork the Project\n- Create your Feature Branch (git checkout -b feature/AmazingFeature)\n- Commit your Changes (git commit -m 'Add some AmazingFeature')\n- Push to the Branch (git push origin feature/AmazingFeature)\n- Open a Pull Request\n\n## License\n\n`pyrdfrules` is distributed under the terms of the Apache License. See `LICENSE` for more information.\n\n## Acknowledgments\n* [RDFRules@propi/rdfrules](https://github.com/propi/rdfrules)\n* [V\u0160E](https://www.vse.cz/)",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python wrapper for RDFRules.",
    "version": "1.0.2",
    "project_urls": {
        "Documentation": "https://github.com/KIZI/pyrdfrules",
        "Issues": "https://github.com/KIZI/pyrdfrules/issues",
        "Source": "https://github.com/KIZI/pyrdfrules"
    },
    "split_keywords": [
        "rdf",
        " rdfrules",
        " rules"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a8a1d527ce01eb7e3b121038472575556d7e728ef25c3dd272c0c5469b46b386",
                "md5": "859ab3746fb4c115d95746d245a8ca1d",
                "sha256": "e36a395efa13e0c7b2b1c24eeed573dcc5d25514f4b4d7e1e67b0b286a4717fa"
            },
            "downloads": -1,
            "filename": "pyrdfrules-1.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "859ab3746fb4c115d95746d245a8ca1d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 60125,
            "upload_time": "2025-01-19T12:08:02",
            "upload_time_iso_8601": "2025-01-19T12:08:02.504318Z",
            "url": "https://files.pythonhosted.org/packages/a8/a1/d527ce01eb7e3b121038472575556d7e728ef25c3dd272c0c5469b46b386/pyrdfrules-1.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5a9d221a2a011cee39272d8b8a1daa5c3f7103873ca80e3955d27e2324e7cc7d",
                "md5": "56873cc43a5f71c9a8c8f1679f79a714",
                "sha256": "4f6d277dec705ee3f9419c8dcb20f28dad386fc831a07c44f2a79605a34adafc"
            },
            "downloads": -1,
            "filename": "pyrdfrules-1.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "56873cc43a5f71c9a8c8f1679f79a714",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 48356,
            "upload_time": "2025-01-19T12:08:04",
            "upload_time_iso_8601": "2025-01-19T12:08:04.433775Z",
            "url": "https://files.pythonhosted.org/packages/5a/9d/221a2a011cee39272d8b8a1daa5c3f7103873ca80e3955d27e2324e7cc7d/pyrdfrules-1.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-01-19 12:08:04",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "KIZI",
    "github_project": "pyrdfrules",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "annotated-types",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "anyio",
            "specs": [
                [
                    "==",
                    "4.4.0"
                ]
            ]
        },
        {
            "name": "appnope",
            "specs": [
                [
                    "==",
                    "0.1.4"
                ]
            ]
        },
        {
            "name": "argcomplete",
            "specs": [
                [
                    "==",
                    "3.5.0"
                ]
            ]
        },
        {
            "name": "asttokens",
            "specs": [
                [
                    "==",
                    "2.4.1"
                ]
            ]
        },
        {
            "name": "black",
            "specs": [
                [
                    "==",
                    "24.8.0"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2024.8.30"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "3.3.2"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    "==",
                    "8.1.7"
                ]
            ]
        },
        {
            "name": "comm",
            "specs": [
                [
                    "==",
                    "0.2.2"
                ]
            ]
        },
        {
            "name": "datamodel-code-generator",
            "specs": [
                [
                    "==",
                    "0.26.0"
                ]
            ]
        },
        {
            "name": "debugpy",
            "specs": [
                [
                    "==",
                    "1.8.6"
                ]
            ]
        },
        {
            "name": "decorator",
            "specs": [
                [
                    "==",
                    "5.1.1"
                ]
            ]
        },
        {
            "name": "dnspython",
            "specs": [
                [
                    "==",
                    "2.6.1"
                ]
            ]
        },
        {
            "name": "email_validator",
            "specs": [
                [
                    "==",
                    "2.2.0"
                ]
            ]
        },
        {
            "name": "executing",
            "specs": [
                [
                    "==",
                    "2.1.0"
                ]
            ]
        },
        {
            "name": "flake8",
            "specs": [
                [
                    "==",
                    "7.1.1"
                ]
            ]
        },
        {
            "name": "genson",
            "specs": [
                [
                    "==",
                    "1.3.0"
                ]
            ]
        },
        {
            "name": "h11",
            "specs": [
                [
                    "==",
                    "0.14.0"
                ]
            ]
        },
        {
            "name": "httpcore",
            "specs": [
                [
                    "==",
                    "1.0.5"
                ]
            ]
        },
        {
            "name": "httpx",
            "specs": [
                [
                    "==",
                    "0.27.2"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.10"
                ]
            ]
        },
        {
            "name": "inflect",
            "specs": [
                [
                    "==",
                    "5.6.2"
                ]
            ]
        },
        {
            "name": "iniconfig",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "install-jdk",
            "specs": [
                [
                    "==",
                    "1.1.0"
                ]
            ]
        },
        {
            "name": "ipykernel",
            "specs": [
                [
                    "==",
                    "6.29.5"
                ]
            ]
        },
        {
            "name": "ipython",
            "specs": [
                [
                    "==",
                    "8.28.0"
                ]
            ]
        },
        {
            "name": "isort",
            "specs": [
                [
                    "==",
                    "5.13.2"
                ]
            ]
        },
        {
            "name": "jedi",
            "specs": [
                [
                    "==",
                    "0.19.1"
                ]
            ]
        },
        {
            "name": "Jinja2",
            "specs": [
                [
                    "==",
                    "3.1.4"
                ]
            ]
        },
        {
            "name": "JPype1",
            "specs": [
                [
                    "==",
                    "1.5.0"
                ]
            ]
        },
        {
            "name": "jupyter_client",
            "specs": [
                [
                    "==",
                    "8.6.3"
                ]
            ]
        },
        {
            "name": "jupyter_core",
            "specs": [
                [
                    "==",
                    "5.7.2"
                ]
            ]
        },
        {
            "name": "markdown-it-py",
            "specs": [
                [
                    "==",
                    "3.0.0"
                ]
            ]
        },
        {
            "name": "markdown-table-generator",
            "specs": [
                [
                    "==",
                    "1.1.0"
                ]
            ]
        },
        {
            "name": "MarkupSafe",
            "specs": [
                [
                    "==",
                    "2.1.5"
                ]
            ]
        },
        {
            "name": "matplotlib-inline",
            "specs": [
                [
                    "==",
                    "0.1.7"
                ]
            ]
        },
        {
            "name": "mccabe",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "mdurl",
            "specs": [
                [
                    "==",
                    "0.1.2"
                ]
            ]
        },
        {
            "name": "mypy-extensions",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "nest-asyncio",
            "specs": [
                [
                    "==",
                    "1.6.0"
                ]
            ]
        },
        {
            "name": "packaging",
            "specs": [
                [
                    "==",
                    "24.1"
                ]
            ]
        },
        {
            "name": "pandas",
            "specs": [
                [
                    "==",
                    "2.2.2"
                ]
            ]
        },
        {
            "name": "parso",
            "specs": [
                [
                    "==",
                    "0.8.4"
                ]
            ]
        },
        {
            "name": "pathspec",
            "specs": [
                [
                    "==",
                    "0.12.1"
                ]
            ]
        },
        {
            "name": "pdoc",
            "specs": [
                [
                    "==",
                    "15.0.1"
                ]
            ]
        },
        {
            "name": "pexpect",
            "specs": [
                [
                    "==",
                    "4.9.0"
                ]
            ]
        },
        {
            "name": "platformdirs",
            "specs": [
                [
                    "==",
                    "4.3.2"
                ]
            ]
        },
        {
            "name": "pluggy",
            "specs": [
                [
                    "==",
                    "1.5.0"
                ]
            ]
        },
        {
            "name": "prompt_toolkit",
            "specs": [
                [
                    "==",
                    "3.0.48"
                ]
            ]
        },
        {
            "name": "psutil",
            "specs": [
                [
                    "==",
                    "6.0.0"
                ]
            ]
        },
        {
            "name": "ptyprocess",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "pure_eval",
            "specs": [
                [
                    "==",
                    "0.2.3"
                ]
            ]
        },
        {
            "name": "py-markdown-table",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "pycodestyle",
            "specs": [
                [
                    "==",
                    "2.12.1"
                ]
            ]
        },
        {
            "name": "pydantic",
            "specs": [
                [
                    "==",
                    "2.6.4"
                ]
            ]
        },
        {
            "name": "pydantic_core",
            "specs": [
                [
                    "==",
                    "2.16.3"
                ]
            ]
        },
        {
            "name": "pyflakes",
            "specs": [
                [
                    "==",
                    "3.2.0"
                ]
            ]
        },
        {
            "name": "Pygments",
            "specs": [
                [
                    "==",
                    "2.18.0"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    "==",
                    "2.9.0.post0"
                ]
            ]
        },
        {
            "name": "pytz",
            "specs": [
                [
                    "==",
                    "2024.1"
                ]
            ]
        },
        {
            "name": "PyYAML",
            "specs": [
                [
                    "==",
                    "6.0.2"
                ]
            ]
        },
        {
            "name": "pyzmq",
            "specs": [
                [
                    "==",
                    "26.2.0"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.32.3"
                ]
            ]
        },
        {
            "name": "rich",
            "specs": [
                [
                    "==",
                    "13.9.4"
                ]
            ]
        },
        {
            "name": "six",
            "specs": [
                [
                    "==",
                    "1.16.0"
                ]
            ]
        },
        {
            "name": "sniffio",
            "specs": [
                [
                    "==",
                    "1.3.1"
                ]
            ]
        },
        {
            "name": "stack-data",
            "specs": [
                [
                    "==",
                    "0.6.3"
                ]
            ]
        },
        {
            "name": "tornado",
            "specs": [
                [
                    "==",
                    "6.4.1"
                ]
            ]
        },
        {
            "name": "tqdm",
            "specs": [
                [
                    "==",
                    "4.67.1"
                ]
            ]
        },
        {
            "name": "traitlets",
            "specs": [
                [
                    "==",
                    "5.14.3"
                ]
            ]
        },
        {
            "name": "typing",
            "specs": [
                [
                    "==",
                    "3.7.4.3"
                ]
            ]
        },
        {
            "name": "typing_extensions",
            "specs": [
                [
                    "==",
                    "4.10.0"
                ]
            ]
        },
        {
            "name": "tzdata",
            "specs": [
                [
                    "==",
                    "2024.1"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "2.2.3"
                ]
            ]
        },
        {
            "name": "wcwidth",
            "specs": [
                [
                    "==",
                    "0.2.13"
                ]
            ]
        }
    ],
    "lcname": "pyrdfrules"
}
        
Elapsed time: 0.61055s