1- import os
21import pygit2
32import rdflib
43from 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