Skip to content

[Suggestion] Possible integration with AWL and its SPARQL interface  #127

@simontaurus

Description

@simontaurus

I like the idea of seeing annotated and typed function signatures are way to go for interoperability, together with a graph-like data structure.

However, going beyond linear workflow (loops, conditionals) may represent a challenge, see also #126

With AWL (https://github.com/OO-LD/awl-schema) we develop a more general way in using the Abstract Syntax Tree (AST) represenation of such a function-oriented code (on python or another programming languages) including also control structures.
By applying JSON-LD on the AST this lead directly to and RDF representation of the code, which can be queried or transformed with SPARQL (and re-transpiled to python)

The benefits of an integration in my view would be:
a) Workflows written in AWL ~ native python representation can be transfered to any workflow environment supported by PWD
b) PWD would get a semantic (RDF) representation out of the box by applying AWL to the native python representations (could be further enriched with https://github.com/pyiron/semantikon)
c) This RDF representation may also be utilized within PWD to parse more complex workflows

For c) @samwaseda and I also explored a transformation from AWL to the node and edge oriented representation of PWD:

Example code

def function_one(x):
    return x

def function_two(x, y):
    return x + y

SPARQL

PREFIX awl: <https://oo-ld.github.io/awl-schema/>
PREFIX ex: <https://example.org/>
CONSTRUCT { 
  ex:Workflow awl:HasNode ?function .
  ex:Workflow a awl:Workflow .
  ?function awl:HasName ?functionName .
  ?function awl:HasInput ?input .
  ?input awl:HasName ?key
}
WHERE { 
  ?module awl:HasPart ?functionDef .
  ?functionDef a awl:FunctionDef . 
  ?functionDef awl:HasArgument/awl:HasArgument ?arg .
  ?functionDef awl:HasName ?functionName .
  BIND (URI(concat(str(ex:),STR(?functionName))) as ?function)
  ?arg awl:HasKey ?key . 
  BIND (URI(concat(str(ex:),STR(?functionName),"/",STR(?key))) as ?input)
}

Result:

{
  "id": "ex:Workflow",
  "type": "awl:Workflow",
  "nodes": [
    {
      "id": "ex:function_one",
      "inputs": {
        "id": "ex:function_one/x",
        "name": "x"
      },
      "name": "function_one"
    },
    {
      "id": "ex:my_workflow",
      "inputs": [
        {
          "id": "ex:my_workflow/a",
          "name": "a"
        },
        {
          "id": "ex:my_workflow/b",
          "name": "b"
        }
      ],
      "name": "my_workflow"
    },
    {
      "id": "ex:function_two",
      "inputs": [
        {
          "id": "ex:function_two/x",
          "name": "x"
        },
        {
          "id": "ex:function_two/y",
          "name": "y"
        }
      ],
      "name": "function_two"
    }
  ]
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions