logo Netzschleuder network catalog, repository, and centrifuge

History of reliance_on_science

The changes to the source code of this entry in the repository, newest first, each with the differences it made to the entry's files. They are also listed on GitLab.

[entries] Add the date when each entry was added, and remove icon_hash by Tiago de Paula Peixoto beff7c9
The dates are those of the commits that first added the entries' files
(2020-08-11 for the entries of the initial commit); renamed entries keep
the date of their first name.

Changed: none
diff --git a/entries/reliance_on_science/__init__.py b/entries/reliance_on_science/__init__.py
index b8ae7b2..c0b7147 100644
--- a/entries/reliance_on_science/__init__.py
+++ b/entries/reliance_on_science/__init__.py
@@ -57,7 +57,7 @@ citation = [('M. Marx, A. Fuegi, "Reliance on science: Worldwide front-page pate
              'https://doi.org/10.1002/smj.3145'),
             ('M. Marx, A. Fuegi, "Reliance on science by inventors: Hybrid extraction of in-text patent-to-article citations." Journal of Economics & Management Strategy 31(2), 369-392 (2022)',
              'https://doi.org/10.1111/jems.12455')]
-icon_hash = None
+date_added = '2026-10-28'
 upstream_license = ("CC BY-NC 4.0", "https://creativecommons.org/licenses/by-nc/4.0/")
 # Zenodo records (versions) of the dataset: 22967630 of 2026-09-25 (USPTO only),
 # 11461587 of 2024-06-03 (worldwide)
[entries] Prefix the properties in the descriptions with (Node), (Edge) or (Graph) by Tiago de Paula Peixoto bc3dbbd
The lists of properties at the end of the descriptions marked edge
properties with "Edge" but left node properties unmarked, or grouped
them in "Nodes: `a`, ...; `b`, ..." items, so the kind of a property
was often unclear. Every item now starts with (Node), (Edge) or (Graph),
followed by the property names, a colon and the explanation, one item
per property or group of properties; qualifications (kinds of nodes,
networks) follow the names in parentheses. Properties that were only
named got a short explanation, and a few items that named the wrong
kind of property were corrected.
diff --git a/entries/reliance_on_science/__init__.py b/entries/reliance_on_science/__init__.py
index 9515521..b8ae7b2 100644
--- a/entries/reliance_on_science/__init__.py
+++ b/entries/reliance_on_science/__init__.py
@@ -39,17 +39,17 @@ The other files of the earlier releases (e.g. the metadata of the works from the
 
 The networks have the following properties:
 
-- `is_patent`: whether the node is a patent (otherwise it is a scientific work).
-- `name`: the identifier of the patent (e.g. `us-10494607-b2`: office, number and kind code; in the patent-paper pairs, `US-10000036` or just the number of the USPTO patent) or of the work (its OpenAlex identifier, e.g. `W3066`, whose page is `https://openalex.org/W3066`, or, in `patent_paper_pairs`, its Microsoft Academic Graph identifier).
-- Edge `examiner` (citation networks): whether the reference was given by the examiner (otherwise by the applicant).
-- Edge `confscore` (citation networks): the confidence score of the match, from 1 to 10.
-- Edge `wherefound` (citation networks): where the reference was found in the patent: `frontonly` (only on the front page), `bodyonly` (only in the full text) or `both`.
-- Edge `uspto` (`worldwide_2024`): whether the patent is a USPTO patent.
-- Edge `self` (`worldwide_2024`): whether the citation is a self-citation (an inventor of the patent is an author of the work): `self`, `notself`, or `unkself` (unknown).
-- Edge `confidence_level` (`patent_paper_pairs`): the confidence level of the pair, `high` or `mid`.
-- Edge `ppp_score` (`patent_paper_pairs_2024`): the score of the pair given by the authors, from 1 to 4.
-- Edge `days_diff` (`patent_paper_pairs_2024`): the difference between the date of the patent application and the publication date of the work, in days.
-- Edge `same` (`patent_paper_pairs_2024`): the evidence for the pair given by the authors, e.g. `same parent, same abstract` (empty if none is given)."""
+- (Node) `is_patent`: whether the node is a patent (otherwise it is a scientific work).
+- (Node) `name`: the identifier of the patent (e.g. `us-10494607-b2`: office, number and kind code; in the patent-paper pairs, `US-10000036` or just the number of the USPTO patent) or of the work (its OpenAlex identifier, e.g. `W3066`, whose page is `https://openalex.org/W3066`, or, in `patent_paper_pairs`, its Microsoft Academic Graph identifier).
+- (Edge) `examiner` (citation networks): whether the reference was given by the examiner (otherwise by the applicant).
+- (Edge) `confscore` (citation networks): the confidence score of the match, from 1 to 10.
+- (Edge) `wherefound` (citation networks): where the reference was found in the patent: `frontonly` (only on the front page), `bodyonly` (only in the full text) or `both`.
+- (Edge) `uspto` (`worldwide_2024`): whether the patent is a USPTO patent.
+- (Edge) `self` (`worldwide_2024`): whether the citation is a self-citation (an inventor of the patent is an author of the work): `self`, `notself`, or `unkself` (unknown).
+- (Edge) `confidence_level` (`patent_paper_pairs`): the confidence level of the pair, `high` or `mid`.
+- (Edge) `ppp_score` (`patent_paper_pairs_2024`): the score of the pair given by the authors, from 1 to 4.
+- (Edge) `days_diff` (`patent_paper_pairs_2024`): the difference between the date of the patent application and the publication date of the work, in days.
+- (Edge) `same` (`patent_paper_pairs_2024`): the evidence for the pair given by the authors, e.g. `same parent, same abstract` (empty if none is given)."""
 tags = ['Informational', 'Citation', 'Unweighted', 'Metadata']
 url = ['https://relianceonscience.org/',
        'https://doi.org/10.5281/zenodo.3382981']
[entries] New entry: reliance_on_science by Tiago de Paula Peixoto 0f3ed49
diff --git a/entries/reliance_on_science/__init__.py b/entries/reliance_on_science/__init__.py
new file mode 100644
index 0000000..9515521
--- /dev/null
+++ b/entries/reliance_on_science/__init__.py
@@ -0,0 +1,174 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2026 Tiago de Paula Peixoto <tiago@skewed.de>
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Affero General Public License along
+# with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import pyarrow
+import pyarrow.csv
+import pyarrow.compute as pc
+
+from .. import *
+
+title = "Patent-to-paper citations (Reliance on Science, 2024-2026)"
+description = r"""Citations from patents to scientific articles, from the Reliance on Science dataset of M. Marx and A. Fuegi. The references to the scientific literature in patents ("non-patent literature") were matched to the scholarly works of OpenAlex, both on the front page of the patents (the references listed by the applicant or the examiner) and in their full text (the references in the body of the patent, extracted with a hybrid of machine learning and rules). Each match has a confidence score from 1 to 10 (10 being the most certain); the authors recommend a score of at least 3 or 4 for most uses, and all the matches are included here.
+
+- `uspto_2025`: the citations of the patents granted by the U.S. Patent and Trademark Office (USPTO), up to 2025, from the release of September 2026 (which, unlike the earlier ones, covers only the USPTO).
+- `worldwide_2024`: the citations of the patents of all the patent offices worldwide, from the release of June 2024 (the last one that covers them), with flags for USPTO patents and for self-citations.
+
+In both networks, a directed edge goes from a patent to a work it cites; the networks are bipartite, with patents and works as the two kinds of nodes.
+
+The dataset also contains patent-paper pairs: pairs of a patent and an article that disclose the same invention (e.g. a discovery published in a journal and patented by the same people), found from the overlap of the authors and inventors and the similarity of their titles and abstracts, and the dates. These are the undirected bipartite networks
+
+- `patent_paper_pairs`: the pairs of the release of September 2026 (USPTO patents up to 2021, with the works identified by Microsoft Academic Graph identifiers and a confidence level),
+- `patent_paper_pairs_2024`: the pairs of the release of June 2024 (with OpenAlex work identifiers and a score).
+
+The other files of the earlier releases (e.g. the metadata of the works from the Microsoft Academic Graph, of the releases up to 2023) are not included; the counts of citations per patent and per work, which can be computed from the networks, also not.
+
+The networks have the following properties:
+
+- `is_patent`: whether the node is a patent (otherwise it is a scientific work).
+- `name`: the identifier of the patent (e.g. `us-10494607-b2`: office, number and kind code; in the patent-paper pairs, `US-10000036` or just the number of the USPTO patent) or of the work (its OpenAlex identifier, e.g. `W3066`, whose page is `https://openalex.org/W3066`, or, in `patent_paper_pairs`, its Microsoft Academic Graph identifier).
+- Edge `examiner` (citation networks): whether the reference was given by the examiner (otherwise by the applicant).
+- Edge `confscore` (citation networks): the confidence score of the match, from 1 to 10.
+- Edge `wherefound` (citation networks): where the reference was found in the patent: `frontonly` (only on the front page), `bodyonly` (only in the full text) or `both`.
+- Edge `uspto` (`worldwide_2024`): whether the patent is a USPTO patent.
+- Edge `self` (`worldwide_2024`): whether the citation is a self-citation (an inventor of the patent is an author of the work): `self`, `notself`, or `unkself` (unknown).
+- Edge `confidence_level` (`patent_paper_pairs`): the confidence level of the pair, `high` or `mid`.
+- Edge `ppp_score` (`patent_paper_pairs_2024`): the score of the pair given by the authors, from 1 to 4.
+- Edge `days_diff` (`patent_paper_pairs_2024`): the difference between the date of the patent application and the publication date of the work, in days.
+- Edge `same` (`patent_paper_pairs_2024`): the evidence for the pair given by the authors, e.g. `same parent, same abstract` (empty if none is given)."""
+tags = ['Informational', 'Citation', 'Unweighted', 'Metadata']
+url = ['https://relianceonscience.org/',
+       'https://doi.org/10.5281/zenodo.3382981']
+citation = [('M. Marx, A. Fuegi, "Reliance on science: Worldwide front-page patent citations to scientific articles." Strategic Management Journal 41(9), 1572-1594 (2020)',
+             'https://doi.org/10.1002/smj.3145'),
+            ('M. Marx, A. Fuegi, "Reliance on science by inventors: Hybrid extraction of in-text patent-to-article citations." Journal of Economics & Management Strategy 31(2), 369-392 (2022)',
+             'https://doi.org/10.1111/jems.12455')]
+icon_hash = None
+upstream_license = ("CC BY-NC 4.0", "https://creativecommons.org/licenses/by-nc/4.0/")
+# Zenodo records (versions) of the dataset: 22967630 of 2026-09-25 (USPTO only),
+# 11461587 of 2024-06-03 (worldwide)
+upstream_prefix = 'https://zenodo.org/records'
+files = [("22967630/files/pcs_oa_uspto.csv", "uspto_2025", None),
+         ("11461587/files/_pcs_oa.csv", "worldwide_2024", None),
+         ("22967630/files/finalpppsadjusted.csv", "patent_paper_pairs", None),
+         ("11461587/files/_patent_paper_pairs.csv", "patent_paper_pairs_2024", None)]
+
+def fetch_upstream(force=False):
+    return fetch_upstream_files(__name__.split(".")[-1], upstream_prefix, files,
+                                force)
+
+# For checks only: if set, only (about) this many rows are read
+_check_rows = None
+
+def read_csv(f, types):
+    if _check_rows is None:
+        return pyarrow.csv.read_csv(
+            f, read_options=pyarrow.csv.ReadOptions(block_size=1 << 26),
+            convert_options=pyarrow.csv.ConvertOptions(column_types=types))
+    reader = pyarrow.csv.open_csv(
+        f, read_options=pyarrow.csv.ReadOptions(block_size=1 << 24),
+        convert_options=pyarrow.csv.ConvertOptions(column_types=types))
+    batches, n = [], 0
+    for b in reader:
+        batches.append(b)
+        n += b.num_rows
+        if n >= _check_rows:
+            break
+    return pyarrow.Table.from_batches(batches)
+
+def categorical_ep(g, values, name):
+    """Store the string column `values` as the string edge property `name`,
+    converted from integer codes (one Python string per distinct value)."""
+    d = values.combine_chunks().dictionary_encode()
+    codes = g.new_ep("int", vals=d.indices.fill_null(-1).to_numpy())
+    labels = d.dictionary.to_pylist()
+    p = g.new_ep("string")
+    map_property_values(codes, p, lambda i: "" if i < 0 else labels[i])
+    g.ep[name] = p
+
+@cache_network()
+@coerce_props()
+@annotate()
+def parse(alts=None):
+    name = __name__.split(".")[-1]
+    for fname, alt, fmt in files:
+        if alts is not None and alt not in alts:
+            continue
+        with open_upstream_file(name, fname, "rb") as f:
+            if alt in ("uspto_2025", "worldwide_2024"):
+                t = read_csv(f, {"reftype": pyarrow.string(),
+                                 "confscore": pyarrow.int8(),
+                                 "oaid": pyarrow.int64(),
+                                 "patent": pyarrow.string(),
+                                 "uspto": pyarrow.int8(),
+                                 "wherefound": pyarrow.string(),
+                                 "self": pyarrow.string()})
+                pcol, wcol = "patent", "oaid"
+            elif alt == "patent_paper_pairs":
+                t = read_csv(f, {"magid": pyarrow.int64(),
+                                 "patent_id": pyarrow.string(),
+                                 "confidence_level": pyarrow.string()})
+                pcol, wcol = "patent_id", "magid"
+            else:
+                t = read_csv(f, {"paperid": pyarrow.string(),
+                                 "patent": pyarrow.string(),
+                                 "ppp_score": pyarrow.int8(),
+                                 "daysdiffcont": pyarrow.int64(),
+                                 "all_patents_for_the_same_paper": pyarrow.string()})
+                pcol, wcol = "patent", "paperid"
+        patents = pc.unique(t.column(pcol))
+        patents = pc.take(patents, pc.sort_indices(patents))
+        works = pc.unique(t.column(wcol))
+        works = pc.take(works, pc.sort_indices(works))
+        Np = len(patents)
+        s = pc.index_in(t.column(pcol), value_set=patents).to_numpy()
+        u = pc.index_in(t.column(wcol), value_set=works).to_numpy()
+        assert (s >= 0).all() and (u >= 0).all()
+
+        g = Graph(directed=alt in ("uspto_2025", "worldwide_2024"))
+        g.add_vertex(Np + len(works))
+        g.add_edge_list(numpy.column_stack([s, Np + u]))
+        del s, u
+        g.vp.is_patent = g.new_vp("bool")
+        g.vp.is_patent.a[:Np] = 1
+        if wcol == "oaid":
+            wnames = ["W%d" % x for x in works.to_numpy()]
+        else:
+            wnames = [str(x) for x in works.to_pylist()]
+        g.vp.name = g.new_vp("string", vals=patents.to_pylist() + wnames)
+        del wnames, patents, works
+
+        if alt in ("uspto_2025", "worldwide_2024"):
+            g.ep.examiner = g.new_ep("bool",
+                                     vals=pc.equal(t.column("reftype"),
+                                                   "exm").to_numpy(zero_copy_only=False))
+            assert pc.all(pc.is_in(t.column("reftype"),
+                                   value_set=pyarrow.array(["app", "exm"]))).as_py()
+            g.ep.confscore = g.new_ep("int8_t", vals=t.column("confscore").to_numpy())
+            categorical_ep(g, t.column("wherefound"), "wherefound")
+            if alt == "worldwide_2024":
+                g.ep.uspto = g.new_ep("bool", vals=t.column("uspto").to_numpy())
+                categorical_ep(g, t.column("self"), "self")
+        elif alt == "patent_paper_pairs":
+            categorical_ep(g, t.column("confidence_level"), "confidence_level")
+        else:
+            g.ep.ppp_score = g.new_ep("int8_t", vals=t.column("ppp_score").to_numpy())
+            assert t.column("daysdiffcont").null_count == 0
+            g.ep.days_diff = g.new_ep("int64_t", vals=t.column("daysdiffcont").to_numpy())
+            categorical_ep(g, t.column("all_patents_for_the_same_paper"), "same")
+        del t
+        yield alt, g