Skip to content

Commit 95a068c

Browse files
committed
first three-way merge with atomic-graphs
1 parent 4061dc4 commit 95a068c

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

quit/merge.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import os
21
import pygit2
32
import rdflib
43
from atomicgraphs import comp_graph
@@ -168,11 +167,12 @@ def _merge_threeway_graph_blobs(self, graphAOid, graphBOid, graphBaseOid):
168167
graphAblob = self._repository[graphAOid].data
169168
aGraph = rdflib.Graph().parse(data=graphAblob.decode("utf-8"), format="nt")
170169

171-
if str(graphBOid) == pygit2.GIT_OID_HEX_ZERO:
172-
bGraph = rdflib.Graph()
173-
else:
170+
bGraph = rdflib.Graph()
171+
parserGraphB = parsers.ntriples.W3CNTriplesParser(parsers.ntriples.NTGraphSink(bGraph))
172+
if not str(graphBOid) == pygit2.GIT_OID_HEX_ZERO:
174173
graphBblob = self._repository[graphBOid].data
175-
bGraph = rdflib.Graph().parse(data=graphBblob.decode("utf-8"), format="nt")
174+
source = rdflib.parser.create_input_source(data=graphBblob.decode("utf-8"))
175+
parserGraphB.parse(source.getCharacterStream())
176176

177177
if graphBaseOid is not None:
178178
graphBaseblob = self._repository[graphBaseOid].data
@@ -188,20 +188,18 @@ def _merge_threeway_graph_blobs(self, graphAOid, graphBOid, graphBaseOid):
188188
diffARemovedTriples = self._accumulate_triples(diffA[0])
189189
diffBRemovedTriples = self._accumulate_triples(diffB[0])
190190
baseTriples = self._get_triples(compGraphBase)
191-
merged = (baseTriples - diffARemovedTriples - diffBRemovedTriples +
192-
diffANewTriples + diffBNewTriples)
193-
serializer = parsers.ntriples.NTriplesParser(parsers.nt.NTSink(aGraph))
194-
merged = self._serialize_triple_sets(merged, serializer._bnode_ids)
191+
merged = (baseTriples - diffARemovedTriples - diffBRemovedTriples |
192+
diffANewTriples | diffBNewTriples)
195193
else:
196194
compGraphA = comp_graph.ComparableGraph(aGraph.store, bGraph.identifier)
197195
compGraphB = comp_graph.ComparableGraph(bGraph.store, bGraph.identifier)
198196
diff = compGraphA.diff(compGraphB)
199197
merged = self._get_triples(compGraphA)
200198
merged = merged.union(self._accumulate_triples(diff[0]))
201-
serializer = parsers.ntriples.NTriplesParser(parsers.nt.NTSink(aGraph))
202-
merged = self._serialize_triple_sets(merged, serializer._bnode_ids)
203-
print("\n".join(merged))
204-
199+
bNodeNameMap = {}
200+
for bNodeName in parserGraphB._bnode_ids:
201+
bNodeNameMap[parserGraphB._bnode_ids[bNodeName]] = bNodeName
202+
merged = self._serialize_triple_sets(merged, bNodeNameMap)
205203
blob = self._repository.create_blob(("\n".join(merged) + "\n").encode("utf-8"))
206204
return blob
207205

@@ -214,17 +212,20 @@ def _accumulate_triples(self, setOfGraphs):
214212
def _get_triples(self, graph):
215213
return set(graph.triples((None, None, None)))
216214

217-
def _serialize_triple_sets(self, set, bIdMap):
215+
def _serialize_triple_sets(self, tripleSet, bIdMap):
218216
result = set()
219-
for triple in set:
217+
for triple in tripleSet:
220218
result.add("{} {} {} .".format(self._serialize_bNode(triple[0], bIdMap),
221219
triple[1].n3(),
222220
self._serialize_bNode(triple[2], bIdMap)))
223221
return sorted(result)
224222

225223
def _serialize_bNode(self, node, bIdMap):
226224
if(isinstance(node, rdflib.BNode)):
227-
return "_:{}".format(bIdMap[node])
225+
try:
226+
return "_:{}".format(bIdMap[node])
227+
except KeyError:
228+
return node.n3()
228229
else:
229230
return node.n3()
230231

0 commit comments

Comments
 (0)