about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gn3/db/rdf/wiki.py97
1 files changed, 96 insertions, 1 deletions
diff --git a/gn3/db/rdf/wiki.py b/gn3/db/rdf/wiki.py
index c278ed8..152b261 100644
--- a/gn3/db/rdf/wiki.py
+++ b/gn3/db/rdf/wiki.py
@@ -9,8 +9,16 @@ NOTE: In the CONSTRUCT queries below, we manually sort the arrays from
    <https://stackoverflow.com/questions/78186393>
    <https://www.w3.org/TR/rdf-sparql-query/#modOrderBy>
 """
+import datetime
+
 from string import Template
-from gn3.db.rdf import BASE_CONTEXT, RDF_PREFIXES, query_frame_and_compact, sparql_query
+from gn3.db.rdf import (
+    BASE_CONTEXT,
+    RDF_PREFIXES,
+    query_frame_and_compact,
+    sparql_query,
+    update_rdf,
+)
 from gn3.db.wiki import MissingDBDataException
 
 
@@ -201,3 +209,90 @@ SELECT MAX(?version) as ?max_version FROM $graph WHERE {
     if not results:
         raise MissingDBDataException
     return int(results["max_version"]["value"]) + 1
+
+
+def update_wiki_comment(
+    comment_id: int,
+    payload: dict,
+    sparql_conf: dict,
+    graph: str = "<http://genenetwork.org>",
+) -> tuple[str, int]:
+    """Update a wiki comment by inserting a comment with the same
+identifier but an updated version id.  The End form of this query
+looks like:
+
+    INSERT {
+            GRAPH <http://genenetwork.org> {
+            [ rdfs:label '''XXXX'''@en] rdf:type gnc:GNWikiEntry ;
+                    gnt:symbol "XXXX" ;
+                    foaf:mbox <XXXX> ;
+                    gnt:initial "XXXX" ;
+                    gnt:belongsToSpecies ?speciesId ;
+                    gnt:reason "XXXX" ;
+                    foaf:homepage <XXXX> ;
+                    dct:references pmid:XXXX ;
+                    dct:references pmid:XXXX ;
+                    gnt:belongsToCategory "XXXX";
+                    gnt:belongsToCategory "XXXX";
+                    dct:hasVersion "123"^^xsd:integer ;
+                    dct:identifier "1"^^xsd:integer ;
+                    dct:created "2024-09-11 11:00"^^xsd:datetime .
+
+            } USING <http://genenetwork.org> WHERE {
+                    ?speciesId gnt:shortName "{species}" .
+
+            }
+    }
+    """
+    next_version = get_next_comment_version(
+        comment_id, sparql_conf['sparql_uri'], graph)
+    name = f"gn:wiki-{comment_id}-{next_version}"
+    comment_triple = Template("""$name rdf:label '''$comment'''@en ;
+rdf:type gnc:GNWikiEntry ;
+gnt:symbol "$symbol" ;
+dct:identifier "$comment_id"^^xsd:integer ;
+dct:hasVersion "$next_version"^^xsd:integer ;
+dct:created "$created"^^xsd:datetime .
+""").substitute(
+        comment=payload["comment"],
+        name=name, symbol=payload['symbol'],
+        comment_id=comment_id, next_version=next_version,
+        created=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S'))
+    using = ""
+    if payload["email"]:
+        comment_triple += f"{name} foaf:mbox <{payload['email']}> .\n"
+    if payload["initial"]:
+        comment_triple += f"{name} gnt:initial \"{payload['initial']}\" .\n"
+    if payload["species"]:
+        comment_triple += f"{name} gnt:belongsToSpecies ?speciesId .\n"
+        using = Template(
+            """ USING $graph WHERE { ?speciesId gnt:shortName "$species" . } """).substitute(
+                graph=graph, species=payload["species"]
+        )
+    if payload["reason"]:
+        comment_triple += f"{name} gnt:reason \"{payload['reason']}\" .\n"
+    if payload["web_url"]:
+        comment_triple += f"{name} foaf:homepage <{payload['web_url']}> .\n"
+    for pmid in payload["pubmed_ids"]:
+        comment_triple += f"{name} dct:references pubmed:{pmid} .\n"
+    for category in payload["categories"]:
+        comment_triple += f'{name} gnt:belongsToCategory "{category}".\n'
+
+    res = update_rdf(
+        query=Template(
+            """
+$prefix
+
+INSERT {
+GRAPH $graph {
+$comment_triple}
+} $using
+""").substitute(prefix=RDF_PREFIXES,
+                graph=graph,
+                comment_triple=comment_triple,
+                using=using),
+        sparql_user=sparql_conf["sparql_user"],
+        sparql_password=sparql_conf["sparql_password"],
+        sparql_auth_uri=sparql_conf["sparql_auth_uri"],
+    )
+    return (res, 200)