maplib


Namemaplib JSON
Version 0.8.10 PyPI version JSON
download
home_pageNone
SummaryDataframe-based interactive knowledge graph construction
upload_time2024-04-29 14:20:31
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords rdf graph dataframe sparql ottr
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ## maplib: High-performance RDF knowledge graph construction, validation and enrichment in Python
maplib is a knowledge graph construction library for building RDF knowledge graphs using template expansion ([OTTR](https://ottr.xyz/) Templates). Maplib features SPARQL- and SHACL-engines that are available as the graph is being constructed, allowing enrichment and validation. It can construct and validate knowledge graphs with millions of nodes in seconds.

maplib allows you to leverage your existing skills with Pandas or Polars to extract and wrangle data from existing databases and spreadsheets, before applying simple templates to them to build a knowledge graph. 

Template expansion is typically zero-copy and nearly instantaneous, and the built-in SPARQL and SHACL engines means you can query, inspect, enrich and validate the knowledge graph immediately.      

maplib is written in Rust, it is built on [Apache Arrow](https://arrow.apache.org/) using [Pola.rs](https://www.pola.rs/) and uses libraries from [Oxigraph](https://github.com/oxigraph/oxigraph) for handling linked data as well as parsing SPARQL queries.

## Installing
The package is published on [PyPi](https://pypi.org/project/maplib/) and the API documented [here](https://datatreehouse.github.io/maplib/maplib/maplib.html):
```shell
pip install maplib
```
Please send us a message on our [webpage](https://www.data-treehouse.com/contact-8) if you want to try out SHACL.  

## Mapping
We can easily map DataFrames to RDF-graphs using the Python library. Below is a reproduction of the example in the paper [1]. Assume that we have a DataFrame given by: 

```python
ex = "https://github.com/DataTreehouse/maplib/example#"
co = "https://github.com/DataTreehouse/maplib/countries#"
pi = "https://github.com/DataTreehouse/maplib/pizza#"
ing = "https://github.com/DataTreehouse/maplib/pizza/ingredients#"

import polars as pl
df = pl.DataFrame({"p":[pi + "Hawaiian", pi + "Grandiosa"],
                   "c":[co + "CAN", co + "NOR"],
                   "is": [[ing + "Pineapple", ing + "Ham"],
                          [ing + "Pepper", ing + "Meat"]]})
df
```
That is, our DataFrame is:

| p                             | c                                  | is                                                   |
|-------------------------------|------------------------------------|------------------------------------------------------|
| str                           | str                                | list[str]                                            |
| "https://.../pizza#Hawaiian"  | "https://.../maplib/countries#CAN" | [".../ingredients#Pineapple", ".../ingredients#Ham"] |
| "https://.../pizza#Grandiosa" | "https://.../maplib/countries#NOR" | [".../ingredients#Pepper", ".../ingredients#Meat"]   |

Then we can define a OTTR template, and create our knowledge graph by expanding this template with our DataFrame as input:
```python
from maplib import Mapping
pl.Config.set_fmt_str_lengths(150)

doc = """
@prefix pizza:<https://github.com/DataTreehouse/maplib/pizza#>.
@prefix xsd:<http://www.w3.org/2001/XMLSchema#>.
@prefix ex:<https://github.com/DataTreehouse/maplib/pizza#>.

ex:Pizza[?p, xsd:anyURI ?c, List<xsd:anyURI> ?is] :: {
ottr:Triple(?p, a, pizza:Pizza),
ottr:Triple(?p, pizza:fromCountry, ?c),
cross | ottr:Triple(?p, pizza:hasIngredient, ++?is)
}.
"""

m = Mapping([doc])
m.expand("ex:Pizza", df)
```

We can immediately query the mapped knowledge graph:

```python
m.query("""
PREFIX pizza:<https://github.com/DataTreehouse/maplib/pizza#>
SELECT ?p ?i WHERE {
?p a pizza:Pizza .
?p pizza:hasIngredient ?i .
}
""")
```

The query gives the following result (a DataFrame):

| p                               | i                                     |
|---------------------------------|---------------------------------------|
| str                             | str                                   |
| "<https://.../pizza#Grandiosa>" | "<https://.../ingredients#Meat>"      |
| "<https://.../pizza#Grandiosa>" | "<https://.../ingredients#Pepper>"    |
| "<https://.../pizza#Hawaiian>"  | "<https://.../ingredients#Pineapple>" |
| "<https://.../pizza#Hawaiian>"  | "<https://.../ingredients#Ham>"       |

Next, we are able to perform a construct query, which creates new triples but does not insert them. 

```python
hpizzas = """
PREFIX pizza:<https://github.com/DataTreehouse/maplib/pizza#>
PREFIX ing:<https://github.com/DataTreehouse/maplib/pizza/ingredients#>
CONSTRUCT { ?p a pizza:UnorthodoxPizza } 
WHERE {
    ?p a pizza:Pizza .
    ?p pizza:hasIngredient ing:Pineapple .
}"""
res = m.query(hpizzas)
res[0]
```

The resulting triples are given below:

| subject                        | verb                                 | object                                |
|--------------------------------|--------------------------------------|---------------------------------------|
| str                            | str                                  | str                                   |
| "<https://.../pizza#Hawaiian>" | "<http://.../22-rdf-syntax-ns#type>" | "<https://.../pizza#UnorthodoxPizza>" |

If we are happy with the output of this construct-query, we can insert it in the mapping state. Afterwards we check that the triple is added with a query.

```python
m.insert(hpizzas)
m.query("""
PREFIX pizza:<https://github.com/DataTreehouse/maplib/pizza#>

SELECT ?p WHERE {
?p a pizza:UnorthodoxPizza
}
""")
```

Indeed, we have added the triple: 

| p                                                          |
|------------------------------------------------------------|
| str                                                        |
| "<https://github.com/DataTreehouse/maplib/pizza#Hawaiian>" |

## API
The [API](https://datatreehouse.github.io/maplib/maplib/maplib.html) is simple, and contains only one class and a few methods for:
- expanding templates
- querying
- validating
- importing triples
- writing triples

The API is documented [HERE](https://datatreehouse.github.io/maplib/maplib/maplib.html)

## References
There is an associated paper [1] with associated benchmarks showing superior performance and scalability that can be found [here](https://ieeexplore.ieee.org/document/10106242). OTTR is described in [2].

[1] M. Bakken, "maplib: Interactive, literal RDF model mapping for industry," in IEEE Access, doi: 10.1109/ACCESS.2023.3269093.

[2] M. G. Skjæveland, D. P. Lupp, L. H. Karlsen, and J. W. Klüwer, “Ottr: Formal templates for pattern-based ontology engineering.” in WOP (Book),
2021, pp. 349–377.

## Licensing
All code produced since August 1st. 2023 is copyrighted to [Data Treehouse AS](https://www.data-treehouse.com/) with an Apache 2.0 license unless otherwise noted. 

All code which was produced before August 1st. 2023 copyrighted to [Prediktor AS](https://www.prediktor.com/) with an Apache 2.0 license unless otherwise noted, and has been financed by [The Research Council of Norway](https://www.forskningsradet.no/en/) (grant no. 316656) and [Prediktor AS](https://www.prediktor.com/) as part of a PhD Degree. The code at this state is archived in the repository at [https://github.com/magbak/maplib](https://github.com/magbak/maplib).


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "maplib",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "rdf, graph, dataframe, sparql, ottr",
    "author": null,
    "author_email": "Magnus Bakken <magnus@data-treehouse.com>",
    "download_url": "https://files.pythonhosted.org/packages/75/52/61a86b0670933c921c6b7b4c67f22a9c7aa2a4d91cbcc70be237a3d51351/maplib-0.8.10.tar.gz",
    "platform": null,
    "description": "## maplib: High-performance RDF knowledge graph construction, validation and enrichment in Python\nmaplib is a knowledge graph construction library for building RDF knowledge graphs using template expansion ([OTTR](https://ottr.xyz/) Templates). Maplib features SPARQL- and SHACL-engines that are available as the graph is being constructed, allowing enrichment and validation. It can construct and validate knowledge graphs with millions of nodes in seconds.\n\nmaplib allows you to leverage your existing skills with Pandas or Polars to extract and wrangle data from existing databases and spreadsheets, before applying simple templates to them to build a knowledge graph. \n\nTemplate expansion is typically zero-copy and nearly instantaneous, and the built-in SPARQL and SHACL engines means you can query, inspect, enrich and validate the knowledge graph immediately.      \n\nmaplib is written in Rust, it is built on [Apache Arrow](https://arrow.apache.org/) using [Pola.rs](https://www.pola.rs/) and uses libraries from [Oxigraph](https://github.com/oxigraph/oxigraph) for handling linked data as well as parsing SPARQL queries.\n\n## Installing\nThe package is published on [PyPi](https://pypi.org/project/maplib/) and the API documented [here](https://datatreehouse.github.io/maplib/maplib/maplib.html):\n```shell\npip install maplib\n```\nPlease send us a message on our [webpage](https://www.data-treehouse.com/contact-8) if you want to try out SHACL.  \n\n## Mapping\nWe can easily map DataFrames to RDF-graphs using the Python library. Below is a reproduction of the example in the paper [1]. Assume that we have a DataFrame given by: \n\n```python\nex = \"https://github.com/DataTreehouse/maplib/example#\"\nco = \"https://github.com/DataTreehouse/maplib/countries#\"\npi = \"https://github.com/DataTreehouse/maplib/pizza#\"\ning = \"https://github.com/DataTreehouse/maplib/pizza/ingredients#\"\n\nimport polars as pl\ndf = pl.DataFrame({\"p\":[pi + \"Hawaiian\", pi + \"Grandiosa\"],\n                   \"c\":[co + \"CAN\", co + \"NOR\"],\n                   \"is\": [[ing + \"Pineapple\", ing + \"Ham\"],\n                          [ing + \"Pepper\", ing + \"Meat\"]]})\ndf\n```\nThat is, our DataFrame is:\n\n| p                             | c                                  | is                                                   |\n|-------------------------------|------------------------------------|------------------------------------------------------|\n| str                           | str                                | list[str]                                            |\n| \"https://.../pizza#Hawaiian\"  | \"https://.../maplib/countries#CAN\" | [\".../ingredients#Pineapple\", \".../ingredients#Ham\"] |\n| \"https://.../pizza#Grandiosa\" | \"https://.../maplib/countries#NOR\" | [\".../ingredients#Pepper\", \".../ingredients#Meat\"]   |\n\nThen we can define a OTTR template, and create our knowledge graph by expanding this template with our DataFrame as input:\n```python\nfrom maplib import Mapping\npl.Config.set_fmt_str_lengths(150)\n\ndoc = \"\"\"\n@prefix pizza:<https://github.com/DataTreehouse/maplib/pizza#>.\n@prefix xsd:<http://www.w3.org/2001/XMLSchema#>.\n@prefix ex:<https://github.com/DataTreehouse/maplib/pizza#>.\n\nex:Pizza[?p, xsd:anyURI ?c, List<xsd:anyURI> ?is] :: {\nottr:Triple(?p, a, pizza:Pizza),\nottr:Triple(?p, pizza:fromCountry, ?c),\ncross | ottr:Triple(?p, pizza:hasIngredient, ++?is)\n}.\n\"\"\"\n\nm = Mapping([doc])\nm.expand(\"ex:Pizza\", df)\n```\n\nWe can immediately query the mapped knowledge graph:\n\n```python\nm.query(\"\"\"\nPREFIX pizza:<https://github.com/DataTreehouse/maplib/pizza#>\nSELECT ?p ?i WHERE {\n?p a pizza:Pizza .\n?p pizza:hasIngredient ?i .\n}\n\"\"\")\n```\n\nThe query gives the following result (a DataFrame):\n\n| p                               | i                                     |\n|---------------------------------|---------------------------------------|\n| str                             | str                                   |\n| \"<https://.../pizza#Grandiosa>\" | \"<https://.../ingredients#Meat>\"      |\n| \"<https://.../pizza#Grandiosa>\" | \"<https://.../ingredients#Pepper>\"    |\n| \"<https://.../pizza#Hawaiian>\"  | \"<https://.../ingredients#Pineapple>\" |\n| \"<https://.../pizza#Hawaiian>\"  | \"<https://.../ingredients#Ham>\"       |\n\nNext, we are able to perform a construct query, which creates new triples but does not insert them. \n\n```python\nhpizzas = \"\"\"\nPREFIX pizza:<https://github.com/DataTreehouse/maplib/pizza#>\nPREFIX ing:<https://github.com/DataTreehouse/maplib/pizza/ingredients#>\nCONSTRUCT { ?p a pizza:UnorthodoxPizza } \nWHERE {\n    ?p a pizza:Pizza .\n    ?p pizza:hasIngredient ing:Pineapple .\n}\"\"\"\nres = m.query(hpizzas)\nres[0]\n```\n\nThe resulting triples are given below:\n\n| subject                        | verb                                 | object                                |\n|--------------------------------|--------------------------------------|---------------------------------------|\n| str                            | str                                  | str                                   |\n| \"<https://.../pizza#Hawaiian>\" | \"<http://.../22-rdf-syntax-ns#type>\" | \"<https://.../pizza#UnorthodoxPizza>\" |\n\nIf we are happy with the output of this construct-query, we can insert it in the mapping state. Afterwards we check that the triple is added with a query.\n\n```python\nm.insert(hpizzas)\nm.query(\"\"\"\nPREFIX pizza:<https://github.com/DataTreehouse/maplib/pizza#>\n\nSELECT ?p WHERE {\n?p a pizza:UnorthodoxPizza\n}\n\"\"\")\n```\n\nIndeed, we have added the triple: \n\n| p                                                          |\n|------------------------------------------------------------|\n| str                                                        |\n| \"<https://github.com/DataTreehouse/maplib/pizza#Hawaiian>\" |\n\n## API\nThe [API](https://datatreehouse.github.io/maplib/maplib/maplib.html) is simple, and contains only one class and a few methods for:\n- expanding templates\n- querying\n- validating\n- importing triples\n- writing triples\n\nThe API is documented [HERE](https://datatreehouse.github.io/maplib/maplib/maplib.html)\n\n## References\nThere is an associated paper [1] with associated benchmarks showing superior performance and scalability that can be found [here](https://ieeexplore.ieee.org/document/10106242). OTTR is described in [2].\n\n[1] M. Bakken, \"maplib: Interactive, literal RDF model mapping for industry,\" in IEEE Access, doi: 10.1109/ACCESS.2023.3269093.\n\n[2] M. G. Skj\u00e6veland, D. P. Lupp, L. H. Karlsen, and J. W. Kl\u00fcwer, \u201cOttr: Formal templates for pattern-based ontology engineering.\u201d in WOP (Book),\n2021, pp. 349\u2013377.\n\n## Licensing\nAll code produced since August 1st. 2023 is copyrighted to [Data Treehouse AS](https://www.data-treehouse.com/) with an Apache 2.0 license unless otherwise noted. \n\nAll code which was produced before August 1st. 2023 copyrighted to [Prediktor AS](https://www.prediktor.com/) with an Apache 2.0 license unless otherwise noted, and has been financed by [The Research Council of Norway](https://www.forskningsradet.no/en/) (grant no. 316656) and [Prediktor AS](https://www.prediktor.com/) as part of a PhD Degree. The code at this state is archived in the repository at [https://github.com/magbak/maplib](https://github.com/magbak/maplib).\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Dataframe-based interactive knowledge graph construction",
    "version": "0.8.10",
    "project_urls": {
        "Changelog": "https://github.com/DataTreehouse/maplib/releases",
        "Documentation": "https://github.com/DataTreehouse/maplib/blob/main/doc/python_mapper_api.md",
        "Homepage": "https://github.com/DataTreehouse/maplib",
        "Repository": "https://github.com/DataTreehouse/maplib"
    },
    "split_keywords": [
        "rdf",
        " graph",
        " dataframe",
        " sparql",
        " ottr"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "48c0c9dc510792e720e8e8f13c11c2ca3b3786cc9ab7b4cd73c28fc46d2da255",
                "md5": "567307676a3922beaee7d5035b1a0fe7",
                "sha256": "a4e59da47de53b188b4b4ab06d578be9c3dac347b541b94db7a936a253762841"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "567307676a3922beaee7d5035b1a0fe7",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 13111039,
            "upload_time": "2024-04-29T14:17:56",
            "upload_time_iso_8601": "2024-04-29T14:17:56.134410Z",
            "url": "https://files.pythonhosted.org/packages/48/c0/c9dc510792e720e8e8f13c11c2ca3b3786cc9ab7b4cd73c28fc46d2da255/maplib-0.8.10-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0d7e662f422207ff6b8a6ed197cdc5714b9924753620ea3943bc4480e2f717e1",
                "md5": "758fcfa649ff82668040e0e28061ab5c",
                "sha256": "ed83a44dfae0a42a47de69e6037eb9dcabe5806379ec215c57fe0b9b2696c37e"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "758fcfa649ff82668040e0e28061ab5c",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 18803515,
            "upload_time": "2024-04-29T14:20:31",
            "upload_time_iso_8601": "2024-04-29T14:20:31.717400Z",
            "url": "https://files.pythonhosted.org/packages/0d/7e/662f422207ff6b8a6ed197cdc5714b9924753620ea3943bc4480e2f717e1/maplib-0.8.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4d3c9b7f9b62b79874257acd7ea688240dc3ce21e2cbd79a536f7b06aaf94fa7",
                "md5": "73e27e6661049ba37825a6d7bdd87d09",
                "sha256": "c0053df84e125583dedc2ff5196cf124ce3531c3cb673ed8aed316f27e834afa"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp310-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "73e27e6661049ba37825a6d7bdd87d09",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 15682539,
            "upload_time": "2024-04-29T14:27:35",
            "upload_time_iso_8601": "2024-04-29T14:27:35.279487Z",
            "url": "https://files.pythonhosted.org/packages/4d/3c/9b7f9b62b79874257acd7ea688240dc3ce21e2cbd79a536f7b06aaf94fa7/maplib-0.8.10-cp310-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0d303770d26d1fbdc2f1dae422dc54dcca7475e3653e767fd51adcf7fb132fdf",
                "md5": "2bd9b0a06f425fbc4f038374e6d9c31b",
                "sha256": "000caba273b003654487c1ae38fd0da93ecfb40e01121da6a562082f6af3778e"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "2bd9b0a06f425fbc4f038374e6d9c31b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 13111108,
            "upload_time": "2024-04-29T14:18:40",
            "upload_time_iso_8601": "2024-04-29T14:18:40.615205Z",
            "url": "https://files.pythonhosted.org/packages/0d/30/3770d26d1fbdc2f1dae422dc54dcca7475e3653e767fd51adcf7fb132fdf/maplib-0.8.10-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "10ec5eeff5b5aefa6c68904a53109423a46c1e9205c9245c8495b97b1caad48c",
                "md5": "10b905923218c1025ee6b0cd4482f62f",
                "sha256": "09ca23c9dc1e2d732ccfdaacb3f40f01274fb8571ffe16ea86104208ceac3114"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "10b905923218c1025ee6b0cd4482f62f",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 18803737,
            "upload_time": "2024-04-29T14:20:28",
            "upload_time_iso_8601": "2024-04-29T14:20:28.487907Z",
            "url": "https://files.pythonhosted.org/packages/10/ec/5eeff5b5aefa6c68904a53109423a46c1e9205c9245c8495b97b1caad48c/maplib-0.8.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "30614f4435905e5c7d0250867a1ef46f7fc94ddd58d055bc64ca735764287135",
                "md5": "976bb641096ff8657d66c9f63397adcc",
                "sha256": "59b90c206bd719d1d97222f32c0a241fb8cfe99b00e0b05e7e44661124aca2f5"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp311-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "976bb641096ff8657d66c9f63397adcc",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 15682517,
            "upload_time": "2024-04-29T14:27:38",
            "upload_time_iso_8601": "2024-04-29T14:27:38.825492Z",
            "url": "https://files.pythonhosted.org/packages/30/61/4f4435905e5c7d0250867a1ef46f7fc94ddd58d055bc64ca735764287135/maplib-0.8.10-cp311-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b211ebfe7171730b51cf3523323b8850b632095117109fc27694884ba58c8434",
                "md5": "ec9fea4af33ca58227ac901e67e1a7df",
                "sha256": "2fcc0d6906ff1a873e7e336fc1dff8d5d4097a46f3506475074011fb8d2323de"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "ec9fea4af33ca58227ac901e67e1a7df",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 13110531,
            "upload_time": "2024-04-29T14:17:37",
            "upload_time_iso_8601": "2024-04-29T14:17:37.262933Z",
            "url": "https://files.pythonhosted.org/packages/b2/11/ebfe7171730b51cf3523323b8850b632095117109fc27694884ba58c8434/maplib-0.8.10-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6c9fe78632a37bc61997fa533ca23534fdfddb35cc7231e655d0889d6de9ba40",
                "md5": "d37be7d7389184f38bad63f9a049fd3f",
                "sha256": "cb6c8fc59641ea917f9338332228c85de0255c6790f28eb20cd58b70198ff972"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d37be7d7389184f38bad63f9a049fd3f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 18804862,
            "upload_time": "2024-04-29T14:20:31",
            "upload_time_iso_8601": "2024-04-29T14:20:31.049051Z",
            "url": "https://files.pythonhosted.org/packages/6c/9f/e78632a37bc61997fa533ca23534fdfddb35cc7231e655d0889d6de9ba40/maplib-0.8.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e965b68795de821e869a202c4da489ab5db28ad4aea76c54471be6edbdfa917d",
                "md5": "d89eb8567bcb3986e85c76e4fd092276",
                "sha256": "9d77ba1a91f596078a927e2d8fae84fa2be1c3419aa46d4fe88647a97ce5caa3"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10-cp39-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d89eb8567bcb3986e85c76e4fd092276",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 15682859,
            "upload_time": "2024-04-29T14:27:33",
            "upload_time_iso_8601": "2024-04-29T14:27:33.246362Z",
            "url": "https://files.pythonhosted.org/packages/e9/65/b68795de821e869a202c4da489ab5db28ad4aea76c54471be6edbdfa917d/maplib-0.8.10-cp39-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "755261a86b0670933c921c6b7b4c67f22a9c7aa2a4d91cbcc70be237a3d51351",
                "md5": "313bba02776a3418c9e3758ace1835f3",
                "sha256": "2dcb07d9b2fbc66e0596e2bdc12120a3e9acf513cd74c70c39a76ed60c802ad4"
            },
            "downloads": -1,
            "filename": "maplib-0.8.10.tar.gz",
            "has_sig": false,
            "md5_digest": "313bba02776a3418c9e3758ace1835f3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 235147,
            "upload_time": "2024-04-29T14:20:31",
            "upload_time_iso_8601": "2024-04-29T14:20:31.515662Z",
            "url": "https://files.pythonhosted.org/packages/75/52/61a86b0670933c921c6b7b4c67f22a9c7aa2a4d91cbcc70be237a3d51351/maplib-0.8.10.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-29 14:20:31",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "DataTreehouse",
    "github_project": "maplib",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "maplib"
}
        
Elapsed time: 0.26171s