@@ -176,10 +176,14 @@ def _merge_threeway_graph_blobs(self, graphAOid, graphBOid, graphBaseOid):
176
176
source = rdflib .parser .create_input_source (data = graphBblob .decode ("utf-8" ))
177
177
parserGraphB .parse (source .getCharacterStream ())
178
178
179
+ nameNodeBaseMap = None
179
180
if graphBaseOid is not None :
180
181
graphBaseblob = self ._repository [graphBaseOid ].data
181
182
compGraphBase = comp_graph .ComparableGraph ()
182
- compGraphBase .parse (data = graphBaseblob .decode ("utf-8" ), format = "nt" )
183
+ parserGraphBase = ntriples .W3CNTriplesParser (ntriples .NTGraphSink (compGraphBase ))
184
+ source = rdflib .parser .create_input_source (data = graphBaseblob .decode ("utf-8" ))
185
+ parserGraphBase .parse (source .getCharacterStream ())
186
+ nameNodeBaseMap = parserGraphBase ._bnode_ids
183
187
diffA = aGraph .diff (compGraphBase )
184
188
diffB = bGraph .diff (compGraphBase )
185
189
@@ -198,7 +202,8 @@ def _merge_threeway_graph_blobs(self, graphAOid, graphBOid, graphBaseOid):
198
202
colourMap = {** (compGraphBase .getBNodeColourMap ()),
199
203
** (bGraph .getBNodeColourMap ()),
200
204
** (aGraph .getBNodeColourMap ())}
201
- colourToNameMap = self ._create_colour_to_name_map (colourMap , parserGraphA ._bnode_ids )
205
+ colourToNameMap = self ._create_colour_to_name_map (colourMap , parserGraphA ._bnode_ids ,
206
+ parserGraphB ._bnode_ids , nameNodeBaseMap )
202
207
merged = self ._serialize_triple_sets (merged , colourMap , colourToNameMap )
203
208
blob = self ._repository .create_blob (("\n " .join (merged ) + "\n " ).encode ("utf-8" ))
204
209
@@ -227,18 +232,47 @@ def _serialize_triple_sets(self, tripleSet, colourMap, colourToNameMap):
227
232
def _serialize_bNode (self , node , colourMap , colourToNameMap ):
228
233
if (isinstance (node , rdflib .BNode )):
229
234
try :
230
- return "_:{}" . format ( colourToNameMap [colourMap [node ]])
235
+ return colourToNameMap [colourMap [node ]]
231
236
except KeyError :
232
237
return node .n3 ()
233
238
else :
234
239
return node .n3 ()
235
240
236
- def _create_colour_to_name_map (self , nodeColourMap , nodeNameMap ):
241
+ def _create_colour_to_name_map (self , nodeColourMap , nameNodeMapA ,
242
+ nameNodeMapB , nameNodeMapC = None ):
237
243
colourToNameMap = {}
238
- for bNodeName in nodeNameMap :
239
- colourKey = nodeColourMap [nodeNameMap [bNodeName ]]
240
- if not colourKey in colourToNameMap or bNodeName < colourToNameMap [colourKey ]:
241
- colourToNameMap [colourKey ] = bNodeName
244
+ for bNodeName in nameNodeMapA :
245
+ colourKey = nodeColourMap [nameNodeMapA [bNodeName ]]
246
+ if colourKey not in colourToNameMap or bNodeName < colourToNameMap [colourKey ]:
247
+ colourToNameMap [colourKey ] = "_:{}" .format (bNodeName )
248
+
249
+ for bNodeName in nameNodeMapB :
250
+ bNode = nameNodeMapB [bNodeName ]
251
+ colourKey = nodeColourMap [bNode ]
252
+ # check if the first two loops already took the label
253
+ unusedCheck = bNodeName not in nameNodeMapA
254
+ if colourKey not in colourToNameMap :
255
+ if unusedCheck :
256
+ colourToNameMap [colourKey ] = "_:{}" .format (bNodeName )
257
+ else :
258
+ colourToNameMap [colourKey ] = bNode .n3 ()
259
+ if bNodeName < colourToNameMap [colourKey ] and unusedCheck :
260
+ colourToNameMap [colourKey ] = "_:{}" .format (bNodeName )
261
+
262
+ if nameNodeMapC is not None :
263
+ for bNodeName in nameNodeMapB :
264
+ bNode = nameNodeMapB [bNodeName ]
265
+ colourKey = nodeColourMap [bNode ]
266
+ # check if the first two loops already took the label
267
+ unusedCheck = bNodeName not in nameNodeMapA and bNodeName not in nameNodeMapB
268
+ if colourKey not in colourToNameMap :
269
+ if unusedCheck :
270
+ colourToNameMap [colourKey ] = "_:{}" .format (bNodeName )
271
+ else :
272
+ colourToNameMap [colourKey ] = bNode .n3 ()
273
+ if bNodeName < colourToNameMap [colourKey ] and unusedCheck :
274
+ colourToNameMap [colourKey ] = "_:{}" .format (bNodeName )
275
+
242
276
return colourToNameMap
243
277
244
278
def _merge_context_graph_blobs (self , graphAOid , graphBOid , graphBaseOid ):
@@ -256,10 +290,14 @@ def _merge_context_graph_blobs(self, graphAOid, graphBOid, graphBaseOid):
256
290
source = rdflib .parser .create_input_source (data = graphBblob .decode ("utf-8" ))
257
291
parserGraphB .parse (source .getCharacterStream ())
258
292
293
+ nameNodeBaseMap = None
259
294
if graphBaseOid is not None :
260
295
graphBaseblob = self ._repository [graphBaseOid ].data
261
296
graphBase = comp_graph .ComparableGraph ()
262
- graphBase .parse (data = graphBaseblob .decode ("utf-8" ), format = "nt" )
297
+ parserGraphBase = ntriples .W3CNTriplesParser (ntriples .NTGraphSink (graphBase ))
298
+ source = rdflib .parser .create_input_source (data = graphBaseblob .decode ("utf-8" ))
299
+ parserGraphBase .parse (source .getCharacterStream ())
300
+ nameNodeBaseMap = parserGraphBase ._bnode_ids
263
301
else :
264
302
graphBase = comp_graph .ComparableGraph ()
265
303
@@ -269,7 +307,8 @@ def _merge_context_graph_blobs(self, graphAOid, graphBOid, graphBaseOid):
269
307
colourMap = {** (graphBase .getBNodeColourMap ()),
270
308
** (graphB .getBNodeColourMap ()),
271
309
** (graphA .getBNodeColourMap ())}
272
- colourToNameMap = self ._create_colour_to_name_map (colourMap , parserGraphA ._bnode_ids )
310
+ colourToNameMap = self ._create_colour_to_name_map (colourMap , parserGraphA ._bnode_ids ,
311
+ parserGraphB ._bnode_ids , nameNodeBaseMap )
273
312
274
313
# those operations are not ready since they actually need to be done by their colour
275
314
diffANewTriples = self ._accumulate_triples (diffA [1 ]) # C+c
@@ -315,7 +354,7 @@ def conflictSet(tripleSet, conflictingNodes, colNameMap):
315
354
else :
316
355
object = triple [2 ].n3 ()
317
356
318
- cTriple = ("%s %s %s .\n " % (subject , triple [1 ], object )).rstrip ()
357
+ cTriple = ("%s %s %s .\n " % (subject , triple [1 ]. n3 () , object )).rstrip ()
319
358
if conflicted :
320
359
conflicts .add (cTriple )
321
360
else :
@@ -380,12 +419,12 @@ def _convert_colour_to_name_triple_rows(self, tripleSet, colNameMap):
380
419
result = set ()
381
420
for triple in tripleSet :
382
421
if isinstance (triple [0 ], bytes ):
383
- subject = "_:{}" . format ( colNameMap [triple [0 ]])
422
+ subject = colNameMap [triple [0 ]]
384
423
else :
385
424
subject = triple [0 ].n3 ()
386
425
387
426
if isinstance (triple [2 ], bytes ):
388
- object = "_:{}" . format ( colNameMap [triple [2 ]])
427
+ object = colNameMap [triple [2 ]]
389
428
elif isinstance (triple [2 ], rdflib .Literal ):
390
429
object = _qLiteral (triple [2 ])
391
430
else :
0 commit comments