[ 
https://issues.apache.org/jira/browse/CLEREZZA-395?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12982653#action_12982653
 ] 

Rupert Westenthaler commented on CLEREZZA-395:
----------------------------------------------

Hi Reto, all

What do you mean by "store" and "transfer"?
 (1) persistent storage (e.g. Jena TDB) and export (e.g. RDF/XML serilization), 
or also
 (2) storage and CRUD operations while working with several MGraphs on API 
Level.
I completely agree with (1) but I am unsure about (2) because I understand the 
potential danger but also used things like that for a lot of stuff in the past 
years (e.g. by using by using 
http://www.openrdf.org/doc/sesame2/api/index.html?org/openrdf/repository/util/RDFInserter.html
 that preserves BNode IDs).

Let me point out, that operations described in (2) are possible with the 
current implementation.
Here a small Example of what I refer to (written here in the TextEditor - so no 
guarantee that is would compile)

MGraph graph1 = new SimpleMGraph();
MGraph graph2 = new SimpleMGraph();
//I think it should even work with an Jena Graph because of the Bidi Map 
providing mappings for BNodes

//By being able to create a BNode without a Graph there is not something like a 
Context of an BNode
BNode rupertInfo = new BNode();
BNode retoInfo = new BNode();
UriRef name = new UriRef(FOAF+"name");
UriRef knows = new UriRef(FOAF+"knows");

//add operations do not create new instances of BNode ... so there is still no 
context
graph1.add(new TripleImpl(rupertInfo;name,new PlainLiteral("Rupert 
Westenthaler"));
graph1.add(new TripleImpl(rupertInfo;knows, retoInfo));

graph2.add(new TripleImpl(reto;name,new PlainLiteral("Reto Bachmann-Gmur"));
//"rupertInfo" is now in two graphs (2 contexts?)
graph2.add(new TripleImpl(reto;knows;rupertInfo);

//So now lets have some fun with the BNodes
//search for all knows in graph1 -> OK (because within the same context)
Iterator<Triple> rupertsFriends = graph1.filter(rupertInfo,knows,null);
//query for all information of the results (BNodes) in graph2 -> NOT OK?!
while(rupertsFriends.hasNext()){
  Resource friendBNode = rupertsFriends.getObject();
  Iterator<Triple> friendInfos = graph2.filter(friendBNode,null,null)
  //add them to the BNode in graph1 -> NOT OK?!
  while(friendInfos.hasNext()){
    graph1.add(friendInfos.next); //OK this would not work because it changes 
graph1 within the Iteration over rupertsFriends, but it shows the principle
  }
}

This works because
 - BNode does not override equals and the equals implementation of 
java.lang.Objects checks for reference
 - one instance of an BNode is shared between the two Graphs
 - the performAdd Method (at least from SimpleTripleCollection) does not create 
new instances for added BNodes
So if it is the goal to completely avoid sharing of BNodes between Graph 
instances one would need to change the current implementation.

In conclusion I would like to point out that adding an ID to BNode - as 
suggested in my first comment - would not change anything out of a technical 
perspective. However I clearly understand that adding a Constructor like 
BNode(String bNodeID) to the public API would encourage wrong usage of BNodes 
by users which might cause a lot of troubles if they are not aware of the 
consequences.

best
Rupert Westenthaler 

> bnodes mapping in JenaGraphAdaptor should not keep growing with every parsing 
> of rdf files
> ------------------------------------------------------------------------------------------
>
>                 Key: CLEREZZA-395
>                 URL: https://issues.apache.org/jira/browse/CLEREZZA-395
>             Project: Clerezza
>          Issue Type: Improvement
>            Reporter: Hasan
>            Assignee: Hasan
>
> With every parsing of rdf files free memory is getting less.
> The problem seems to lie in the JenaGraphAdaptor class
> It has a member:
> final BidiMap<BNode, Node> tria2JenaBNodes = new BidiMapImpl<BNode, Node>();
> which grows each time a serialized graph get parsed.
> My experiments with my test data show
> At the end of the 1st parsing: Size of tria2JenaBNodes = 87200
> At the end of the 2nd parsing: Size of tria2JenaBNodes = 130800
> At the end of the 3rd parsing: Size of tria2JenaBNodes = 174400

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to