From 6629446263be277a663c5505e0a0dc56c0197ad1 Mon Sep 17 00:00:00 2001
From: Alex Hambley <33315205+alexhambley@users.noreply.github.com>
Date: Tue, 9 Jul 2024 12:50:11 +0100
Subject: [PATCH 01/13] Update Dockerfile to use snakemake image
Updated the dockerfile to use a two stage process. Snakemake image is used as the runtime environment.
Supports / Partially addresses #17
---
Dockerfile | 51 +++++++++++++++++++++++++++++++++------------------
1 file changed, 33 insertions(+), 18 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 460d08c..ff530d7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,29 +1,44 @@
-FROM python:3.11-slim
+# Stage 1: Build environment
+FROM python:3.11-slim as build-stage
-RUN pip install poetry
+# Install build tools and Poetry
+RUN apt-get update && apt-get install -y build-essential \
+ && pip install poetry
-# Set the working directory
WORKDIR /app
-# Install build tools for Snakemake (gcc, make, etc.)
-RUN apt-get update && apt-get install -y build-essential
+# Copy dependency files and install dependencies
+COPY pyproject.toml poetry.lock /app/
+RUN poetry config virtualenvs.create false \
+ && poetry install --no-interaction --no-ansi
-# Copy the pyproject.toml file
-COPY pyproject.toml /app/
+# Copy and install the application
+COPY . /app
+RUN poetry install
-# Install the dependencies
-RUN poetry install --no-root
+# Stage 2: Snakemake runtime environment
+FROM snakemake/snakemake:latest
-# Copy the rest of the application files
-COPY . /app
+# Install Poetry
+RUN pip install poetry
-# Install the package
-RUN poetry install
+WORKDIR /app
+
+# Copy the application from the build stage
+COPY --from=build-stage /app /app
+
+# Install dependencies
+RUN pip install -r <(poetry export --format requirements.txt --without-hashes) \
+ && pip install -e .
+
+# Set up non-root user
+RUN groupadd -r snakemake && useradd -r -g snakemake snakemake \
+ && chown -R snakemake:snakemake /app
-# Install Snakemake using Poetry
-RUN poetry add snakemake
+USER snakemake
-# Set the entry point for the container
-ENTRYPOINT ["poetry", "run"]
+# Configure Python path
+ENV PYTHONPATH="/app:${PYTHONPATH}"
-CMD ["help"]
+# Set the entry point
+ENTRYPOINT ["snakemake"]
\ No newline at end of file
From 13d60f46254d60ee8596caea49c380aa6f7bf9e8 Mon Sep 17 00:00:00 2001
From: Alex Hambley <33315205+alexhambley@users.noreply.github.com>
Date: Tue, 9 Jul 2024 16:14:43 +0100
Subject: [PATCH 02/13] Update snakemake workflow to fix module not found bug
Updated snakemake workflow to work with Dockerfile. Also fixes module not found error by exposing pythonpath. Partially addresses #17
---
Snakefile | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/Snakefile b/Snakefile
index bdf07b4..8408555 100644
--- a/Snakefile
+++ b/Snakefile
@@ -23,9 +23,12 @@ rule source_ro_crates:
"""
# Create the output directory if it doesn't exist:
mkdir -p {OUTPUT_DIRS}
+
+ # Add the current directory to PYTHONPATH, creating it if it doesn't exist
+ export PYTHONPATH="${{PYTHONPATH:+$PYTHONPATH:}}$(pwd)"
# Run the source_crates script to download the RO Crate metadata:
- python workflowhub_graph/source_crates.py --workflow-ids 1-10 --prod --all-versions
+ python workflowhub_graph/source_crates.py --workflow-ids 1-10 --prod --all-versions
# After sourcing, check which files were actually created:
python workflowhub_graph/check_outputs.py --workflow-ids 1-10 --versions {VERSIONS} --output-dir {OUTPUT_DIRS}
From 08ca0810dd3890c529168df65fc37b76ef9c2ede Mon Sep 17 00:00:00 2001
From: Alex Hambley <33315205+alexhambley@users.noreply.github.com>
Date: Thu, 11 Jul 2024 12:50:47 +0100
Subject: [PATCH 03/13] Update source_crates.py to work with all workflows, not
just a range
Partially addresses #28 and #17
User can now provide range (e.g. --workflow-ids 1-40) or omit this to download all workflows
---
workflowhub_graph/source_crates.py | 56 +++++++++++++++++++-----------
1 file changed, 36 insertions(+), 20 deletions(-)
diff --git a/workflowhub_graph/source_crates.py b/workflowhub_graph/source_crates.py
index 816567d..90db975 100644
--- a/workflowhub_graph/source_crates.py
+++ b/workflowhub_graph/source_crates.py
@@ -233,9 +233,17 @@ def main():
parser.add_argument(
"--workflow-ids",
type=str,
- default="-",
- help="Range of workflow IDs to process. Use a hyphen to specify a range, e.g. 1-10.",
+ help="Range of workflow IDs to process. Use a hyphen to specify a range, e.g. 1-10. "
+ "If not provided, all IDs will be processed.",
)
+ parser.add_argument(
+ "--zip",
+ default=False,
+ action="store_true",
+ help="Download and extract JSON files from zip archive.",
+ )
+
+ # TODO: Change this to `dev` to use the development WorkflowHub:
parser.add_argument(
"--prod",
default=False,
@@ -258,30 +266,38 @@ def main():
base_url = BASE_URL_DEV
workflows_url = WORKFLOWS_URL_DEV
- min_workflow_id, max_workflow_id = args.workflow_ids.split("-")
-
# Example usage:
workflows_ids = download_workflow_ids(workflows_url)
- if min_workflow_id != "":
- workflows_ids["data"] = [
- workflow
- for workflow in workflows_ids["data"]
- if int(workflow["id"]) >= int(min_workflow_id)
- ]
-
- if max_workflow_id != "":
- workflows_ids["data"] = [
- workflow
- for workflow in workflows_ids["data"]
- if int(workflow["id"]) <= int(max_workflow_id)
- ]
-
- # Check if root key 'data' exists
+ if args.workflow_ids:
+ min_workflow_id, max_workflow_id = args.workflow_ids.split("-")
+ if min_workflow_id != "":
+ workflows_ids["data"] = [
+ workflow
+ for workflow in workflows_ids["data"]
+ if int(workflow["id"]) >= int(min_workflow_id)
+ ]
+
+ if max_workflow_id != "":
+ workflows_ids["data"] = [
+ workflow
+ for workflow in workflows_ids["data"]
+ if int(workflow["id"]) <= int(max_workflow_id)
+ ]
+ # If no workflow_ids argument is provided, we use all IDs
+
+ if workflows_ids and "data" in workflows_ids:
+ process_workflow_ids(
+ workflows_ids,
+ is_metadata_endpoint=not args.zip,
+ base_url=base_url,
+ all_versions=args.all_versions,
+ )
+
if workflows_ids and "data" in workflows_ids:
process_workflow_ids(
workflows_ids,
- is_metadata_endpoint=True,
+ is_metadata_endpoint=not args.zip,
base_url=base_url,
all_versions=args.all_versions,
)
From 0d78980aa02435b6ba3e43411670ba69c5dd5297 Mon Sep 17 00:00:00 2001
From: Alex Hambley <33315205+alexhambley@users.noreply.github.com>
Date: Fri, 12 Jul 2024 09:38:53 +0100
Subject: [PATCH 04/13] Temporary fix for ValueError with multiple context URLs
(#34)
- Temporary fix for ValueError with multiple context URLs (#34) by returning empty context for URLs that don't match allowed_urls_pattern.
---
workflowhub_graph/cached_url_open.py | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/workflowhub_graph/cached_url_open.py b/workflowhub_graph/cached_url_open.py
index a6cedd0..1071e50 100644
--- a/workflowhub_graph/cached_url_open.py
+++ b/workflowhub_graph/cached_url_open.py
@@ -1,3 +1,4 @@
+import json
import os
import re
from unittest.mock import patch, MagicMock
@@ -42,11 +43,6 @@ def patch_rdflib_urlopen(
def cached_urlopen(request):
url = request.get_full_url()
- if not allowed_urls_re.match(url):
- raise ValueError(
- f"URL {url} not allowed to cache, allowed: {allowed_urls_pattern}"
- )
-
class Response(io.StringIO):
content_type = "text/html"
headers = {"Content-Type": "text/html"}
@@ -57,6 +53,12 @@ def info(self):
def geturl(self):
return url
+ if not allowed_urls_re.match(url):
+ return Response(json.dumps({"@context": {}}))
+ # raise ValueError(
+ # f"URL {url} not allowed to cache, allowed: {allowed_urls_pattern}"
+ # )
+
cached_filename = os.path.join(cache_base_dir, url_to_filename(url))
if not os.path.exists(cached_filename):
From cc231219dde553bae7bfc39ea28ce60754206b04 Mon Sep 17 00:00:00 2001
From: Alex Hambley <33315205+alexhambley@users.noreply.github.com>
Date: Fri, 12 Jul 2024 13:41:31 +0100
Subject: [PATCH 05/13] Addressed FromAsCasing warning in Dockerfile
FromAsCasing - FROM and AS should be in the same case.
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index ff530d7..832f558 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
# Stage 1: Build environment
-FROM python:3.11-slim as build-stage
+FROM python:3.11-slim AS build-stage
# Install build tools and Poetry
RUN apt-get update && apt-get install -y build-essential \
From 66c47ed56ab472f852de16f34844a2ff4fd1800d Mon Sep 17 00:00:00 2001
From: Alex Hambley <33315205+alexhambley@users.noreply.github.com>
Date: Fri, 12 Jul 2024 13:44:44 +0100
Subject: [PATCH 06/13] Find maximum ID from sourced workflows when sourcing
all workflows
- Added get_max_id_from_files method.
- If --workflow-ids argument is not provided, created_files.json should contain all workflows downloaded. get_max_id_from_files() finds the maximum ID in the sourced workflows.
- Part of wider effort to address #17
---
workflowhub_graph/check_outputs.py | 31 ++++++++++++++++++++++++++----
1 file changed, 27 insertions(+), 4 deletions(-)
diff --git a/workflowhub_graph/check_outputs.py b/workflowhub_graph/check_outputs.py
index 245e0ce..7f5544f 100644
--- a/workflowhub_graph/check_outputs.py
+++ b/workflowhub_graph/check_outputs.py
@@ -1,6 +1,7 @@
import argparse
import json
import os
+import re
def parse_args() -> argparse.Namespace:
@@ -15,7 +16,6 @@ def parse_args() -> argparse.Namespace:
parser.add_argument(
"--workflow-ids",
type=str,
- required=True,
help="Range of workflow IDs to process (e.g., '1-10').",
)
parser.add_argument(
@@ -33,6 +33,24 @@ def parse_args() -> argparse.Namespace:
return parser.parse_args()
+def get_max_id_from_files(output_dir: str) -> int:
+ """
+ If no workflow ID parameter is provided, get the maximum workflow ID from the files in the output directory.
+
+ :param output_dir: The directory where output files are stored.
+ :return: The maximum workflow ID.
+ """
+ max_id = 0
+ pattern = re.compile(r"^(\d+)_\d+_ro-crate-metadata\.json$")
+ for filename in os.listdir(output_dir):
+ match = pattern.match(filename)
+ if match:
+ wf_id = int(match.group(1))
+ if wf_id > max_id:
+ max_id = wf_id
+ return max_id
+
+
def generate_expected_files(
output_dir: str, workflow_ids: range, versions: list[str]
) -> list[str]:
@@ -64,10 +82,15 @@ def verify_created_files(expected_files: list[str]) -> list[str]:
def main():
- # Parse workflow IDs and versions:
args = parse_args()
- min_id, max_id = map(int, args.workflow_ids.split("-"))
- workflow_ids = range(min_id, max_id + 1)
+
+ if args.workflow_ids:
+ min_id, max_id = map(int, args.workflow_ids.split("-"))
+ workflow_ids = range(min_id, max_id + 1)
+ else:
+ max_id = get_max_id_from_files(args.output_dir)
+ workflow_ids = range(1, max_id + 1)
+
versions = args.versions.split(",")
# Generate expected file paths
From eead0f7d4a39920c0ed44ffc526b9e6c12dea079 Mon Sep 17 00:00:00 2001
From: Alex Hambley <33315205+alexhambley@users.noreply.github.com>
Date: Mon, 15 Jul 2024 14:31:18 +0100
Subject: [PATCH 07/13] Tidy up Snakefile
Removes list_expected_files() method.
---
Snakefile | 24 +++++++++++-------------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/Snakefile b/Snakefile
index 8408555..010faae 100644
--- a/Snakefile
+++ b/Snakefile
@@ -1,21 +1,14 @@
-# TODO - Refactor to input args to the Snakemake file
WORKFLOW_IDS = range(1,11)
VERSIONS = ['1']
OUTPUT_DIRS = "data"
MERGED_FILE = "merged.ttl"
-def list_expected_files():
- files = []
- for wf_id in WORKFLOW_IDS:
- for ver in VERSIONS:
- files.append(f"{OUTPUT_DIRS}/{wf_id}_{ver}_ro-crate-metadata.json")
- return files
-
rule all:
input:
MERGED_FILE
+# TODO - Refactor to input args to the Snakemake file. I.e. replace WORKFLOW_IDS and VERSIONS with input args.
rule source_ro_crates:
output:
"created_files.json"
@@ -27,11 +20,16 @@ rule source_ro_crates:
# Add the current directory to PYTHONPATH, creating it if it doesn't exist
export PYTHONPATH="${{PYTHONPATH:+$PYTHONPATH:}}$(pwd)"
- # Run the source_crates script to download the RO Crate metadata:
- python workflowhub_graph/source_crates.py --workflow-ids 1-10 --prod --all-versions
-
- # After sourcing, check which files were actually created:
- python workflowhub_graph/check_outputs.py --workflow-ids 1-10 --versions {VERSIONS} --output-dir {OUTPUT_DIRS}
+ # Run the source_crates script to download the RO Crate metadata,
+ # then check the output files and generate created_files.json:
+
+ # - all versions of all workflows:
+ python workflowhub_graph/source_crates.py --prod --all-versions
+ python workflowhub_graph/check_outputs.py --versions {VERSIONS} --output-dir {OUTPUT_DIRS}
+
+ # - all versions of first 10 workflows:
+ # python workflowhub_graph/source_crates.py --workflow-ids 1-10 --prod --all-versions
+ # python workflowhub_graph/check_outputs.py --workflow-ids 1-10 --versions {VERSIONS} --output-dir {OUTPUT_DIRS}
"""
rule report_created_files:
From b01db252693349c7cabd06d1c5b756fc8f2558fe Mon Sep 17 00:00:00 2001
From: Alex Hambley <33315205+alexhambley@users.noreply.github.com>
Date: Mon, 15 Jul 2024 14:31:48 +0100
Subject: [PATCH 08/13] Example output for evaluation
---
merged.ttl | 233697 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 232493 insertions(+), 1204 deletions(-)
diff --git a/merged.ttl b/merged.ttl
index 7e5b935..c040502 100644
--- a/merged.ttl
+++ b/merged.ttl
@@ -1,868 +1,76848 @@
@prefix dct: .
@prefix ns1: .
+@prefix ns2: .
+@prefix rel: .
@prefix schema1: .
@prefix xsd: .
- a schema1:CreativeWork ;
+ a schema1:CreativeWork ;
dct:conformsTo ;
- schema1:about .
+ schema1:about .
- a schema1:CreativeWork ;
- schema1:about .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:CreativeWork ;
+ a schema1:CreativeWork ;
dct:conformsTo ;
- schema1:about .
+ schema1:about .
- a schema1:CreativeWork ;
- schema1:about .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:CreativeWork ;
+ a schema1:CreativeWork ;
dct:conformsTo ;
- schema1:about .
+ schema1:about .
- a schema1:CreativeWork ;
- schema1:about .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:CreativeWork ;
+ a schema1:CreativeWork ;
dct:conformsTo ;
- schema1:about .
+ schema1:about .
- a schema1:CreativeWork ;
- schema1:about .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:CreativeWork ;
+ a schema1:CreativeWork ;
dct:conformsTo ;
- schema1:about .
+ schema1:about .
- a schema1:CreativeWork ;
- schema1:about .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:CreativeWork ;
+ a schema1:CreativeWork ;
dct:conformsTo ;
- schema1:about .
+ schema1:about .
- a schema1:CreativeWork ;
- schema1:about .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:CreativeWork ;
+ a schema1:CreativeWork ;
dct:conformsTo ;
- schema1:about .
+ schema1:about .
- a schema1:CreativeWork ;
- schema1:about .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:CreativeWork ;
- dct:conformsTo ;
- schema1:about .
+ a ;
+ dct:conformsTo "https://bioschemas.org/profiles/FormalParameter/1.0-RELEASE/" ;
+ schema1:name "#main/MaxMTpc" .
- a schema1:CreativeWork ;
- schema1:about .
+ a ;
+ dct:conformsTo "https://bioschemas.org/profiles/FormalParameter/1.0-RELEASE/" ;
+ schema1:name "#main/MinCountPerCell" .
- a schema1:CreativeWork ;
- dct:conformsTo ;
- schema1:about .
+ a ;
+ dct:conformsTo "https://bioschemas.org/profiles/FormalParameter/1.0-RELEASE/" ;
+ schema1:name "#main/MinGenesPerCell" .
- a schema1:CreativeWork ;
- schema1:about .
+ a ;
+ dct:conformsTo "https://bioschemas.org/profiles/FormalParameter/1.0-RELEASE/" ;
+ schema1:name "#main/genecount_qc_plot" .
- a schema1:Person ;
- schema1:name "Dannon Baker" .
+ a ;
+ dct:conformsTo "https://bioschemas.org/profiles/FormalParameter/1.0-RELEASE/" ;
+ schema1:name "#main/mito_qc_plot" .
- a schema1:Person ;
- schema1:name "Björn Grüning" .
+ a ;
+ dct:conformsTo "https://bioschemas.org/profiles/FormalParameter/1.0-RELEASE/" ;
+ schema1:name "#main/qc_anndata_object" .
- a schema1:Person ;
- schema1:name "Delphine Larivière" .
+ a ;
+ dct:conformsTo "https://bioschemas.org/profiles/FormalParameter/1.0-RELEASE/" ;
+ schema1:name "#main/top_genes_plot" .
- a schema1:Person ;
- schema1:name "Gildas Le Corguillé" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Andrew Lonie" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Nicholas Keener" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Sergei Kosakovsky Pond" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Wolfgang Maier" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ,
+ ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Anton Nekrutenko" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "James Taylor" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Steven Weaver" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Marius van den Beek" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Dave Bouvier" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "John Chilton" .
+ a schema1:Person ;
+ schema1:name "Anna Syme" .
- a schema1:Person ;
- schema1:name "Nate Coraor" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ,
+ ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Frederik Coppens" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Bert Droesbeke" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Ignacio Eguinoa" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Simon Gladman" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:ComputerLanguage ;
- schema1:alternateName "CWL" ;
- schema1:identifier ;
- schema1:name "Common Workflow Language" ;
- schema1:url .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:ComputerLanguage ;
- schema1:identifier ;
- schema1:name "Galaxy" ;
- schema1:url .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Dannon Baker" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Björn Grüning" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Delphine Larivière" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Gildas Le Corguillé" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Andrew Lonie" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Nicholas Keener" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Sergei Kosakovsky Pond" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Wolfgang Maier" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Anton Nekrutenko" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "James Taylor" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Steven Weaver" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Marius van den Beek" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Dave Bouvier" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "John Chilton" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Nate Coraor" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Frederik Coppens" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Bert Droesbeke" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Ignacio Eguinoa" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Simon Gladman" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:ComputerLanguage ;
- schema1:alternateName "CWL" ;
- schema1:identifier ;
- schema1:name "Common Workflow Language" ;
- schema1:url .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:ComputerLanguage ;
- schema1:identifier ;
- schema1:name "Galaxy" ;
- schema1:url .
+ a schema1:CreativeWork ;
+ schema1:about .
- a ;
- dct:conformsTo "https://bioschemas.org/profiles/FormalParameter/1.0-RELEASE/" ;
- schema1:name "NC_045512" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Dannon Baker" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Björn Grüning" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Delphine Larivière" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Gildas Le Corguillé" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Andrew Lonie" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Nicholas Keener" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Sergei Kosakovsky Pond" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Wolfgang Maier" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Anton Nekrutenko" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "James Taylor" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Steven Weaver" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Marius van den Beek" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Dave Bouvier" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "John Chilton" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Nate Coraor" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Frederik Coppens" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Bert Droesbeke" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Ignacio Eguinoa" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Simon Gladman" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:ComputerLanguage ;
- schema1:alternateName "CWL" ;
- schema1:identifier ;
- schema1:name "Common Workflow Language" ;
- schema1:url .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:ComputerLanguage ;
- schema1:identifier ;
- schema1:name "Galaxy" ;
- schema1:url .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Dannon Baker" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Björn Grüning" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Delphine Larivière" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Gildas Le Corguillé" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Andrew Lonie" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ,
+ ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Nicholas Keener" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Sergei Kosakovsky Pond" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Wolfgang Maier" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Anton Nekrutenko" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "James Taylor" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Steven Weaver" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ,
+ ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Marius van den Beek" .
+ a schema1:CreativeWork ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "Dave Bouvier" .
+ a schema1:CreativeWork ;
+ dct:conformsTo ;
+ schema1:about .
- a schema1:Person ;
- schema1:name "John Chilton" .
+ a schema1:CreativeWork ;
+ schema1:about