{ "cells": [ { "cell_type": "markdown", "id": "97493594", "metadata": {}, "source": [ "# Knowledge Graph construction and querying with extracted software metadata\n", "\n", "This notebook first generates a knowledge graph from the information extracted about software repositories with [SOMEF](https://github.com/KnowledgeCaptureAndDiscovery/somef). It is later queried to assess the good practices followed by the extracted repositories." ] }, { "cell_type": "code", "execution_count": 1, "id": "16cf3ebb", "metadata": {}, "outputs": [], "source": [ "import morph_kgc\n", "import pyoxigraph\n", "import re" ] }, { "cell_type": "markdown", "id": "7d0436b4", "metadata": {}, "source": [ "## Knowledge Graph construction\n", "The knowledge graph is generated using [Morph-KGC](https://morph-kgc.readthedocs.io/en/latest/), that uses RML mappings to transform the JSON file into RDF. In this case, we use the [RML-star](http://w3id.org/rml/star/spec) module to generate an RDF-star graph. This tool requires some configuration parameters, where we indicate the desired output serialisation and the name and path to the RML mapping file. Then, the knowledge graph is generated and stored as a oxigraph store in the variable `graph`, that it is also saved as a `.nq` file." ] }, { "cell_type": "markdown", "id": "7f074d59", "metadata": {}, "source": [ "First, the mapping written in the YARRRML serialisation is translated into RML-star using [Yatter](https://github.com/oeg-upm/yatter)." ] }, { "cell_type": "code", "execution_count": 2, "id": "e0c4a09c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32m2023-09-11 18:25:38,323\u001b[0m | \u001b[1;30mINFO:\u001b[0m Translating YARRRML mapping to [R2]RML\n", "\u001b[32m2023-09-11 18:25:38,326\u001b[0m | \u001b[1;30mINFO:\u001b[0m RML content is created!\n", "\u001b[32m2023-09-11 18:25:38,398\u001b[0m | \u001b[1;30mINFO:\u001b[0m Mapping has been syntactically validated.\n", "\u001b[32m2023-09-11 18:25:38,398\u001b[0m | \u001b[1;30mINFO:\u001b[0m Translation has finished successfully.\n" ] } ], "source": [ "!python3 -m yatter -i ../mappings/mapping-somef-star.yml -o ../mappings/mapping-somef-star.ttl" ] }, { "cell_type": "markdown", "id": "86fd8c30", "metadata": {}, "source": [ "Configuration options for running Morph-KGC, indicating the path to the mapping file and the desired serialisaiton output (N-Quads)." ] }, { "cell_type": "code", "execution_count": 3, "id": "7f142c18", "metadata": {}, "outputs": [], "source": [ "config = \"\"\"\n", " [CONFIGURATION]\n", " output_format=N-QUADS\n", " \n", " [SOMEF-json]\n", " mappings=../mappings/mapping-somef-star.ttl\n", " \"\"\"" ] }, { "cell_type": "markdown", "id": "9d1c5bd4", "metadata": {}, "source": [ "Generation of the knowledge graph, storing it in the variable `graph`." ] }, { "cell_type": "code", "execution_count": 4, "id": "053b4628", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/mapping/mapping_parser.py:390: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " fnml_df = fnml_df.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/mapping/mapping_parser.py:607: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value 'JSON' has dtype incompatible with float64, please explicitly cast to a compatible dtype first.\n", " self.rml_df.at[i, 'source_type'] = file_extension.upper()\n", "INFO | 2023-09-11 18:25:48,419 | 145 mapping rules retrieved.\n", "INFO | 2023-09-11 18:25:48,485 | Mapping partition with 46 groups generated.\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/mapping/mapping_partitioner.py:182: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", " f\"{self.rml_df['mapping_partition'].value_counts()[0]}.\")\n", "INFO | 2023-09-11 18:25:48,486 | Maximum number of rules within mapping group: 30.\n", "INFO | 2023-09-11 18:25:48,487 | Mappings processed in 3.325 seconds.\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "/home/dgarijo/miniconda3/envs/oeg_software_graph/lib/python3.10/site-packages/morph_kgc/materializer.py:36: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.\n", " data = data.applymap(str)\n", "INFO | 2023-09-11 18:25:51,654 | Number of triples generated in total: 19449.\n" ] } ], "source": [ "graph = morph_kgc.materialize_oxigraph(config)" ] }, { "cell_type": "markdown", "id": "f5850103", "metadata": {}, "source": [ "Addition of triples to annotate the named graph that contains all triples created in the previous step. This annotations contain the date in which the metadata was extracted and the tool used for the metadata extraction." ] }, { "cell_type": "code", "execution_count": 5, "id": "10e1312c", "metadata": {}, "outputs": [], "source": [ "graph.add(pyoxigraph.Quad(\n", " pyoxigraph.NamedNode('https://w3id.org/okn/i/graph/20230628'),\n", " pyoxigraph.NamedNode('http://purl.org/dc/terms/created'),\n", " pyoxigraph.Literal('2023-06-28 00:00:00', datatype=pyoxigraph.NamedNode('http://www.w3.org/2001/XMLSchema#dateTime')),\n", " pyoxigraph.NamedNode('https://w3id.org/okn/i/graph/default')))\n", "graph.add(pyoxigraph.Quad(\n", " pyoxigraph.NamedNode('https://w3id.org/okn/i/graph/20230628'),\n", " pyoxigraph.NamedNode('http://www.w3.org/ns/prov#wasAttributedTo'),\n", " pyoxigraph.Literal('SOftware Metadata Extraction Framework (SOMEF)', datatype=pyoxigraph.NamedNode('http://www.w3.org/2001/XMLSchema#string')),\n", " pyoxigraph.NamedNode('https://w3id.org/okn/i/graph/default')))" ] }, { "cell_type": "markdown", "id": "5e51f11a", "metadata": {}, "source": [ "The graph is saved as a local file." ] }, { "cell_type": "code", "execution_count": 6, "id": "5c94be6a", "metadata": {}, "outputs": [], "source": [ "with open('../data/somef-kg.nq', 'w') as result:\n", " result.write(str(graph))" ] }, { "cell_type": "markdown", "id": "de8e6b63", "metadata": {}, "source": [ "## KG querying - Assessment of research software best practices" ] }, { "cell_type": "markdown", "id": "ce67ee97", "metadata": {}, "source": [ "Once the knowledge graph is created, we use it to answer some queries to assess the compliance of the GitHub repositories with respect to some best practices in research software\n", "\n", "\n", "| ID | Best practice | FAIR Principle |\n", "|------|-----------------------------------------------------------------------|----------------|\n", "| BP1 | A description (long or short) is available | F |\n", "| BP2 | A persistent identifier (e.g., DOI) is available | F |\n", "| BP3 | A download URL is available | A |\n", "| BP4 | A software versioning scheme is followed | A |\n", "| BP5 | Usage documentation (including I/O) is available | I,R |\n", "| BP6 | A license is declared | R |\n", "| BP7 | An explicit citation is provided | R |\n", "| BP8 | Software metadata (programming language, keywords, etc.) is available | F,R |\n", "| BP9 | Installation instructions are available | R |\n", "| BP10 | Software requirements are available | R |\n" ] }, { "cell_type": "markdown", "id": "9d92b113", "metadata": {}, "source": [ "First, the extracted repositories as counted." ] }, { "cell_type": "code", "execution_count": 7, "id": "d1b1b20c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories: 270\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " \n", " SELECT (COUNT (DISTINCT ?s) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?s a sd:Software\n", " }\n", "\"\"\")\n", "\n", "result_list = {}\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories:\", solution['count_software'].value)\n", " result_list['total_repos'] = solution['count_software'].value" ] }, { "cell_type": "markdown", "id": "45d11b4e", "metadata": {}, "source": [ "### BP 1: Description is available" ] }, { "cell_type": "markdown", "id": "64046403", "metadata": {}, "source": [ "Number of repositories with description, either long, short or both." ] }, { "cell_type": "code", "execution_count": 8, "id": "76b2ae7e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of descriptions: 229\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?software_count) \n", " FROM \n", " WHERE {\n", " ?software a sd:Software; \n", " sd:description ?desc .\n", " } \n", "\"\"\")\n", "\n", "BP_results = {}\n", "\n", "for solution in q_res:\n", " print(\"Total number of descriptions:\", solution['software_count'].value)\n", " result_list['total_description'] = solution['software_count'].value\n", " BP_results['BP1'] = int(solution['software_count'].value)*100/int(result_list['total_repos'])" ] }, { "cell_type": "markdown", "id": "942aa175", "metadata": {}, "source": [ "Numer of software with descriptions by type: long (README) or short (GitHub API)" ] }, { "cell_type": "code", "execution_count": 9, "id": "80a7ac2b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with short description: 200\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " \n", " SELECT (COUNT (DISTINCT ?software_short) AS ?short_desc_count)\n", " FROM \n", " WHERE {\n", " << ?software_short sd:description ?desc_short >> sd:technique \"GitHub_API\".\n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with short description:\", solution['short_desc_count'].value)\n", " result_list['total_short_desc'] = solution['short_desc_count'].value\n", " " ] }, { "cell_type": "code", "execution_count": 10, "id": "ebcce44e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with long description: 88\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " PREFIX xsd: \n", " \n", " SELECT (COUNT (DISTINCT ?software_long) AS ?long_desc_count)\n", " FROM \n", " WHERE {\n", " << ?software_long sd:description ?desc_long >> sd:technique ?long_technique ;\n", " sd:confidence ?long_conf .\n", " VALUES ?long_technique {\"supervised_classification\" \"header_analysis\"}\n", " FILTER(?long_conf > 0.98)\n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with long description:\", solution['long_desc_count'].value)\n", " result_list['total_long_desc'] = solution['long_desc_count'].value\n", " " ] }, { "cell_type": "markdown", "id": "7f66cd54", "metadata": {}, "source": [ "### BP2: Persistent identifier\n", "Repositories that provide a DOI (not from a publication, but from e.g. Zenodo)" ] }, { "cell_type": "code", "execution_count": 11, "id": "98b4893e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with DOI: 21\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?software sd:identifier ?id \n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with DOI:\", solution['count_software'].value)\n", " result_list['total_id'] = solution['count_software'].value\n", " BP_results['BP2'] = int(solution['count_software'].value)*100/int(result_list['total_repos'])" ] }, { "cell_type": "markdown", "id": "14d1e157", "metadata": {}, "source": [ "### BP3: Download URL\n", "Repositories that provide a URL for download from releases" ] }, { "cell_type": "code", "execution_count": 12, "id": "5f188c03", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with download URL: 81\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?software sd:hasVersion ?version \n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with download URL:\", solution['count_software'].value)\n", " result_list['total_down_url'] = solution['count_software'].value\n", " BP_results['BP3'] = int(solution['count_software'].value)*100/int(result_list['total_repos'])\n" ] }, { "cell_type": "markdown", "id": "54e78c80", "metadata": {}, "source": [ "### BP4: A software versioning scheme is followed\n", "Repositories whose version tags follow semantic versioning scheme" ] }, { "cell_type": "code", "execution_count": 13, "id": "c42a54c8", "metadata": {}, "outputs": [], "source": [ "def is_semantic_version(version):\n", " pattern = r\"^[v|V]?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$\"\n", " return re.match(pattern, version) is not None" ] }, { "cell_type": "code", "execution_count": 14, "id": "55ce0802", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with semantic versioning: 30\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " \n", " SELECT DISTINCT ?software (GROUP_CONCAT (?versionId) AS ?ids)\n", " FROM \n", " WHERE {\n", " ?software sd:hasVersion/sd:hasVersionId ?versionId\n", " } GROUP BY ?software\n", "\"\"\")\n", "\n", "\n", "total_semantic_versioning = 0\n", "for solution in q_res:\n", " version_ids = solution['ids'].value\n", " version_ids_array = version_ids.split(' ')\n", " results = [True if is_semantic_version(version) else False for version in version_ids_array]\n", " overall_res = False if False in results else True\n", " total_semantic_versioning = total_semantic_versioning if False in results else total_semantic_versioning + 1\n", "\n", "print(\"Total number of repositories with semantic versioning:\", total_semantic_versioning)\n", "result_list['total_semantic_versioning'] = total_semantic_versioning\n", "BP_results['BP4'] = int(total_semantic_versioning)*100/int(result_list['total_repos'])\n" ] }, { "cell_type": "markdown", "id": "bc235e5f", "metadata": {}, "source": [ "### BP5: Documentation is available\n", "Repositories that provide readable documentation" ] }, { "cell_type": "code", "execution_count": 15, "id": "b0cc1eec", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with available documentation: 42\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?software sd:hasDocumentation ?doc \n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with available documentation:\", solution['count_software'].value)\n", " result_list['total_docs'] = solution['count_software'].value\n", " BP_results['BP5'] = int(solution['count_software'].value)*100/int(result_list['total_repos'])\n", " \n" ] }, { "cell_type": "markdown", "id": "f0fee18c", "metadata": {}, "source": [ "### BP6: License available\n", "Repositories that declare a license" ] }, { "cell_type": "code", "execution_count": 16, "id": "d1353952", "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with license: 164\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " PREFIX schema: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?software a sd:Software ;\n", " schema:license ?license .\n", " ?license a schema:CreativeWork ;\n", " sd:name ?license_name .\n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with license:\", solution['count_software'].value)\n", " result_list['total_license'] = solution['count_software'].value\n", " BP_results['BP6'] = int(solution['count_software'].value)*100/int(result_list['total_repos'])\n" ] }, { "cell_type": "markdown", "id": "51929ac1", "metadata": {}, "source": [ "### BP7: Explicit citation\n", "Repositories that provide a explicit citation, eiter in the README or with a CFF file." ] }, { "cell_type": "code", "execution_count": 17, "id": "04bc7cb3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with citation: 22\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " PREFIX schema: \n", " PREFIX prov: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?software sd:citation ?cite \n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with citation:\", solution['count_software'].value)\n", " result_list['total_citation'] = solution['count_software'].value\n", " BP_results['BP7'] = int(solution['count_software'].value)*100/int(result_list['total_repos'])\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "1a0e584e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with citation in README: 20\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " PREFIX schema: \n", " PREFIX prov: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " << ?software sd:citation ?cite >> prov:hadPrimarySource ?source\n", " FILTER(CONTAINS(str(?source),'README'))\n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with citation in README:\", solution['count_software'].value)\n", " result_list['readme_citation'] = solution['count_software'].value\n" ] }, { "cell_type": "code", "execution_count": 19, "id": "d8bb8cf7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with CFF citation file: 5\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " PREFIX schema: \n", " PREFIX prov: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " << ?software sd:citation ?cite >> prov:hadPrimarySource ?source\n", " FILTER(CONTAINS(str(?source),'.cff'))\n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with CFF citation file:\", solution['count_software'].value)\n", " result_list['cff_citation'] = solution['count_software'].value\n" ] }, { "cell_type": "markdown", "id": "3c6634b3", "metadata": {}, "source": [ "### BP8: Available software metadata\n", "Repositories with minimum software metadata: programming language, date created, at least one release and keywords" ] }, { "cell_type": "code", "execution_count": 20, "id": "deb3bd03", "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with minimum metadata: 22\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " PREFIX schema: \n", " PREFIX prov: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?software sd:hasSourceCode/sd:programmingLanguage ?language .\n", " ?software sd:dateCreated ?date .\n", " ?software sd:description ?desc .\n", " ?software sd:hasVersion ?rel .\n", " ?software sd:keywords ?keys .\n", " \n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with minimum metadata:\", solution['count_software'].value)\n", " result_list['total_repo_metadata'] = solution['count_software'].value\n", " BP_results['BP8'] = int(solution['count_software'].value)*100/int(result_list['total_repos'])\n" ] }, { "cell_type": "markdown", "id": "7fc6aee9", "metadata": {}, "source": [ "### BP9: Installation instructions\n", "Repositories that provide installation instructions" ] }, { "cell_type": "code", "execution_count": 21, "id": "07af6c54", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with installation instructions: 60\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " PREFIX schema: \n", " PREFIX prov: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?software sd:hasInstallationInstructions ?inst .\n", " \n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with installation instructions:\", solution['count_software'].value)\n", " result_list['total_install_inst'] = solution['count_software'].value\n", " BP_results['BP9'] = int(solution['count_software'].value)*100/int(result_list['total_repos'])\n" ] }, { "cell_type": "markdown", "id": "bb1ff6f8", "metadata": {}, "source": [ "### BP10: Software requirements\n", "Repositories that provide requirements to use the software" ] }, { "cell_type": "code", "execution_count": 22, "id": "38231239", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of repositories with software requirements: 22\n" ] } ], "source": [ "q_res = graph.query(\"\"\"\n", " PREFIX sd: \n", " PREFIX schema: \n", " PREFIX prov: \n", " \n", " SELECT (COUNT (DISTINCT ?software) AS ?count_software)\n", " FROM \n", " WHERE {\n", " ?software sd:softwareRequirements ?requirements .\n", " \n", " }\n", "\"\"\")\n", "\n", "for solution in q_res:\n", " print(\"Total number of repositories with software requirements:\", solution['count_software'].value)\n", " result_list['total_soft_requirements'] = solution['count_software'].value\n", " BP_results['BP10'] = int(solution['count_software'].value)*100/int(result_list['total_repos'])\n" ] }, { "cell_type": "markdown", "id": "8dd59a57", "metadata": {}, "source": [ "## Graphics and statistics\n", "Graphical representation of the results obtained in the queries above to represent the percentage of repositories in the GitHub organisation that are compliant with the best practices" ] }, { "cell_type": "code", "execution_count": 23, "id": "7783d253", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "053f7f5f", "metadata": {}, "source": [ "#### General barplot showing percentage of repos that comply with the BPs" ] }, { "cell_type": "code", "execution_count": 24, "id": "73b99020", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "numeric_result_list = dict([a, int(x)] for a, x in result_list.items()) \n", "\n", "labels_BP = ['Description (BP1)',\n", " 'Persistent ID (BP2)',\n", " 'Download URL (BP3)',\n", " 'Versioning scheme (BP4)',\n", " 'Documentation (BP5)',\n", " 'License (BP6)',\n", " 'Citation (BP7)',\n", " 'Metadata (BP8)',\n", " 'Installation (BP9)',\n", " 'Requirements (BP10)']\n", "\n", "bars = plt.bar(*zip(*BP_results.items()), color='#4895ef')\n", "plt.ylabel('Percentage of repositories')\n", "plt.xticks(range(len(BP_results)), list(labels_BP), rotation=45, ha='right')\n", "plt.ylim((0,100))\n", "\n", "for bar in bars:\n", " height = bar.get_height()\n", " percentage = str(round(height,2)) + '%'\n", " plt.text(bar.get_x() + bar.get_width() / 2, height, percentage, ha='center', va='bottom')\n", "\n", "\n", "plt.savefig('general_bp.png',dpi=400,bbox_inches = \"tight\") \n", "plt.show()" ] }, { "cell_type": "markdown", "id": "dffc5cc7", "metadata": {}, "source": [ "#### Specific plots for citations and descriptions" ] }, { "cell_type": "code", "execution_count": 25, "id": "d5297a95", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "labels_desc = ['Short description', 'Long description']\n", "values_desc = [numeric_result_list['total_short_desc']*100/int(result_list['total_repos']),\n", " numeric_result_list['total_long_desc']*100/int(result_list['total_repos'])]\n", "\n", "plt.figure(figsize=(4,3))\n", "bars = plt.bar(labels_desc, values_desc, color='#4895ef')\n", "plt.ylabel('Percentage of respositories')\n", "plt.ylim((0,100))\n", "\n", "for bar in bars:\n", " height = bar.get_height()\n", " percentage = str(round(height,2)) + '%'\n", " plt.text(bar.get_x() + bar.get_width() / 2, height, percentage, ha='center', va='bottom')\n", "\n", "plt.savefig('descriptions.png',dpi=400,bbox_inches = \"tight\") \n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 26, "id": "4da80232", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "labels_cite = ['README', 'CFF']\n", "values_cite = [numeric_result_list['readme_citation']*100/int(result_list['total_repos']),\n", " numeric_result_list['cff_citation']*100/int(result_list['total_repos'])]\n", "\n", "plt.figure(figsize=(4,3))\n", "bars = plt.bar(labels_cite, values_cite, color='#4895ef')\n", "plt.ylabel('Percentage of repositories')\n", "plt.ylim((0,100))\n", "for bar in bars:\n", " height = bar.get_height()\n", " percentage = str(round(height,2)) + '%'\n", " plt.text(bar.get_x() + bar.get_width() / 2, height, percentage, ha='center', va='bottom')\n", "\n", "\n", "plt.savefig('citations.png',dpi=400,bbox_inches = \"tight\") \n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }