Mercurial > code > home > repos > homeauto
diff lib/patchablegraph.py @ 233:4ebb5cc30002
server/browser graph sync. cut dependency on the WS version. merge some changes between arduino/pi code.
Ignore-this: cf7d20d54e134e8ff33a9ee405610846
author | drewp@bigasterisk.com |
---|---|
date | Sat, 30 Jan 2016 06:40:00 -0800 |
parents | c1b98006f56e |
children | 8d89da1915df |
line wrap: on
line diff
--- a/lib/patchablegraph.py Thu Jan 28 02:48:54 2016 -0800 +++ b/lib/patchablegraph.py Sat Jan 30 06:40:00 2016 -0800 @@ -10,8 +10,17 @@ 5. Client queries its graph with low-level APIs or client-side sparql. 6. When the graph changes, the client knows and can update itself at low or high granularity. + + +See also: +* http://iswc2007.semanticweb.org/papers/533.pdf RDFSync: efficient remote synchronization of RDF +models +* https://www.w3.org/2009/12/rdf-ws/papers/ws07 Supporting Change Propagation in RDF +* https://www.w3.org/DesignIssues/lncs04/Diff.pdf Delta: an ontology for the distribution of +differences between RDF graphs + """ -import sys, json +import sys, json, logging import cyclone.sse sys.path.append("/my/proj/light9") from light9.rdfdb.grapheditapi import GraphEditApi @@ -20,6 +29,8 @@ from rdflib_jsonld.serializer import from_rdf from cycloneerr import PrettyErrorHandler +log = logging.getLogger('patchablegraph') + def writeGraphResponse(req, graph, acceptHeader): if acceptHeader == 'application/nquads': req.set_header('Content-type', 'application/nquads') @@ -46,6 +57,11 @@ 'deletes': from_rdf(_graphFromQuads2(p.delQuads)), }}) +def graphAsJson(g): + # This is not the same as g.serialize(format='json-ld')! That + # version omits literal datatypes. + return json.dumps(from_rdf(g)) + class PatchableGraph(GraphEditApi): """ Master graph that you modify with self.patch, and we get the @@ -68,6 +84,9 @@ for ob in self._observers: ob(patchAsJson(p)) + def asJsonLd(self): + return graphAsJson(self._graph) + def addObserver(self, onPatch): self._observers.append(onPatch) @@ -102,10 +121,9 @@ self.masterGraph = masterGraph def bind(self): - self.sendEvent( - message=self.masterGraph.serialize(None, format='json-ld', - indent=None), - event='fullGraph') + graphJson = self.masterGraph.asJsonLd() + log.debug("send fullGraph event: %s", graphJson) + self.sendEvent(message=graphJson, event='fullGraph') self.masterGraph.addObserver(self.onPatch) def onPatch(self, patchJson):