Skip to content

Using nanopublications templates

The nanopub library provides a few objects to easily publish specific types of nanopublications, such as claims, retraction, nanopub indexes, or ORCID introductions.

You can also easily create your own template by inheriting from the Nanopub class.

🗂️ Nanopub index

To publish an index of nanopublications. Note that a nanopub cannot contain more than 1200 triples. So to publish large index with more than 1200 elements we need to split it and publish multiple nanopublications: the different nanopub index that composes this index, and a top level index that points to all the nanopub indexes.

For this we will use the create_nanopub_index() function instead of directly instantiating a NanopubIndex

from nanopub import create_nanopub_index, NanopubConf

np_conf = NanopubConf(profile=load_profile(), use_test_server=True)

np_list = create_nanopub_index(
    conf=np_conf,
    np_list=[
        "https://purl.org/np/RAD28Nl4h_mFH92bsHUrtqoU4C6DCYy_BRTvpimjVFgJo",
        "https://purl.org/np/RAEhbEJ1tdhPqM6gNPScX9vIY1ZtUzOz7woeJNzB3sh3E",
    ],
    title="My nanopub index",
    description="This is my nanopub index",
    creation_time="2020-09-21T00:00:00",
    creators=["https://orcid.org/0000-0000-0000-0000"],
    see_also="https://github.com/fair-workflows/nanopub",
)
for np in np_list:
    np.publish()
    print(np)

👤 ORCID introduction

To publish a nanopublication introducing a keypair for an ORCID.

from nanopub import NanopubConf, NanopubIntroduction

np_conf = NanopubConf(profile=load_profile(), use_test_server=True)

np = NanopubIntroduction(
    conf=np_conf,
    host=None,
)
np.publish()

📝 Update a published nanopub

To update a nanopub content, provide the URI to the nanopub to update, and the new assertion graph. You can also provide the pubinfo, provenance and complete RDF (like for the Nanopub object).

from nanopub import NanopubConf, NanopubUpdate

np_conf = NanopubConf(profile=load_profile())

assertion = Graph()
assertion.add((
    BNode('test'), namespaces.HYCL.claims, Literal('This is the updated nanopublication assertion')
))
np = NanopubUpdate(
    uri="http://purl.org/np/RAfk_zBYDerxd6ipfv8fAcQHEzgZcVylMTEkiLlMzsgwQ",
    conf=np_conf,
    assertion=assertion,
)
np.sign()

💬 Claim

Publish a simple HYCL claim:

from nanopub import NanopubConf, NanopubClaim

np_conf = NanopubConf(profile=load_profile(), use_test_server=True)

np = NanopubClaim(
    claim='All cats are grey',
    conf=np_conf,
)
np.publish()

✍️ Create your own template

You can create your own template by inheriting from the Nanopub class. It allows you to define classes to assist your users with publishing specific sets of triples.

Here is the NanopubClaim class explained:

from rdflib import RDF, RDFS, Literal, URIRef

from nanopub.config import NanopubConf
from nanopub.namespaces import HYCL
from nanopub.nanopub import Nanopub

class NanopubClaim(Nanopub):

    def __init__(
        self,
        # Define the args the users should provide
        claim: str,
        conf: NanopubConf,
    ) -> None:
        # Enforce a specific nanopub conf
        conf.add_prov_generated_time = True
        conf.add_pubinfo_generated_time = True
        conf.attribute_publication_to_profile = True
        super().__init__(
            conf=config,
        )

        # Build the nanopub assertion from the args
        this_statement = self._namespace.claim
        self.assertion.add((this_statement, RDF.type, HYCL.Statement))
        self.assertion.add((this_statement, RDFS.label, Literal(claim)))

        orcid_id_uri = URIRef(self.profile.orcid_id)
        self.provenance.add((orcid_id_uri, HYCL.claims, this_statement))