Re: [Neo4j] storing long values overflow
Hi Niels, this is now fixed. Thanks for the test case. 2011/6/17 Mattias Persson matt...@neotechnology.com I'm on this one, since I'm assuming I'm the one introducing it. And yes there are some tests around this that I wrote for these changes... apparently now good enough. 2011/6/17 Jim Webber j...@neotechnology.com Michael, No we don't. Do you want to put together a test of {normal, edge positive, edge negative} case (where applicable) for each type we support in the kernel tests? D'oh. Jim On 16 Jun 2011, at 23:14, Michael Hunger wrote: Damn, do we have tests for storing values and retrieving them. Anfang der weitergeleiteten E-Mail: Von: Niels Hoogeveen pd_aficion...@hotmail.com Datum: 16. Juni 2011 23:52:50 MESZ An: user@lists.neo4j.org Betreff: Re: [Neo4j] storing long values overflow Antwort an: Neo4j user discussions user@lists.neo4j.org I just tested the long property overflow behaviour against different neo4j 1.4 releases and found out it was introduced between M03 and M04. M03 correctly returns -134217729 when storing a property with value -134217729l.M04 and SNAPSHOT return 134217727 when storing a property with value -134217729l. Niels From: pd_aficion...@hotmail.com To: user@lists.neo4j.org Date: Thu, 16 Jun 2011 23:21:54 +0200 Subject: Re: [Neo4j] storing long values overflow Thank Marco, Hope this looks better. import org.neo4j.kernel.EmbeddedGraphDatabase;import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.Node; public class Test2 { public static void main(String args[]){ GraphDatabaseService db = new EmbeddedGraphDatabase(var/db); Transaction tx = db.beginTx(); try{ Node n = db.getReferenceNode(); long l = -134217728l; n.setProperty(testvalue, l); System.out.println(n.getProperty(testvalue)); long l2 = -134217729l; n.setProperty(testvalue2, l2); System.out.println(n.getProperty(testvalue2)); tx.success(); }finally{ tx.finish(); } } } From: okramma...@gmail.com Date: Thu, 16 Jun 2011 15:06:23 -0600 To: user@lists.neo4j.org Subject: Re: [Neo4j] storing long values overflow Hi, Try using: http://paste.pocoo.org/ Great for sending color formatted code snippets. Marko. http://markorodriguez.com On Jun 16, 2011, at 2:48 PM, Niels Hoogeveen wrote: Don't know how to send a properly formatted email. Anyway, when storing a long value -134217728l in a node property, retrieving the value of the property is again -134217728. When storing a long value -134217729l in a node property, retrieving the value of that property overflows and 134217727 is returned. Kind regards,Niels Hoogeveen From: pd_aficion...@hotmail.com To: user@lists.neo4j.org Date: Thu, 16 Jun 2011 22:40:24 +0200 Subject: [Neo4j] storing long values overflow Using neo4j 1.4-SNAPSHOT it seems the storage or retrieval of long values no longer works properly.package com.multispective.snippet;import org.neo4j.kernel.EmbeddedGraphDatabase;import org.neo4j.graphdb.GraphDatabaseService;import org.neo4j.graphdb.Transaction;import org.neo4j.graphdb.Node;public class Test2 { public static void main(String args[]){ GraphDatabaseService db = new EmbeddedGraphDatabase(var/db); Transaction tx = db.beginTx(); try{Node n = db.getReferenceNode(); long l = -134217728l; n.setProperty(testvalue, l); System.out.println(n.getProperty(testvalue)); long l2 = -134217729l; n.setProperty(testvalue2, l2); System.out.println(n.getProperty(testvalue2)); tx.success(); }finally{ tx.finish(); } }}Result:-134217728134217727Kind regards,Niels Hoogeveen ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo
Re: [Neo4j] Change in behavior for QueryContext with IndexNode ?
Hi Kalin, I'll have a look at it right now 2011/6/17 Kalin Wilson Development d...@kalinwilson.com Perhaps this is fixed in the latest milestone release, I haven't had a chance to test it yet. I upgraded from 1.3M03 to 1.4M03 and found that my code that queried node indexes using a QueryContext was throwing a NPE. In my code I constructed a string similar to eclass:org.spp.data.Something AND eid:101 and constructed the QueryContext from that. The QueryContext object was then passed to an index.query() method. Once I found that the NPE was being thrown by index.query(QueryContext), I put together a simple test that created and indexed a Node then queried the index using a QueryContext using various constructs, QueryContext(key:value key:value).defaultOperator(Operator.AND) and QueryContext(key:value AND key:value). Passing either version of these objects to index.query() throws a NPE, however calling index.query(key:value AND key:value) works and calling index.query(qc.getQueryOrQueryObject()) works (at least when the full string with operators is used to build the QC). Has there been a change in how or when to use a QueryContext? Perhaps I'm using it incorrectly now. Thanks, Kalin ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Change in behavior for QueryContext with IndexNode ?
I cannot reproduce this. I'm trying it with this code: // I also tried with FULLTEXT_CONFIG IndexNode index = graphDb.index().forNodes( qc, LuceneIndexImplementation.EXACT_CONFIG ); Node node = graphDb.createNode(); index.add( node, key, value ); index.query( new QueryContext( key:value AND key:value ) ); index.query( new QueryContext( key:value key:value ).defaultOperator( Operator.AND ) ); restartTx(); index.query( new QueryContext( key:value AND key:value ) ); index.query( new QueryContext( key:value key:value ).defaultOperator( Operator.AND ) ); it doesn't throw any NPE. 2011/6/17 Mattias Persson matt...@neotechnology.com Hi Kalin, I'll have a look at it right now 2011/6/17 Kalin Wilson Development d...@kalinwilson.com Perhaps this is fixed in the latest milestone release, I haven't had a chance to test it yet. I upgraded from 1.3M03 to 1.4M03 and found that my code that queried node indexes using a QueryContext was throwing a NPE. In my code I constructed a string similar to eclass:org.spp.data.Something AND eid:101 and constructed the QueryContext from that. The QueryContext object was then passed to an index.query() method. Once I found that the NPE was being thrown by index.query(QueryContext), I put together a simple test that created and indexed a Node then queried the index using a QueryContext using various constructs, QueryContext(key:value key:value).defaultOperator(Operator.AND) and QueryContext(key:value AND key:value). Passing either version of these objects to index.query() throws a NPE, however calling index.query(key:value AND key:value) works and calling index.query(qc.getQueryOrQueryObject()) works (at least when the full string with operators is used to build the QC). Has there been a change in how or when to use a QueryContext? Perhaps I'm using it incorrectly now. Thanks, Kalin ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] ClosedChannelExceptions in highly concurrent environment
Great. Will merge that patch into trunk as soon as possible. -Johan On Thu, Jun 16, 2011 at 10:21 PM, Jennifer Hickey jhic...@vmware.com wrote: Hi Johan, Sorry for the delay. I was finally able to try out that patch (against 1.3) on our test environment, and things are running smoothly. I have not seen the ClosedChannelException (or any others) once in 24 hours. Previously on the same system I saw it frequently, as early as 15 minutes into the uptime. Thanks! Jennifer From: user-boun...@lists.neo4j.org [user-boun...@lists.neo4j.org] On Behalf Of Johan Svensson [jo...@neotechnology.com] Sent: Thursday, May 26, 2011 3:09 AM To: Neo4j user discussions Subject: Re: [Neo4j] ClosedChannelExceptions in highly concurrent environment Hi Jennifier, Could you apply this patch to the kernel and then see if the problem still exists? If you want I can send you a jar but then I need to know what version of Neo4j you are using. Regards, Johan On Mon, May 23, 2011 at 6:50 PM, Jennifer Hickey jhic...@vmware.com wrote: Hi Tobias, Looks like the environment is still setup, so I should be able to attempt a repro with a patched version. Let me know what you would like me to use. Thanks, Jennifer From: user-boun...@lists.neo4j.org [user-boun...@lists.neo4j.org] On Behalf Of Tobias Ivarsson [tobias.ivars...@neotechnology.com] Sent: Monday, May 16, 2011 11:01 PM To: Neo4j user discussions Subject: Re: [Neo4j] ClosedChannelExceptions in highly concurrent environment Hi Jennifer, Could you reproduce it on your side by doing the same kind of systems tests again? If you could then I'd be very happy if you could try a patched version that we have been working on and see if that fixes the issue. Cheers, Tobias On Tue, May 17, 2011 at 2:49 AM, Jennifer Hickey jhic...@vmware.com wrote: Hi Tobias, Unfortunately I don't have an isolated test case, as I was doing a fairly involved system test at the time. I may be able to have a colleague work on reproducing it at a later date (I've been diverted to something else for the moment). I was remote debugging with Eclipse, so I toggled a method breakpoint on Thread.interrupt() and then inspected the stack once the breakpoint was hit. Sorry I don't have more information at the moment. I agree that eliminating the interrupts sounds like the best approach, if possible. Thanks, Jennifer From: user-boun...@lists.neo4j.org [user-boun...@lists.neo4j.org] On Behalf Of Tobias Ivarsson [tobias.ivars...@neotechnology.com] Sent: Thursday, April 28, 2011 6:23 AM To: Neo4j user discussions Subject: Re: [Neo4j] ClosedChannelExceptions in highly concurrent environment Hi Jennifer, I'd first like to thank you for the testing and analysis you've done. Very useful stuff. Do you think you could send some test code our way that reproduces this issue? This is actually the first time this issue has been reported, so I wouldn't say it is a common issue. My guess is that your thread volume triggered a rare condition that wouldn't be encountered otherwise. I'm also curious to know how you found the source of the interruptions. When I debug thread interruptions I've never been able to find out where the thread got interrupted from without doing tedious procedures of breakpoint + logging + trying to match thread ids. If you have a better method for doing that I'd very much like to know. I think we should focus the effort on fixing the interruption issue if we can. And I believe we would be able to do that if the interruptions do in fact originate from where you say they do. But the suggestion of being able to switch the lucene directory implementation is still interesting, but as you point out since it has issues on some platforms it would be better if we could be rid of the interruption issue. Cheers, Tobias On Thu, Apr 28, 2011 at 12:41 AM, Jennifer Hickey jhic...@vmware.com wrote: Hello, I've been running some tests w/approx 400 threads reading various indexed property values. I'm running on 64 bit Linux. I was frequently seeing the ClosedChannelException below. The javadoc on Lucene's NIOFSDirectory states that Accessing this class either directly or indirectly from a thread while it's interrupted can close the underlying file descriptor immediately if at the same time the thread is blocked on IO. The file descriptor will remain closed and subsequent access to {@link NIOFSDirectory} will throw a {@link ClosedChannelException}. If your application uses either {@link Thread#interrupt()} or {@link Future#cancel(boolean)} you should use {@link SimpleFSDirectory} in favor of {@link NIOFSDirectory}. A bit of debugging revealed that the Thread.interrupts were coming from Neo4j, specifically in RWLock and MappedPersistenceWindow. So it seems like
[Neo4j] Find 2nd degree friends in order of mutual friend
Hi all, I am new to neo4j and excited to know more about graph database. First of all, could anyone please help me to figure out the documentation about the query or rest client? Then, back to my question, I want to find 2nd degree friends but ordered by number of mutual friend. I understand that if I have all data in memory, I could've traverse the graph to 2nd level, and keep counter for each nodes in 2nd level. So in away its like finding all paths from start node to all second degree friend, but if we do that, it would be inefficient. Does anyone have any idea how to do this with neo4j? Thank you, Fajarmf ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Traversals versus Indexing
getNodeById is fast/immediate 2011/6/16 Aseem Kishore aseem.kish...@gmail.com Indeed getNodeById(). Aseem On Thu, Jun 16, 2011 at 10:11 AM, Mattias Persson matt...@neotechnology.com wrote: Are you thinking of GraphDatabaseService#getNodeById / #getRelationshipById ? Or index lookups? 2011/6/16 Aseem Kishore aseem.kish...@gmail.com Are lookups by ID also so much slower than traversals? Aseem On Thu, Jun 16, 2011 at 3:45 AM, Mattias Persson matt...@neotechnology.comwrote: I don't know your use case at all, but one of the benefits you get with traversing compared to index lookups is that one hop from a node to another is instantaneous ( 1 million hops / second on a fully cached graph), whereas index lookups are several order of magnitudes slower than that. But index lookups are good for when you f.ex. have thousands/millions of names and you'd like to get the node with a certain name. Then that would be your starting point for doing a traversal to find other information local to that node, or in its vicinity. 2011/6/13 Aman aman.6...@gmail.com What is faster - Traversals or Indexing? I mean if one has a database model that can offer a choice between the two, what should one choose? Also, what about when the scalability factor comes in? ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Find 2nd degree friends in order of mutual friend
Hi Fajar, this is a depth 2 traversal from the person in question. While exhaustively traversing his friends, you increase the group count as for each FOAF you get on the second step. However, we have seen edge cases with supernodes where in a social network, persons can have 50K friends. There, you might use heuristics or indexing approaches to make this very fast. If you have some more details, I could write down the query in Gremlin or Cypher (http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html), but in principle, it would be like https://github.com/tinkerpop/gremlin/wiki (actually using 3 steps, I think we could get it down to 2) for Gremlin. In neo4j, if things are not cached, only the parts the data that are needed for this traversal wil be loaded from disk, so you don't need to hold all the graph in cache for this, since it is a data-local operation. HTH Cheers, /peter neubauer GTalk: neubauer.peter Skype peter.neubauer Phone +46 704 106975 LinkedIn http://www.linkedin.com/in/neubauer Twitter http://twitter.com/peterneubauer http://www.neo4j.org - Your high performance graph database. http://startupbootcamp.org/ - Öresund - Innovation happens HERE. http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. On Fri, Jun 17, 2011 at 1:33 PM, Fajar Maulana Firdaus faja...@gmail.com wrote: Hi all, I am new to neo4j and excited to know more about graph database. First of all, could anyone please help me to figure out the documentation about the query or rest client? Then, back to my question, I want to find 2nd degree friends but ordered by number of mutual friend. I understand that if I have all data in memory, I could've traverse the graph to 2nd level, and keep counter for each nodes in 2nd level. So in away its like finding all paths from start node to all second degree friend, but if we do that, it would be inefficient. Does anyone have any idea how to do this with neo4j? Thank you, Fajarmf ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] storing long values overflow
Hi Mattias, You're welcome. It actually helped me gain insight in the workings of the in-graph Timeline component, since that started to behave eratically (having later entries appearing as previous entries). It took some time before I realized the problem was in kernel and not in Timeline. Altogether a valuable excercise. :-) For now I will stick to M.03, but will test against SNAPSHOT next week. Have you updated M.04 as it is available for download? Niels Date: Fri, 17 Jun 2011 09:23:03 +0200 From: matt...@neotechnology.com To: user@lists.neo4j.org Subject: Re: [Neo4j] storing long values overflow Hi Niels, this is now fixed. Thanks for the test case. 2011/6/17 Mattias Persson matt...@neotechnology.com I'm on this one, since I'm assuming I'm the one introducing it. And yes there are some tests around this that I wrote for these changes... apparently now good enough. 2011/6/17 Jim Webber j...@neotechnology.com Michael, No we don't. Do you want to put together a test of {normal, edge positive, edge negative} case (where applicable) for each type we support in the kernel tests? D'oh. Jim On 16 Jun 2011, at 23:14, Michael Hunger wrote: Damn, do we have tests for storing values and retrieving them. Anfang der weitergeleiteten E-Mail: Von: Niels Hoogeveen pd_aficion...@hotmail.com Datum: 16. Juni 2011 23:52:50 MESZ An: user@lists.neo4j.org Betreff: Re: [Neo4j] storing long values overflow Antwort an: Neo4j user discussions user@lists.neo4j.org I just tested the long property overflow behaviour against different neo4j 1.4 releases and found out it was introduced between M03 and M04. M03 correctly returns -134217729 when storing a property with value -134217729l.M04 and SNAPSHOT return 134217727 when storing a property with value -134217729l. Niels From: pd_aficion...@hotmail.com To: user@lists.neo4j.org Date: Thu, 16 Jun 2011 23:21:54 +0200 Subject: Re: [Neo4j] storing long values overflow Thank Marco, Hope this looks better. import org.neo4j.kernel.EmbeddedGraphDatabase;import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.Node; public class Test2 { public static void main(String args[]){ GraphDatabaseService db = new EmbeddedGraphDatabase(var/db); Transaction tx = db.beginTx(); try{ Node n = db.getReferenceNode(); long l = -134217728l; n.setProperty(testvalue, l); System.out.println(n.getProperty(testvalue)); long l2 = -134217729l; n.setProperty(testvalue2, l2); System.out.println(n.getProperty(testvalue2)); tx.success(); }finally{ tx.finish(); } } } From: okramma...@gmail.com Date: Thu, 16 Jun 2011 15:06:23 -0600 To: user@lists.neo4j.org Subject: Re: [Neo4j] storing long values overflow Hi, Try using: http://paste.pocoo.org/ Great for sending color formatted code snippets. Marko. http://markorodriguez.com On Jun 16, 2011, at 2:48 PM, Niels Hoogeveen wrote: Don't know how to send a properly formatted email. Anyway, when storing a long value -134217728l in a node property, retrieving the value of the property is again -134217728. When storing a long value -134217729l in a node property, retrieving the value of that property overflows and 134217727 is returned. Kind regards,Niels Hoogeveen From: pd_aficion...@hotmail.com To: user@lists.neo4j.org Date: Thu, 16 Jun 2011 22:40:24 +0200 Subject: [Neo4j] storing long values overflow Using neo4j 1.4-SNAPSHOT it seems the storage or retrieval of long values no longer works properly.package com.multispective.snippet;import org.neo4j.kernel.EmbeddedGraphDatabase;import org.neo4j.graphdb.GraphDatabaseService;import org.neo4j.graphdb.Transaction;import org.neo4j.graphdb.Node;public class Test2 { public static void main(String args[]){ GraphDatabaseService db = new EmbeddedGraphDatabase(var/db); Transaction tx = db.beginTx(); try{Node n = db.getReferenceNode(); long l = -134217728l; n.setProperty(testvalue, l); System.out.println(n.getProperty(testvalue)); long l2 = -134217729l; n.setProperty(testvalue2, l2); System.out.println(n.getProperty(testvalue2)); tx.success(); }finally{ tx.finish(); } }}Result:-134217728134217727Kind regards,Niels Hoogeveen ___ Neo4j mailing list User@lists.neo4j.org
[Neo4j] Node[] or Relationship[] as properties
I think it could be very useful to add these types as possible property values Node or Node[] Relationship or Relationship[] This is useful to implement more complex graphs. For instance, security roles: I can define a security role as a node and users nodes can HAVE a relationship to that role. The use case is when that role is related to something, for instance a project. Let's have there are 4 standard roles for each project, and 1000 projects. Currently I would need 4000 effective roles to be related to users or only 4 roles but relationships between users and roles have a property with the project that relationship is related to. The 4000 roles solution is bad for management: every time a role is modified 1000 modifications must be done. The projectname-as-a-property solution doesn't enable easy navigation. A more elegant solution is to add a property to the user--role relationship: the related to project node. If Node is allowed, better if Node[] are allowed too. And maybe there are also use cases for Relationship and Relationship[] as property value. Aniceto ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Node[] or Relationship[] as properties
I think some further understanding of Neo4J and graph databases would help: Node == precisely what a single relationship from a node accomplishes Node[] == precisely what multiple relationships from a node accomplishes -Original Message- From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org] On Behalf Of Aniceto Perez Sent: Friday, June 17, 2011 8:19 AM To: user@lists.neo4j.org Subject: [Neo4j] Node[] or Relationship[] as properties I think it could be very useful to add these types as possible property values Node or Node[] Relationship or Relationship[] This is useful to implement more complex graphs. For instance, security roles: I can define a security role as a node and users nodes can HAVE a relationship to that role. The use case is when that role is related to something, for instance a project. Let's have there are 4 standard roles for each project, and 1000 projects. Currently I would need 4000 effective roles to be related to users or only 4 roles but relationships between users and roles have a property with the project that relationship is related to. The 4000 roles solution is bad for management: every time a role is modified 1000 modifications must be done. The projectname-as-a-property solution doesn't enable easy navigation. A more elegant solution is to add a property to the user--role relationship: the related to project node. If Node is allowed, better if Node[] are allowed too. And maybe there are also use cases for Relationship and Relationship[] as property value. Aniceto ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
[Neo4j] Parallelism
Hi, is it possible to traverse on a Neo4J graph DB using the Java API in parallel threads? Is this possible within one transaction or does every thread has to use its own transaction? Is the API thread-safe concerning read-only access? Is there any advantage of concerning parallelism when using Neo4j as an embedded DB? Best regards ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
[Neo4j] all values of a key-object pair
I have run into the situation where I want to add key value pairs to the Lucene index, where I have no need to store the value in a property, but I would like to know which values are stored in the Lucene index for a given key-object pair. Use case: Loading Dbpedia in Neo4J, I load all entities and all redirects. Every entity has a unique URL, as does every redirect. URL's are stored in Lucene to look up the node that corresponds to an entity. I have no need to store redirects, neither as node nor as a String array property (one entity can have more than one redirect), instead I want to store the redirect URL in the Lucene index, pointing to the associated entity node. In certain cases, however, I would like to know the redirect URL's associated with a certain entity. So I would like to be able to retrieve the values stored in the Lucene index for a given key-object pair. Is this possible? If not with the current setup, would it be possible to add such functionality? Kind re gards,Niels Hoogeveen ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] all values of a key-object pair
Hi, Niels. Mattias just responded yesterday to me on a similar question. See below: Rick == Hi Rick, you could probably get the keys from the IndexReader, like so: // I'm in LuceneIndex now public IterableString getKeys() { IndexSearcherRef searcher = service.dataSource().getIndexSearcher( identifier, true ); try { IndexReader reader = searcher.getSearcher().getIndexReader(); CollectionString fieldNames = reader.getFieldNames( FieldOption.ALL ); // Make a copy since we don't know if the result is final or not CollectionString result = new ArrayListString( fieldNames ); result.remove( KEY_DOC_ID ); result.remove( KEY_START_NODE_ID ); result.remove( KEY_END_NODE_ID ); return result; } finally { searcher.closeStrict(); } } This is a perhaps bit crude implementation and will only work on committed stuff, not any transactional state. This is a start at least. public IterableString getValues( String key ) { IndexSearcherRef searcher = service.dataSource().getIndexSearcher( identifier, true ); try { IndexReader reader = searcher.getSearcher().getIndexReader(); CollectionString result = new ArrayListString(); TermEnum terms = reader.terms( new Term( key ) ); do { result.add( terms.term().text() ); } while ( terms.next() ); return result; } catch ( IOException e ) { throw new RuntimeException( e ); } finally { searcher.closeStrict(); } } Suffers from the same problem of transactional state and also doesn't consider that values could be other types, f.ex. integers where the string is a weird encoding of such a value. -Original Message- From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org] On Behalf Of Niels Hoogeveen Sent: Friday, June 17, 2011 8:30 AM To: user@lists.neo4j.org Subject: [Neo4j] all values of a key-object pair I have run into the situation where I want to add key value pairs to the Lucene index, where I have no need to store the value in a property, but I would like to know which values are stored in the Lucene index for a given key-object pair. Use case: Loading Dbpedia in Neo4J, I load all entities and all redirects. Every entity has a unique URL, as does every redirect. URL's are stored in Lucene to look up the node that corresponds to an entity. I have no need to store redirects, neither as node nor as a String array property (one entity can have more than one redirect), instead I want to store the redirect URL in the Lucene index, pointing to the associated entity node. In certain cases, however, I would like to know the redirect URL's associated with a certain entity. So I would like to be able to retrieve the values stored in the Lucene index for a given key-object pair. Is this possible? If not with the current setup, would it be possible to add such functionality? Kind re gards,Niels Hoogeveen ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] all values of a key-object pair
Thanks Rick, I will try out this code. For my use case, I don't mind the lack of transactional state, though I can imagine there to be use cases where having access to transactional state is requred. It would be nice if this somehow would become part of the standard Neo4j API. Niels From: rick.bullo...@thingworx.com To: user@lists.neo4j.org Date: Fri, 17 Jun 2011 05:34:05 -0700 Subject: Re: [Neo4j] all values of a key-object pair Hi, Niels. Mattias just responded yesterday to me on a similar question. See below: Rick == Hi Rick, you could probably get the keys from the IndexReader, like so: // I'm in LuceneIndex now public IterableString getKeys() { IndexSearcherRef searcher = service.dataSource().getIndexSearcher( identifier, true ); try { IndexReader reader = searcher.getSearcher().getIndexReader(); CollectionString fieldNames = reader.getFieldNames( FieldOption.ALL ); // Make a copy since we don't know if the result is final or not CollectionString result = new ArrayListString( fieldNames ); result.remove( KEY_DOC_ID ); result.remove( KEY_START_NODE_ID ); result.remove( KEY_END_NODE_ID ); return result; } finally { searcher.closeStrict(); } } This is a perhaps bit crude implementation and will only work on committed stuff, not any transactional state. This is a start at least. public IterableString getValues( String key ) { IndexSearcherRef searcher = service.dataSource().getIndexSearcher( identifier, true ); try { IndexReader reader = searcher.getSearcher().getIndexReader(); CollectionString result = new ArrayListString(); TermEnum terms = reader.terms( new Term( key ) ); do { result.add( terms.term().text() ); } while ( terms.next() ); return result; } catch ( IOException e ) { throw new RuntimeException( e ); } finally { searcher.closeStrict(); } } Suffers from the same problem of transactional state and also doesn't consider that values could be other types, f.ex. integers where the string is a weird encoding of such a value. -Original Message- From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org] On Behalf Of Niels Hoogeveen Sent: Friday, June 17, 2011 8:30 AM To: user@lists.neo4j.org Subject: [Neo4j] all values of a key-object pair I have run into the situation where I want to add key value pairs to the Lucene index, where I have no need to store the value in a property, but I would like to know which values are stored in the Lucene index for a given key-object pair. Use case: Loading Dbpedia in Neo4J, I load all entities and all redirects. Every entity has a unique URL, as does every redirect. URL's are stored in Lucene to look up the node that corresponds to an entity. I have no need to store redirects, neither as node nor as a String array property (one entity can have more than one redirect), instead I want to store the redirect URL in the Lucene index, pointing to the associated entity node. In certain cases, however, I would like to know the redirect URL's associated with a certain entity. So I would like to be able to retrieve the values stored in the Lucene index for a given key-object pair. Is this possible? If not with the current setup, would it be possible to add such functionality? Kind re gards,Niels Hoogeveen ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Parallelism
Hi, That is possible (and even recommended). The Java API is thread safe (with the exception of batch inserter) both for reads and writes. Each thread may use its own transaction but it is not required to have a transaction when performing read operations (only for writes). Reading is lock free and will always read the last committed value. A multi core CPU is required to let the threads execute in parallel with the advantage of scaling reads with the available number of cores. It is not possible to have a transaction associated with more than one thread at a time (but you can suspend a transaction and resume it in another thread if needed). Regards, Johan On Fri, Jun 17, 2011 at 2:23 PM, Norbert Tausch w...@ntausch.de wrote: Hi, is it possible to traverse on a Neo4J graph DB using the Java API in parallel threads? Is this possible within one transaction or does every thread has to use its own transaction? Is the API thread-safe concerning read-only access? Is there any advantage of concerning parallelism when using Neo4j as an embedded DB? Best regards ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Spring Data Graph 1.1.0.M1 milestone released
Thanks a lot. On Thu, Jun 16, 2011 at 3:20 PM, Michael Hunger michael.hun...@neotechnology.com wrote: You could just use the direct repository factory for that. directGraphRepositoryFactory.createGraphRepository(clazz).findAll() normally you would have a interface PersonRepository extends GraphRepositoryPerson {} yep. that looks like a good solution. My use case is a bit special - ie I have a a lot of classes and having repos for each would be a waste. But again that's because we're using this technology in a weird way (20 domain classes) On the other hand - graph db is probably the best option for us, as having 20 tables instead would make it a nightmare. So in a way it really supports the case for neo4j, although such application is really a niche one. and get this injected. @Autowired PersonRepository personRepository; personRepository.findAll(); Cheers Michael Today I discussed some nice derived-method for cypher queries. See: https://github.com/SpringSource/spring-data-graph/wiki/Repository-query-methods Am 16.06.2011 um 14:30 schrieb Alfredas Chmieliauskas: Dear Michael, sounds great! Especially the annotated repository methods. That was something *really* desirable and now its there. Fantastischt! One question though. Before the upgrade i used to have a handy method to find all things of a type (Class) by using a method like public T extends NodeBacked IterableT findAll(ClassT clazz) { finderFactory.createNodeEntityFinder(clazz).findAll(); } is there a good way to replicate such functionality in the current release? Alfredas P.S. we're delayed with publishing our energy simulations (bureaucracy problems more than technical or conceptual). but i'm still determined to make it happen (publish the thing online) before summer end. On Wed, Jun 15, 2011 at 10:17 AM, Michael Hunger michael.hun...@neotechnology.com wrote: Dear Graphistas, After some quiet time that I spend on other important issues, we're back on our regular release cycle/rhythm. We discussed the future SDG roadmap with our CEO Emil and decided to work first on the issues that were reported by our users here on the mailing list, on the spring forums and on twitter. So primarily we updated the dependencies to Neo4j 1.4.M04 and AspectJ (1.6.12.M1), the latter fixing some issues. With the new Neo4j release we are also able to start working some important new features. The most interesting one is the adoption of the query language cypher which is now accessible from NodeEntities (dynamic annotated fields, introduced methods) and repositories (annotated repository interface methods). (https://jira.springsource.org/browse/DATAGRAPH-91) Example, NodeEntity-field: @GraphQuery(start me=(%d) match (me)-[:works_at]-(company)-[:works_at]-(colleague) return colleague) IterablePerson colleagues; Example, Repository: interface PersonRepository extends GraphRepositoryPerson { @GraphQuery(start person=(%d) match (person)-[:boss]-(boss) return boss) Person findBoss(Person developer); } We also accommodate for the change of allowing self-relationships. Another annoyance for SDG users - the need to specify an elementClass on @RelatedTo annotations has also been removed this change will also be added to the other annotations that we use. We would like to get your feedback on those changes and also on Spring Data Graph in general, so please check it out and get back to us. And please spread the word: http://twitter.com/#!/neo4j/statuses/80503228319547392 Cheers Michael Announcement: http://www.springsource.org/node/3152 JIRA: https://jira.springsource.org/browse/DATAGRAPH Project Page: http://www.springsource.org/spring-data/neo4j Forum: forum.springsource.org/forumdisplay.php?f=80 Github: http://github.com/springsource/spring-data-graph Download: http://www.springsource.com/download/community?project=Spring%20Data%20Neo4j ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Parallelism
Hi, Keep in mind that Neo4j is a fully ACID database. As such, it is safe to use in the same manner as any other ACID database, since it makes use of locking over primitives, deadlock detection, isolation between transactions etc. Having said that: Yes, the API Neo4j exposes is suitable for manipulation by concurrently running threads. Each thread will run in its own transaction - the XA standard that Neo4j implements enforces a 1-1 correspondence between transaction context and thread. Yes, the API is thread safe. Of course, objects that maintain state, such as Iterators, are still not safe to publish outside the thread. The advantage of having multiple threads is dependent on your use case. If you have lots of I/O blocking operations, read-only threads that work with the memory resident set will progress faster. Or if you have multiple cores to dedicate, it probably makes sense to have one thread per such. Or simply if you want the transaction isolation offered by working in discreet threads such as when serving client requests. Or whatever other scenario you might have where multiple threads make sense. For example, building a web site over Neo4j is a good use case for having multiple threads, one per request. Creating a bulk data import tool on the other hand is not a good case to apply parallelism - since it will be constantly writing to disk, a single thread is fast enough, adding more does not increase throughput. The reasoning behind multithreaded access to Neo4j is pretty much the same as for any other use case. Whatever you choose however is well supported. cheers, CG On Fri, Jun 17, 2011 at 3:23 PM, Norbert Tausch w...@ntausch.de wrote: Hi, is it possible to traverse on a Neo4J graph DB using the Java API in parallel threads? Is this possible within one transaction or does every thread has to use its own transaction? Is the API thread-safe concerning read-only access? Is there any advantage of concerning parallelism when using Neo4j as an embedded DB? Best regards ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Find 2nd degree friends in order of mutual friend
Oh thank you, As I mentioned, I am new to neo4j. So a little sample code would be very useful in my learning process. :) My current state is that I managed to add few nodes, and add friend relationship between several nodes. User - friend - other node. Friend is relationship I don't have a very big node number so I think your suggested approach will work. Fajar Sent from my BlackBerry® smartphone from Sinyal Bagus XL, Nyambung Teruuusss...! -Original Message- From: Peter Neubauer peter.neuba...@neotechnology.com Sender: user-boun...@lists.neo4j.org Date: Fri, 17 Jun 2011 14:12:48 To: Neo4j user discussionsuser@lists.neo4j.org Reply-To: Neo4j user discussions user@lists.neo4j.org Subject: Re: [Neo4j] Find 2nd degree friends in order of mutual friend Hi Fajar, this is a depth 2 traversal from the person in question. While exhaustively traversing his friends, you increase the group count as for each FOAF you get on the second step. However, we have seen edge cases with supernodes where in a social network, persons can have 50K friends. There, you might use heuristics or indexing approaches to make this very fast. If you have some more details, I could write down the query in Gremlin or Cypher (http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html), but in principle, it would be like https://github.com/tinkerpop/gremlin/wiki (actually using 3 steps, I think we could get it down to 2) for Gremlin. In neo4j, if things are not cached, only the parts the data that are needed for this traversal wil be loaded from disk, so you don't need to hold all the graph in cache for this, since it is a data-local operation. HTH Cheers, /peter neubauer GTalk: neubauer.peter Skype peter.neubauer Phone +46 704 106975 LinkedIn http://www.linkedin.com/in/neubauer Twitter http://twitter.com/peterneubauer http://www.neo4j.org - Your high performance graph database. http://startupbootcamp.org/ - Öresund - Innovation happens HERE. http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. On Fri, Jun 17, 2011 at 1:33 PM, Fajar Maulana Firdaus faja...@gmail.com wrote: Hi all, I am new to neo4j and excited to know more about graph database. First of all, could anyone please help me to figure out the documentation about the query or rest client? Then, back to my question, I want to find 2nd degree friends but ordered by number of mutual friend. I understand that if I have all data in memory, I could've traverse the graph to 2nd level, and keep counter for each nodes in 2nd level. So in away its like finding all paths from start node to all second degree friend, but if we do that, it would be inefficient. Does anyone have any idea how to do this with neo4j? Thank you, Fajarmf ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Change in behavior for QueryContext with IndexNode ?
Thanks Mattias, I'll use the 1.4M04 jars and try my code again. If I get the NPE, I'll post my code. On Jun 17, 2011, at 1:57 AM, Mattias Persson wrote: I cannot reproduce this. I'm trying it with this code: // I also tried with FULLTEXT_CONFIG IndexNode index = graphDb.index().forNodes( qc, LuceneIndexImplementation.EXACT_CONFIG ); Node node = graphDb.createNode(); index.add( node, key, value ); index.query( new QueryContext( key:value AND key:value ) ); index.query( new QueryContext( key:value key:value ).defaultOperator( Operator.AND ) ); restartTx(); index.query( new QueryContext( key:value AND key:value ) ); index.query( new QueryContext( key:value key:value ).defaultOperator( Operator.AND ) ); it doesn't throw any NPE. 2011/6/17 Mattias Persson matt...@neotechnology.com Hi Kalin, I'll have a look at it right now 2011/6/17 Kalin Wilson Development d...@kalinwilson.com Perhaps this is fixed in the latest milestone release, I haven't had a chance to test it yet. I upgraded from 1.3M03 to 1.4M03 and found that my code that queried node indexes using a QueryContext was throwing a NPE. In my code I constructed a string similar to eclass:org.spp.data.Something AND eid:101 and constructed the QueryContext from that. The QueryContext object was then passed to an index.query() method. Once I found that the NPE was being thrown by index.query(QueryContext), I put together a simple test that created and indexed a Node then queried the index using a QueryContext using various constructs, QueryContext(key:value key:value).defaultOperator(Operator.AND) and QueryContext(key:value AND key:value). Passing either version of these objects to index.query() throws a NPE, however calling index.query(key:value AND key:value) works and calling index.query(qc.getQueryOrQueryObject()) works (at least when the full string with operators is used to build the QC). Has there been a change in how or when to use a QueryContext? Perhaps I'm using it incorrectly now. Thanks, Kalin ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Find 2nd degree friends in order of mutual friend
Hi, In Gremlin (http://gremlin.tinkerpop.com), friends of a friend (FOAF) who are not my friends: x = [] as Set g.v(1).out('friend').aggregate(x).out('friend').except(x) - x is a Set to save intermediate friend vertices to to exclude (except) from the final step. - g is your graph (e.g. g = new Neo4jGraph('/tmp/graph')) - g.v(1) will grab vertex 1 by its id If you give me some particular things you want to say, I can provide you the Gremlin code to do it. Thanks, Marko. http://markorodriguez.com On Jun 17, 2011, at 7:08 AM, faja...@gmail.com wrote: Oh thank you, As I mentioned, I am new to neo4j. So a little sample code would be very useful in my learning process. :) My current state is that I managed to add few nodes, and add friend relationship between several nodes. User - friend - other node. Friend is relationship I don't have a very big node number so I think your suggested approach will work. Fajar Sent from my BlackBerry® smartphone from Sinyal Bagus XL, Nyambung Teruuusss...! -Original Message- From: Peter Neubauer peter.neuba...@neotechnology.com Sender: user-boun...@lists.neo4j.org Date: Fri, 17 Jun 2011 14:12:48 To: Neo4j user discussionsuser@lists.neo4j.org Reply-To: Neo4j user discussions user@lists.neo4j.org Subject: Re: [Neo4j] Find 2nd degree friends in order of mutual friend Hi Fajar, this is a depth 2 traversal from the person in question. While exhaustively traversing his friends, you increase the group count as for each FOAF you get on the second step. However, we have seen edge cases with supernodes where in a social network, persons can have 50K friends. There, you might use heuristics or indexing approaches to make this very fast. If you have some more details, I could write down the query in Gremlin or Cypher (http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html), but in principle, it would be like https://github.com/tinkerpop/gremlin/wiki (actually using 3 steps, I think we could get it down to 2) for Gremlin. In neo4j, if things are not cached, only the parts the data that are needed for this traversal wil be loaded from disk, so you don't need to hold all the graph in cache for this, since it is a data-local operation. HTH Cheers, /peter neubauer GTalk: neubauer.peter Skype peter.neubauer Phone +46 704 106975 LinkedIn http://www.linkedin.com/in/neubauer Twitter http://twitter.com/peterneubauer http://www.neo4j.org - Your high performance graph database. http://startupbootcamp.org/- Öresund - Innovation happens HERE. http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. On Fri, Jun 17, 2011 at 1:33 PM, Fajar Maulana Firdaus faja...@gmail.com wrote: Hi all, I am new to neo4j and excited to know more about graph database. First of all, could anyone please help me to figure out the documentation about the query or rest client? Then, back to my question, I want to find 2nd degree friends but ordered by number of mutual friend. I understand that if I have all data in memory, I could've traverse the graph to 2nd level, and keep counter for each nodes in 2nd level. So in away its like finding all paths from start node to all second degree friend, but if we do that, it would be inefficient. Does anyone have any idea how to do this with neo4j? Thank you, Fajarmf ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Find 2nd degree friends in order of mutual friend
Thank you for the code, I will use it as starting point of learning gremlin. Sent from my BlackBerry® smartphone from Sinyal Bagus XL, Nyambung Teruuusss...! -Original Message- From: Marko Rodriguez okramma...@gmail.com Sender: user-boun...@lists.neo4j.org Date: Fri, 17 Jun 2011 07:31:26 To: Neo4j user discussionsuser@lists.neo4j.org Reply-To: Neo4j user discussions user@lists.neo4j.org Subject: Re: [Neo4j] Find 2nd degree friends in order of mutual friend Hi, In Gremlin (http://gremlin.tinkerpop.com), friends of a friend (FOAF) who are not my friends: x = [] as Set g.v(1).out('friend').aggregate(x).out('friend').except(x) - x is a Set to save intermediate friend vertices to to exclude (except) from the final step. - g is your graph (e.g. g = new Neo4jGraph('/tmp/graph')) - g.v(1) will grab vertex 1 by its id If you give me some particular things you want to say, I can provide you the Gremlin code to do it. Thanks, Marko. http://markorodriguez.com On Jun 17, 2011, at 7:08 AM, faja...@gmail.com wrote: Oh thank you, As I mentioned, I am new to neo4j. So a little sample code would be very useful in my learning process. :) My current state is that I managed to add few nodes, and add friend relationship between several nodes. User - friend - other node. Friend is relationship I don't have a very big node number so I think your suggested approach will work. Fajar Sent from my BlackBerry® smartphone from Sinyal Bagus XL, Nyambung Teruuusss...! -Original Message- From: Peter Neubauer peter.neuba...@neotechnology.com Sender: user-boun...@lists.neo4j.org Date: Fri, 17 Jun 2011 14:12:48 To: Neo4j user discussionsuser@lists.neo4j.org Reply-To: Neo4j user discussions user@lists.neo4j.org Subject: Re: [Neo4j] Find 2nd degree friends in order of mutual friend Hi Fajar, this is a depth 2 traversal from the person in question. While exhaustively traversing his friends, you increase the group count as for each FOAF you get on the second step. However, we have seen edge cases with supernodes where in a social network, persons can have 50K friends. There, you might use heuristics or indexing approaches to make this very fast. If you have some more details, I could write down the query in Gremlin or Cypher (http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html), but in principle, it would be like https://github.com/tinkerpop/gremlin/wiki (actually using 3 steps, I think we could get it down to 2) for Gremlin. In neo4j, if things are not cached, only the parts the data that are needed for this traversal wil be loaded from disk, so you don't need to hold all the graph in cache for this, since it is a data-local operation. HTH Cheers, /peter neubauer GTalk: neubauer.peter Skype peter.neubauer Phone +46 704 106975 LinkedIn http://www.linkedin.com/in/neubauer Twitter http://twitter.com/peterneubauer http://www.neo4j.org - Your high performance graph database. http://startupbootcamp.org/- Öresund - Innovation happens HERE. http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. On Fri, Jun 17, 2011 at 1:33 PM, Fajar Maulana Firdaus faja...@gmail.com wrote: Hi all, I am new to neo4j and excited to know more about graph database. First of all, could anyone please help me to figure out the documentation about the query or rest client? Then, back to my question, I want to find 2nd degree friends but ordered by number of mutual friend. I understand that if I have all data in memory, I could've traverse the graph to 2nd level, and keep counter for each nodes in 2nd level. So in away its like finding all paths from start node to all second degree friend, but if we do that, it would be inefficient. Does anyone have any idea how to do this with neo4j? Thank you, Fajarmf ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] User Digest, Vol 51, Issue 110
I agree,a Node is something that has 2 (user managed) fields: Relationship[] Property[] and a Relationship is something that has 2 (user managed) fields: Node[2] Property[] and currently Property has two fields String key Object value where Object can be a scalar or array of basic types: String, int, long, boolean, ... My proposal is Node, Node[], Relationship and Relationsip[] be also valid values for properties. Aniceto Date: Fri, 17 Jun 2011 05:24:19 -0700 From: Rick Bullotta r ick.bullo...@thingworx.comSubject: Re: [Neo4j] Node[] or Relationship[] as properties To: Neo4j user discussions user@lis ts.neo4j.orgMessage-ID: 09DF3402C845EC489A3323A06208F 20d0a9d4...@p3pw5ex1mb14.ex1.secureserver.net Content-Type: text/plain; charset=us-ascii I think some further understanding of Neo4J and graph databases would help: Node == precisely what a single relationship from a node accomplishes Node[] == precisely what multiple relationships from a node accomplishes -Original Message- From: user-boun...@lists.neo4j.org [ user-boun...@lists.neo4j.org] On Behalf Of Aniceto PerezSent: Friday, June 17, 2011 8:19 AM To: user@lis ts.neo4j.orgSubject: [Neo4j] Node[] or Relationship[] as properties I think it could be very useful to add these types as possible property values Node or Node[] Relationship or Relationship[] This is useful to implement more complex graphs. For instance, security roles: I can define a security role as a node and users nodes can HAVE a relationship to that role. The use case is when that role is related to something, for instance a project. Let's have there are 4 standard roles for each project, and 1000 projects. Currently I would need 4000 effective roles to be related to users or only 4 roles but relationships between users and roles have a property with the project that relationship is related to. The 4000 roles solution is bad for management: every time a role is modified 1000 modifications must be done. The projectname-as-a-property solution doesn't enable easy navigation. A more elegant solution is to add a property to the user--role relationship: the related to project node. If Node is allowed, better if Node[] are allowed too. And maybe there are also use cases for Relationship and Relationship[] as property value. Aniceto ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] User Digest, Vol 51, Issue 110
Aniceto, introducing real Node and Relationship links as fields on Nodes and relationships would essentially blur the distinction between Nodes, Properties and Relationships, and let you treat the graph as a Hypergraph. We find that model too abstract and hard to deal with the edge cases of these structures in real world scenarios. Instead, would it be possible for you to store NodeIDs in properties instead, or serialise Node[] into byte arrays as properties? I don't recommend it since it duplicates and unlinks information in the graph that has to be maintained by triggers and updates, but that would be one possibility. What is the concrete usecase that drives you to these constructs? Cheers, /peter neubauer GTalk: neubauer.peter Skype peter.neubauer Phone +46 704 106975 LinkedIn http://www.linkedin.com/in/neubauer Twitter http://twitter.com/peterneubauer http://www.neo4j.org - Your high performance graph database. http://startupbootcamp.org/ - Öresund - Innovation happens HERE. http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. 2011/6/17 Aniceto Pérez y Madrid ape...@innovasoftps.com: I agree,a Node is something that has 2 (user managed) fields: Relationship[] Property[] and a Relationship is something that has 2 (user managed) fields: Node[2] Property[] and currently Property has two fields String key Object value where Object can be a scalar or array of basic types: String, int, long, boolean, ... My proposal is Node, Node[], Relationship and Relationsip[] be also valid values for properties. Aniceto Date: Fri, 17 Jun 2011 05:24:19 -0700 From: Rick Bullotta r ick.bullo...@thingworx.comSubject: Re: [Neo4j] Node[] or Relationship[] as properties To: Neo4j user discussions user@lis ts.neo4j.orgMessage-ID: 09DF3402C845EC489A3323A06208F 20d0a9d4...@p3pw5ex1mb14.ex1.secureserver.net Content-Type: text/plain; charset=us-ascii I think some further understanding of Neo4J and graph databases would help: Node == precisely what a single relationship from a node accomplishes Node[] == precisely what multiple relationships from a node accomplishes -Original Message- From: user-boun...@lists.neo4j.org [ user-boun...@lists.neo4j.org] On Behalf Of Aniceto PerezSent: Friday, June 17, 2011 8:19 AM To: user@lis ts.neo4j.orgSubject: [Neo4j] Node[] or Relationship[] as properties I think it could be very useful to add these types as possible property values Node or Node[] Relationship or Relationship[] This is useful to implement more complex graphs. For instance, security roles: I can define a security role as a node and users nodes can HAVE a relationship to that role. The use case is when that role is related to something, for instance a project. Let's have there are 4 standard roles for each project, and 1000 projects. Currently I would need 4000 effective roles to be related to users or only 4 roles but relationships between users and roles have a property with the project that relationship is related to. The 4000 roles solution is bad for management: every time a role is modified 1000 modifications must be done. The projectname-as-a-property solution doesn't enable easy navigation. A more elegant solution is to add a property to the user--role relationship: the related to project node. If Node is allowed, better if Node[] are allowed too. And maybe there are also use cases for Relationship and Relationship[] as property value. Aniceto ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
[Neo4j] Neo4J server - java
Hi, A startup question here! Can I connect from java to a neo4j server running the database without using the REST API or the Remote Server.? Something like : GraphDatabaseService graphDb = new EmbeddedGraphDatabase(localhost:7474/); Thanks, A. ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4J server - java
This should help http://docs.neo4j.org/chunked/1.4-SNAPSHOT/server-embedded.html Cheers, McKinley On Fri, Jun 17, 2011 at 9:00 AM, Antriani Stylianou antrian...@gmail.comwrote: Hi, A startup question here! Can I connect from java to a neo4j server running the database without using the REST API or the Remote Server.? Something like : GraphDatabaseService graphDb = new EmbeddedGraphDatabase(localhost:7474/); Thanks, A. ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4J server - java
Hello More info: http://www.mail-archive.com/user@lists.neo4j.org/msg08629.html However, by definition, an embedded db is just a file. -Charles Edward Bedón CortázarITIL Foundation CertifiedOpen Source Network Inventory for the masses! http://kuwaiba.sourceforge.net | Follow Kuwaiba on TwitterLinux Registered User #38 Am Fri, 17 Jun 2011 11:20:03 -0500 McKinley lt;mckinley1...@gmail.comgt; schrieb This should help http://docs.neo4j.org/chunked/1.4-SNAPSHOT/server-embedded.html Cheers, McKinley On Fri, Jun 17, 2011 at 9:00 AM, Antriani Stylianou lt;antrian...@gmail.comgt;wrote: gt; Hi, gt; gt; A startup question here! gt; Can I connect from java to a neo4j server running the database without gt; using the REST API or the Remote Server.? gt; gt; Something like : gt; gt; GraphDatabaseService graphDb = new gt; EmbeddedGraphDatabase(localhost:7474/); gt; gt; gt; Thanks, gt; A. gt; gt; ___ gt; Neo4j mailing list gt; User@lists.neo4j.org gt; https://lists.neo4j.org/mailman/listinfo/user gt; ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Blueprints implementation for Neo4J server/ REST?
while REST is not a very performant way to access any low level API directly, there is a Java Wrapper for the Neo4j API over REST from Michael Hunger https://github.com/jexp/neo4j-java-rest-binding that does the Neo4j API over REST. Gave this a try. Works great! Thanks for that contribution. Maybe something that might be part of the core project some day? This could be a drop-in replacement for the embedded Neo4j implementation in Blueprints, but I haven't check that out. Would be great if you wanna take a look? I decided to rewrite to use Neo4J's native APIs, so it's not really a use case I'm interested in anymore. Sorry :-) Eelco ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4J server - java
Hi Antriani, no, besides the two ways you mention, such functionality is not currently available, with a question mark over the HA way, depending on your use case. I assume what you need is to program against a remotely running instance of Neo4j through the same Java API, kind of like what is feasible through JDBC drivers for relational stores. The brand new Cypher query language is a step in this direction, providing a way to serialize 'job descriptions that can lead to a binary protocol and finally a driver that will provide what you ask for. However, the REST API is currently the proper way to talk to a Neo4j server, recently improved by batch functionality. Does your use case have a particular reason for which the REST interface is not sufficient? cheers, CG On Fri, Jun 17, 2011 at 7:00 PM, Antriani Stylianou antrian...@gmail.com wrote: Hi, A startup question here! Can I connect from java to a neo4j server running the database without using the REST API or the Remote Server.? Something like : GraphDatabaseService graphDb = new EmbeddedGraphDatabase(localhost:7474/); Thanks, A. ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4J server - java
Hi, That answered my question! I was just aiming for performance and thought that java api would be better than REST. a. On 6/17/11 6:34 PM, Chris Gioran wrote: Hi Antriani, no, besides the two ways you mention, such functionality is not currently available, with a question mark over the HA way, depending on your use case. I assume what you need is to program against a remotely running instance of Neo4j through the same Java API, kind of like what is feasible through JDBC drivers for relational stores. The brand new Cypher query language is a step in this direction, providing a way to serialize 'job descriptions that can lead to a binary protocol and finally a driver that will provide what you ask for. However, the REST API is currently the proper way to talk to a Neo4j server, recently improved by batch functionality. Does your use case have a particular reason for which the REST interface is not sufficient? cheers, CG On Fri, Jun 17, 2011 at 7:00 PM, Antriani Stylianou antrian...@gmail.com wrote: Hi, A startup question here! Can I connect from java to a neo4j server running the database without using the REST API or the Remote Server.? Something like : GraphDatabaseService graphDb = new EmbeddedGraphDatabase(localhost:7474/); Thanks, A. ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Node and Relationships as properties
Peter This could be a use case: Let's have users, roles, permissions and communities. Each role is defined as a permissions set. Users have assigned a list of roles for every community they belong to. If roles could be assigned this way (user)-- (has_role)[community_neo4j] -- (role) we can manage separately each user, permissions in role and community. we don't need to have a set of roles for each community. The communities won't be erased if role assignments are enacted. And mainly they could be used in custom traversers and patterns. I agree we are not used to see these kind of handwritten graphs, but how can you draw a clean graph and use it in neo4j with referential integrity without the ability of having a node as property value? Regards Aniceto Aniceto, introducing real Node and Relationship links as fields on Nodes and relationships would essentially blur the distinction between Nodes, Properties and Relationships, and let you treat the graph as a Hypergraph. We find that model too abstract and hard to deal with the edge cases of these structures in real world scenarios. Instead, would it be possible for you to store NodeIDs in properties instead, or serialise Node[] into byte arrays as properties? I don't recommend it since it duplicates and unlinks information in the graph that has to be maintained by triggers and updates, but that would be one possibility. What is the concrete usecase that drives you to these constructs? Cheers, /peter neubauer ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4J server - java
Of course, on the other hand, if the access method per se is the problem, then Michael Hunger has this to offer: https://github.com/jexp/neo4j-java-rest-binding which is a wrapper that exposes the REST server endpoint as a GraphDatabaseService. Everything works through REST so performance remains the same but you use Java APIs. cheers, CG On Fri, Jun 17, 2011 at 7:56 PM, Chris Gioran chris.gio...@neotechnology.com wrote: Glad to help! The main overhead associated with the REST interface is the request processing. The new batch request functionality available as of the latest milestone can reduce significantly that cost, so if performance against a remote instance is your main goal and you are not hesitant about using milestones, i urge you to try it out wherever you can - it will give you a significant boost and we always welcome feedback. cheers, CG On Fri, Jun 17, 2011 at 7:36 PM, Antriani Stylianou antrian...@gmail.com wrote: Hi, That answered my question! I was just aiming for performance and thought that java api would be better than REST. a. On 6/17/11 6:34 PM, Chris Gioran wrote: Hi Antriani, no, besides the two ways you mention, such functionality is not currently available, with a question mark over the HA way, depending on your use case. I assume what you need is to program against a remotely running instance of Neo4j through the same Java API, kind of like what is feasible through JDBC drivers for relational stores. The brand new Cypher query language is a step in this direction, providing a way to serialize 'job descriptions that can lead to a binary protocol and finally a driver that will provide what you ask for. However, the REST API is currently the proper way to talk to a Neo4j server, recently improved by batch functionality. Does your use case have a particular reason for which the REST interface is not sufficient? cheers, CG On Fri, Jun 17, 2011 at 7:00 PM, Antriani Stylianou antrian...@gmail.com wrote: Hi, A startup question here! Can I connect from java to a neo4j server running the database without using the REST API or the Remote Server.? Something like : GraphDatabaseService graphDb = new EmbeddedGraphDatabase(localhost:7474/); Thanks, A. ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Traversals versus Indexing
Cool, thanks! On Fri, Jun 17, 2011 at 5:01 AM, Mattias Persson matt...@neotechnology.comwrote: getNodeById is fast/immediate 2011/6/16 Aseem Kishore aseem.kish...@gmail.com Indeed getNodeById(). Aseem On Thu, Jun 16, 2011 at 10:11 AM, Mattias Persson matt...@neotechnology.com wrote: Are you thinking of GraphDatabaseService#getNodeById / #getRelationshipById ? Or index lookups? 2011/6/16 Aseem Kishore aseem.kish...@gmail.com Are lookups by ID also so much slower than traversals? Aseem On Thu, Jun 16, 2011 at 3:45 AM, Mattias Persson matt...@neotechnology.comwrote: I don't know your use case at all, but one of the benefits you get with traversing compared to index lookups is that one hop from a node to another is instantaneous ( 1 million hops / second on a fully cached graph), whereas index lookups are several order of magnitudes slower than that. But index lookups are good for when you f.ex. have thousands/millions of names and you'd like to get the node with a certain name. Then that would be your starting point for doing a traversal to find other information local to that node, or in its vicinity. 2011/6/13 Aman aman.6...@gmail.com What is faster - Traversals or Indexing? I mean if one has a database model that can offer a choice between the two, what should one choose? Also, what about when the scalability factor comes in? ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Announcing Neo4j 1.4 M04 “Kiruna Stol”
Quick q: will the new REST API batching feature treat the operations as a single transaction? That would be convenient for some scenarios I think, like swapping two nodes in a linked list. Aseem On Fri, Jun 10, 2011 at 7:48 AM, Peter Neubauer peter.neuba...@neotechnology.com wrote: Hello graphistas, today brings us the (hopefully) latest milestone towards the “Kiruna Stol” 1.4 release of Neo4j. You will find it contains two new major features that are meant to make your interaction with the database easier and more efficient as well as the usual range of minor bug fixes. Cypher, an expressive query language for graphs == So far, the main means of interacting with the graph have been either the Traversal API or the REST API, leaving Neo4j wanting of a portable, expressive query language. Starting today, however, we are pleased to release Cypher, the first iteration of a query language designed for both application developers and operations specialists that want to create ad-hoc, portable queries against a Neo4j instance. You will find that the syntax has an SQL flavour to it so it is easy to get used to but all the graphy semantics goodness is there, ready to be harnessed. So, go right ahead and check out the manual at http://docs.neo4j.org/chunked/1.4.M04/query-lang.html and tell us what you think. Batching for the REST API Cypher is not the only major feature in this milestone. The battle-proven REST interface gets new functionality, allowing definition and execution of batch operations. You can now post JSON encoded requests that contain any number of commands to the “batch URI” of the server and have the server execute them in one go, reducing this way the load on the server, the client and the network. Documentation on this experimental feature is available at http://docs.neo4j.org/chunked/1.4.M04/rest-api-batch-ops.html The above might be the stars of the show but, as always, there are many bug fixes and minor improvements scattered around the code. If you are curious, the changelogs have all the juicy details. So, go to http://neo4j.org to download 1.4.M04 and to http://blog.neo4j.org/2011/06/kiruna-stol-14-milestone-4.html to read more about it and let us know what you think. Cheers, /peter ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
[Neo4j] Null when iterating relationships
BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }Hi I have a graph where each node of a class have a relationship to a master-class node and it has a relationship to referenceNode. Using 1.4.M04 and EmbeddedServer. I have a loop over all the relationships of the referenceNode, each has a master-class node as endNode. Then I iterate over the relationships of each master-class node. Iterator returns each relationship beginning with the newest. The las one is the relation with the referenceNode. for (Iterator itr2 = nodo2Index.getRelationships().iterator(); itr2.hasNext();) { Relationship rel2Index; try { rel2Index = it.next(); catch (Exception e){ } } When the relationship net is from referenceNode to master-class node, the oldest one, I get a java.util.NoSuchElementException and the loop continues forever. Is that OK? Thanks ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
[Neo4j] Connecting to a standalone server (not embedded server)
BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }I've been digging into documentation and it seems there is no Java wrapper to access it, only the REST API. Is that correct? Thanks ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Connecting to a standalone server (not embedded server)
Hello Aniceto, Michael Hunger wrote a Java wrapper that uses the REST API under the covers: https://github.com/jexp/neo4j-java-rest-binding As Chris pointed out a couple of emails ago, although this API is similar to the embedded API, it goes over HTTP and so is far slower. Jim On 17 Jun 2011, at 18:56, Aniceto Pérez y Madrid wrote: BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }I've been digging into documentation and it seems there is no Java wrapper to access it, only the REST API. Is that correct? Thanks ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Node and Relationships as properties
You can create a node type community-role with two outgoing relations in_community and with_role, which respectively point to a community and to a role. The user node can then have a relationship has_community-role pointing to a community-role node. Every hypergraph structure can in principle be modeled in a property graph by introducing an intermediate node. Date: Fri, 17 Jun 2011 18:52:55 +0200 From: ape...@innovasoftps.com To: user@lists.neo4j.org Subject: Re: [Neo4j] Node and Relationships as properties Peter This could be a use case: Let's have users, roles, permissions and communities. Each role is defined as a permissions set. Users have assigned a list of roles for every community they belong to. If roles could be assigned this way (user)-- (has_role)[community_neo4j] -- (role) we can manage separately each user, permissions in role and community. we don't need to have a set of roles for each community. The communities won't be erased if role assignments are enacted. And mainly they could be used in custom traversers and patterns. I agree we are not used to see these kind of handwritten graphs, but how can you draw a clean graph and use it in neo4j with referential integrity without the ability of having a node as property value? Regards Aniceto Aniceto, introducing real Node and Relationship links as fields on Nodes and relationships would essentially blur the distinction between Nodes, Properties and Relationships, and let you treat the graph as a Hypergraph. We find that model too abstract and hard to deal with the edge cases of these structures in real world scenarios. Instead, would it be possible for you to store NodeIDs in properties instead, or serialise Node[] into byte arrays as properties? I don't recommend it since it duplicates and unlinks information in the graph that has to be maintained by triggers and updates, but that would be one possibility. What is the concrete usecase that drives you to these constructs? Cheers, /peter neubauer ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Extent of Indexing
Mattias, I just listed one of the use cases, I have ample types of relationships in my database. I will be connecting all the 50k users to certain common nodes that will depict something about the users. Example: A user node can be directly/indirectly related to a place node that will depict the places where users visit daily. Now please consider this scenario, because this is where I am facing problem... I have stored all data regarding user in user node (like age etc in the way described above). A user node is also connected to various nodes that he posted. Suppose that I have 50k users and each of them has posted 10 posts. Now I want to find out what posts have the people of certain age posted. How do I do that? I believe I WILL have to use indexing. If there is any way possible via traversals, please share the same. ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
[Neo4j] Neo4j with MapReduce inserts
I am trying to write MapReduce job to do Neo4j Batchinserters. It works fine when I just run it like a java file(runs in local mode) and does the insert, but when I try to run it in the distributed mode it does not write to the graph. Is it issue related to permissions? I have no clue where to look. ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
[Neo4j] Generating suggestions in a Neo4j db
This is an extension of previous questions that I had posted (although no knowledge of them is needed to understand this). Here's what the relations look like in my db... User1---VISITED PLACES--- Empty NodeHAS VISITED Usa User2---VISITED PLACES--- Empty NodeHAS VISITED Usa User1---VISITED PLACES--- Empty NodeHAS VISITED Canada User2---VISITED PLACES--- Empty NodeHAS VISITED Canada User1---VISITED PLACES--- Empty NodeHAS VISITED India (The Usa nodes are the same one). Each user has his/her own VISITED PLACES empty node (so that the point from where all these relations emerge are centralized). User1 and User2 are friends. Now, as User1 and User2 have most of their visited places common, I want to generate suggestions of places (here India) where User2 can visit (based upon the places where User2's friends have visited)... How can I do that? Any suggestions regarding the same? Indexing or Traversals?? ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Announcing Neo4j 1.4 M04 “Kiruna Stol”
yes it does. one tx per batch M Sent from my iBrick4 Am 17.06.2011 um 19:17 schrieb Aseem Kishore aseem.kish...@gmail.com: Quick q: will the new REST API batching feature treat the operations as a single transaction? That would be convenient for some scenarios I think, like swapping two nodes in a linked list. Aseem On Fri, Jun 10, 2011 at 7:48 AM, Peter Neubauer peter.neuba...@neotechnology.com wrote: Hello graphistas, today brings us the (hopefully) latest milestone towards the “Kiruna Stol” 1.4 release of Neo4j. You will find it contains two new major features that are meant to make your interaction with the database easier and more efficient as well as the usual range of minor bug fixes. Cypher, an expressive query language for graphs == So far, the main means of interacting with the graph have been either the Traversal API or the REST API, leaving Neo4j wanting of a portable, expressive query language. Starting today, however, we are pleased to release Cypher, the first iteration of a query language designed for both application developers and operations specialists that want to create ad-hoc, portable queries against a Neo4j instance. You will find that the syntax has an SQL flavour to it so it is easy to get used to but all the graphy semantics goodness is there, ready to be harnessed. So, go right ahead and check out the manual at http://docs.neo4j.org/chunked/1.4.M04/query-lang.html and tell us what you think. Batching for the REST API Cypher is not the only major feature in this milestone. The battle-proven REST interface gets new functionality, allowing definition and execution of batch operations. You can now post JSON encoded requests that contain any number of commands to the “batch URI” of the server and have the server execute them in one go, reducing this way the load on the server, the client and the network. Documentation on this experimental feature is available at http://docs.neo4j.org/chunked/1.4.M04/rest-api-batch-ops.html The above might be the stars of the show but, as always, there are many bug fixes and minor improvements scattered around the code. If you are curious, the changelogs have all the juicy details. So, go to http://neo4j.org to download 1.4.M04 and to http://blog.neo4j.org/2011/06/kiruna-stol-14-milestone-4.html to read more about it and let us know what you think. Cheers, /peter ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4j with MapReduce inserts
Hello Sulabh, We're going to need a little more information before we can help. Can you tell us how it fails? Are you trying to run a batch inserter on different databases on each of your parallel jobs? Jim ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Generating suggestions in a Neo4j db
Hi Aman, I'm puzzled. Why not Aman--HAS_VISITED--USA Jim--HAS_VISITED--India And if: Aman--FRIEND-OF--Jim Then you just need to traverse from Aman following outgoing FRIEND_OF relationships to all your friends, and then traverse out their outgoing HAS_VISITED relationships to find places your friends have been. The general idiom with Neo4j is use indexes the find your start node (e.g. the Aman node in the above) then traverse from there. Jim ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
[Neo4j] Integer cost property
I am using the Dijkstra path finding algorithm. I have several relationships set up through the REST interface with a cost property called distance. Unfortunately, it seems like I can't make the property a round number like 2.0, either through REST calls or through the webadmin panel. It always seems to cast my value to an integer. When I try to find my path, I get the following exception thrown: java.lang.Integer cannot be cast to java.lang.Double The exception is thrown on line 38 of the DoubleEvaluator: org.neo4j.graphalgo.impl.util.DoubleEvaluator.getCost(DoubleEvaluator.java:38) I don't know Java very well, and I don't have an environment set up to work on large Java projects, so I can't submit a patch. I think the fix might be to change that line to: - return (Double) relationship.getProperty( costpropertyName ); + return (Double) relationship.getProperty( costpropertyName ).doubleValue(); Should I file a bug as well as posting this to the list? Thanks, Josh Adell ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4j with MapReduce inserts
Also, what technology are you writing those map-reduce jobs with ? (framework, runtime-env, etc). Some code samples would be great as well. Cheers Michael Am 17.06.2011 um 22:24 schrieb Jim Webber: Hello Sulabh, We're going to need a little more information before we can help. Can you tell us how it fails? Are you trying to run a batch inserter on different databases on each of your parallel jobs? Jim ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Integer cost property
Hi Josh, I'm currently working on some REST API stuff, so my head's right in this space. I'm happy to take a look at this is if you send over a failing test. Jim On 17 Jun 2011, at 21:34, Josh Adell wrote: I am using the Dijkstra path finding algorithm. I have several relationships set up through the REST interface with a cost property called distance. Unfortunately, it seems like I can't make the property a round number like 2.0, either through REST calls or through the webadmin panel. It always seems to cast my value to an integer. When I try to find my path, I get the following exception thrown: java.lang.Integer cannot be cast to java.lang.Double The exception is thrown on line 38 of the DoubleEvaluator: org.neo4j.graphalgo.impl.util.DoubleEvaluator.getCost(DoubleEvaluator.java:38) I don't know Java very well, and I don't have an environment set up to work on large Java projects, so I can't submit a patch. I think the fix might be to change that line to: - return (Double) relationship.getProperty( costpropertyName ); + return (Double) relationship.getProperty( costpropertyName ).doubleValue(); Should I file a bug as well as posting this to the list? Thanks, Josh Adell ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Node and Relationships as properties
BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }Yes, but you have to add an intermediate node and then graph becomes to be like the 4th normal form in SQL. An artifact to adapt real life scenarios to pure and simple technologies. Again an impedance mismatch between real life and implementing technology. Aniceto On Fri 17/06/11 8:19 PM , Niels Hoogeveen pd_aficion...@hotmail.com sent: You can create a node type community-role with two outgoing relations in_community and with_role, which respectively point to a community and to a role. The user node can then have a relationship has_community-role pointing to a community-role node. Every hypergraph structure can in principle be modeled in a property graph by introducing an intermediate node. Date: Fri, 17 Jun 2011 18:52:55 +0200 From: ape...@innovasoftps.com [1] To: user@lists.neo4j.org [2] Subject: Re: [Neo4j] Node and Relationships as properties Peter This could be a use case: Let's have users, roles, permissions and communities. Each role is defined as a permissions set. Users have assigned a list of roles for every community they belong to. If roles could be assigned this way (user)-- (has_role)[community_neo4j] -- (role) we can manage separately each user, permissions in role and community. we don't need to have a set of roles for each community. The communities won't be erased if role assignments are enacted. And mainly they could be used in custom traversers and patterns. I agree we are not used to see these kind of handwritten graphs, but how can you draw a clean graph and use it in neo4j with referential integrity without the ability of having a node as property value? Regards Aniceto Aniceto, introducing real Node and Relationship links as fields on Nodes and relationships would essentially blur the distinction between Nodes, Properties and Relationships, and let you treat the graph as a Hypergraph. We find that model too abstract and hard to deal with the edge cases of these structures in real world scenarios. Instead, would it be possible for you to store NodeIDs in properties instead, or serialise Node[] into byte arrays as properties? I don't recommend it since it duplicates and unlinks information in the graph that has to be maintained by triggers and updates, but that would be one possibility. What is the concrete usecase that drives you to these constructs? Cheers, /peter neubauer ___ Neo4j mailing list User@lists.neo4j.org [3] https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org [4] https://lists.neo4j.org/mailman/listinfo/user Links: -- [1] mailto:ape...@innovasoftps.com [2] mailto:user@lists.neo4j.org [3] mailto:User@lists.neo4j.org [4] mailto:User@lists.neo4j.org ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Connecting to a standalone server (not embedded server)
BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }It seems there is a class named ORG.NEO4J.REST.GRAPHDB.RESTGRAPHDATABASE that implements GraphDatabaseService, but despite that package, javadocs are in the spring-data server, and probably the class be also part of Spring-data-graph package. Aniceto On Fri 17/06/11 8:18 PM , Jim Webber j...@neotechnology.com sent: Hello Aniceto, Michael Hunger wrote a Java wrapper that uses the REST API under the covers: https://github.com/jexp/neo4j-java-rest-binding As Chris pointed out a couple of emails ago, although this API is similar to the embedded API, it goes over HTTP and so is far slower. Jim On 17 Jun 2011, at 18:56, Aniceto Pérez y Madrid wrote: BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }I've been digging into documentation and it seems there is no Java wrapper to access it, only the REST API. Is that correct? Thanks ___ Neo4j mailing list User@lists.neo4j.org [1] https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org [2] https://lists.neo4j.org/mailman/listinfo/user Links: -- [1] mailto:User@lists.neo4j.org [2] mailto:User@lists.neo4j.org ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4j with MapReduce inserts
Well as I mentioned the code does not fail anywhere, it runs it full course and just skips the writing to the graph part. I have just one graph and I pass just 1 instance of the batchInserter to the map function. My code is in Scala, sample code attached below class ExportReducer extends Reducer[Text,MapWritable,LongWritable,Text]{ type Context = org.apache.hadoop.mapreduce.Reducer[Text, MapWritable, LongWritable, Text]#Context @throws(classOf[Exception]) override def reduce(key: Text, value: java.lang.Iterable[MapWritable], context: Context) { var keys: Array[String] = key.toString.split(:) var uri1 = first + keys(0) var uri2 = last + keys(1) ExportReducerObject.propertiesUID.put(ID,uri1); var node1 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesUID); ExportReducerObject.indexService.add(node1,ExportReducerObject.propertiesUID) ExportReducerObject.propertiesCID.put(ID,uri2); var node2 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesCID); ExportReducerObject.indexService.add(node2,ExportReducerObject.propertiesCID); ExportReducerObject.propertiesEdges.put(fullName,1.0); ExportReducerObject.batchInserter.createRelationship(node1,node2,DynamicRelationshipType.withName( fullName),ExportReducerObject.propertiesEdges) } My graph properties are defined as below :- val batchInserter = new BatchInserterImpl(graph, BatchInserterImpl.loadProperties(neo4j.props)) val indexProvider = new LuceneBatchInserterIndexProvider(batchInserter) val indexService = indexProvider.nodeIndex(ID,MapUtil.stringMap(type,exact)) Mind it that the code works perfectly( writes to the graph) when running in local mode. On Fri, Jun 17, 2011 at 11:32 AM, sulabh choudhury sula...@gmail.comwrote: I am trying to write MapReduce job to do Neo4j Batchinserters. It works fine when I just run it like a java file(runs in local mode) and does the insert, but when I try to run it in the distributed mode it does not write to the graph. Is it issue related to permissions? I have no clue where to look. -- -- Thanks and Regards, Sulabh Choudhury ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4j with MapReduce inserts
Hi Sulabh, what do you mean by 'local' mode? The batch inserter can only be used in a single threaded environment. You shouldn't use it in a concurrent env as it will fail unpredictably. Please use the EmbeddedGraphDatabase instead. Michael Am 17.06.2011 um 23:20 schrieb sulabh choudhury: Well as I mentioned the code does not fail anywhere, it runs it full course and just skips the writing to the graph part. I have just one graph and I pass just 1 instance of the batchInserter to the map function. My code is in Scala, sample code attached below class ExportReducer extends Reducer[Text,MapWritable,LongWritable,Text]{ type Context = org.apache.hadoop.mapreduce.Reducer[Text, MapWritable, LongWritable, Text]#Context @throws(classOf[Exception]) override def reduce(key: Text, value: java.lang.Iterable[MapWritable], context: Context) { var keys: Array[String] = key.toString.split(:) var uri1 = first + keys(0) var uri2 = last + keys(1) ExportReducerObject.propertiesUID.put(ID,uri1); var node1 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesUID); ExportReducerObject.indexService.add(node1,ExportReducerObject.propertiesUID) ExportReducerObject.propertiesCID.put(ID,uri2); var node2 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesCID); ExportReducerObject.indexService.add(node2,ExportReducerObject.propertiesCID); ExportReducerObject.propertiesEdges.put(fullName,1.0); ExportReducerObject.batchInserter.createRelationship(node1,node2,DynamicRelationshipType.withName(fullName),ExportReducerObject.propertiesEdges) } My graph properties are defined as below :- val batchInserter = new BatchInserterImpl(graph, BatchInserterImpl.loadProperties(neo4j.props)) val indexProvider = new LuceneBatchInserterIndexProvider(batchInserter) val indexService = indexProvider.nodeIndex(ID,MapUtil.stringMap(type,exact)) Mind it that the code works perfectly( writes to the graph) when running in local mode. On Fri, Jun 17, 2011 at 11:32 AM, sulabh choudhury sula...@gmail.com wrote: I am trying to write MapReduce job to do Neo4j Batchinserters. It works fine when I just run it like a java file(runs in local mode) and does the insert, but when I try to run it in the distributed mode it does not write to the graph. Is it issue related to permissions? I have no clue where to look. -- -- Thanks and Regards, Sulabh Choudhury ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Node and Relationships as properties
That impedance mismatch you speak of can be overcome by writing your own API on top of Neo4J. Nothing keeps you for creating your own application layer that allows you to do the things you want to do. If you want relationships on relationships, create your own classes and interfaces, using nodes masquerading as relationships. You can even roll your own traversers that treat intermediate nodes as special cases, making the use of intermediate nodes just an implementation detail. Unlike SQL databases, Neo4j allows you to actually code pretty close to the metal, making it easier to create a setup that suits your particular needs. Niels To: user@lists.neo4j.org Date: Fri, 17 Jun 2011 23:00:25 +0200 From: ape...@innovasoftps.com Subject: Re: [Neo4j] Node and Relationships as properties BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }Yes, but you have to add an intermediate node and then graph becomes to be like the 4th normal form in SQL. An artifact to adapt real life scenarios to pure and simple technologies. Again an impedance mismatch between real life and implementing technology. Aniceto On Fri 17/06/11 8:19 PM , Niels Hoogeveen pd_aficion...@hotmail.com sent: You can create a node type community-role with two outgoing relations in_community and with_role, which respectively point to a community and to a role. The user node can then have a relationship has_community-role pointing to a community-role node. Every hypergraph structure can in principle be modeled in a property graph by introducing an intermediate node. Date: Fri, 17 Jun 2011 18:52:55 +0200 From: ape...@innovasoftps.com [1] To: user@lists.neo4j.org [2] Subject: Re: [Neo4j] Node and Relationships as properties Peter This could be a use case: Let's have users, roles, permissions and communities. Each role is defined as a permissions set. Users have assigned a list of roles for every community they belong to. If roles could be assigned this way (user)-- (has_role)[community_neo4j] -- (role) we can manage separately each user, permissions in role and community. we don't need to have a set of roles for each community. The communities won't be erased if role assignments are enacted. And mainly they could be used in custom traversers and patterns. I agree we are not used to see these kind of handwritten graphs, but how can you draw a clean graph and use it in neo4j with referential integrity without the ability of having a node as property value? Regards Aniceto Aniceto, introducing real Node and Relationship links as fields on Nodes and relationships would essentially blur the distinction between Nodes, Properties and Relationships, and let you treat the graph as a Hypergraph. We find that model too abstract and hard to deal with the edge cases of these structures in real world scenarios. Instead, would it be possible for you to store NodeIDs in properties instead, or serialise Node[] into byte arrays as properties? I don't recommend it since it duplicates and unlinks information in the graph that has to be maintained by triggers and updates, but that would be one possibility. What is the concrete usecase that drives you to these constructs? Cheers, /peter neubauer ___ Neo4j mailing list User@lists.neo4j.org [3] https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org [4] https://lists.neo4j.org/mailman/listinfo/user Links: -- [1] mailto:ape...@innovasoftps.com [2] mailto:user@lists.neo4j.org [3] mailto:User@lists.neo4j.org [4] mailto:User@lists.neo4j.org ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4j with MapReduce inserts
Are you referring that in a M/R environment each Map (or Reduce) process will try to have its own instance of batchInserter and hence it would fail ? WHen I say local I mean that the code works fine when I just use the M/R api but fails when I try to run in distributed mode. On Fri, Jun 17, 2011 at 2:25 PM, Michael Hunger michael.hun...@neotechnology.com wrote: Hi Sulabh, what do you mean by 'local' mode? The batch inserter can only be used in a single threaded environment. You shouldn't use it in a concurrent env as it will fail unpredictably. Please use the EmbeddedGraphDatabase instead. Michael Am 17.06.2011 um 23:20 schrieb sulabh choudhury: Well as I mentioned the code does not fail anywhere, it runs it full course and just skips the writing to the graph part. I have just one graph and I pass just 1 instance of the batchInserter to the map function. My code is in Scala, sample code attached below class ExportReducer extends Reducer[Text,MapWritable,LongWritable,Text]{ type Context = org.apache.hadoop.mapreduce.Reducer[Text, MapWritable, LongWritable, Text]#Context @throws(classOf[Exception]) override def reduce(key: Text, value: java.lang.Iterable[MapWritable], context: Context) { var keys: Array[String] = key.toString.split(:) var uri1 = first + keys(0) var uri2 = last + keys(1) ExportReducerObject.propertiesUID.put(ID,uri1); var node1 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesUID); ExportReducerObject.indexService.add(node1,ExportReducerObject.propertiesUID) ExportReducerObject.propertiesCID.put(ID,uri2); var node2 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesCID); ExportReducerObject.indexService.add(node2,ExportReducerObject.propertiesCID); ExportReducerObject.propertiesEdges.put(fullName,1.0); ExportReducerObject.batchInserter.createRelationship(node1,node2,DynamicRelationshipType.withName(fullName),ExportReducerObject.propertiesEdges) } My graph properties are defined as below :- val batchInserter = new BatchInserterImpl(graph, BatchInserterImpl.loadProperties(neo4j.props)) val indexProvider = new LuceneBatchInserterIndexProvider(batchInserter) val indexService = indexProvider.nodeIndex(ID,MapUtil.stringMap(type,exact)) Mind it that the code works perfectly( writes to the graph) when running in local mode. On Fri, Jun 17, 2011 at 11:32 AM, sulabh choudhury sula...@gmail.comwrote: I am trying to write MapReduce job to do Neo4j Batchinserters. It works fine when I just run it like a java file(runs in local mode) and does the insert, but when I try to run it in the distributed mode it does not write to the graph. Is it issue related to permissions? I have no clue where to look. -- -- Thanks and Regards, Sulabh Choudhury -- -- Thanks and Regards, Sulabh Choudhury ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Connecting to a standalone server (not embedded server)
Hi Aniceto, It happens that there is a similar class in SDG, but you should look at the version in Michael Hunger's repo: https://github.com/jexp/neo4j-java-rest-binding Jim ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4j with MapReduce inserts
No that would even be worse. A single BatchInserter and every graphdb-store that is currently written to by a batch inserter MUST be accessed from only a single single threaded environment. Please use the normal EmbeddedGraphDbService for your multi-threaded MR jobs. Cheers Michael Am 17.06.2011 um 23:38 schrieb sulabh choudhury: Are you referring that in a M/R environment each Map (or Reduce) process will try to have its own instance of batchInserter and hence it would fail ? WHen I say local I mean that the code works fine when I just use the M/R api but fails when I try to run in distributed mode. On Fri, Jun 17, 2011 at 2:25 PM, Michael Hunger michael.hun...@neotechnology.com wrote: Hi Sulabh, what do you mean by 'local' mode? The batch inserter can only be used in a single threaded environment. You shouldn't use it in a concurrent env as it will fail unpredictably. Please use the EmbeddedGraphDatabase instead. Michael Am 17.06.2011 um 23:20 schrieb sulabh choudhury: Well as I mentioned the code does not fail anywhere, it runs it full course and just skips the writing to the graph part. I have just one graph and I pass just 1 instance of the batchInserter to the map function. My code is in Scala, sample code attached below class ExportReducer extends Reducer[Text,MapWritable,LongWritable,Text]{ type Context = org.apache.hadoop.mapreduce.Reducer[Text, MapWritable, LongWritable, Text]#Context @throws(classOf[Exception]) override def reduce(key: Text, value: java.lang.Iterable[MapWritable], context: Context) { var keys: Array[String] = key.toString.split(:) var uri1 = first + keys(0) var uri2 = last + keys(1) ExportReducerObject.propertiesUID.put(ID,uri1); var node1 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesUID); ExportReducerObject.indexService.add(node1,ExportReducerObject.propertiesUID) ExportReducerObject.propertiesCID.put(ID,uri2); var node2 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesCID); ExportReducerObject.indexService.add(node2,ExportReducerObject.propertiesCID); ExportReducerObject.propertiesEdges.put(fullName,1.0); ExportReducerObject.batchInserter.createRelationship(node1,node2,DynamicRelationshipType.withName(fullName),ExportReducerObject.propertiesEdges) } My graph properties are defined as below :- val batchInserter = new BatchInserterImpl(graph, BatchInserterImpl.loadProperties(neo4j.props)) val indexProvider = new LuceneBatchInserterIndexProvider(batchInserter) val indexService = indexProvider.nodeIndex(ID,MapUtil.stringMap(type,exact)) Mind it that the code works perfectly( writes to the graph) when running in local mode. On Fri, Jun 17, 2011 at 11:32 AM, sulabh choudhury sula...@gmail.com wrote: I am trying to write MapReduce job to do Neo4j Batchinserters. It works fine when I just run it like a java file(runs in local mode) and does the insert, but when I try to run it in the distributed mode it does not write to the graph. Is it issue related to permissions? I have no clue where to look. -- -- Thanks and Regards, Sulabh Choudhury -- -- Thanks and Regards, Sulabh Choudhury ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Neo4j with MapReduce inserts
Alright thank you all On Fri, Jun 17, 2011 at 2:46 PM, Michael Hunger michael.hun...@neotechnology.com wrote: No that would even be worse. A single BatchInserter and every graphdb-store that is currently written to by a batch inserter MUST be accessed from only a single single threaded environment. Please use the normal EmbeddedGraphDbService for your multi-threaded MR jobs. Cheers Michael Am 17.06.2011 um 23:38 schrieb sulabh choudhury: Are you referring that in a M/R environment each Map (or Reduce) process will try to have its own instance of batchInserter and hence it would fail ? WHen I say local I mean that the code works fine when I just use the M/R api but fails when I try to run in distributed mode. On Fri, Jun 17, 2011 at 2:25 PM, Michael Hunger michael.hun...@neotechnology.com wrote: Hi Sulabh, what do you mean by 'local' mode? The batch inserter can only be used in a single threaded environment. You shouldn't use it in a concurrent env as it will fail unpredictably. Please use the EmbeddedGraphDatabase instead. Michael Am 17.06.2011 um 23:20 schrieb sulabh choudhury: Well as I mentioned the code does not fail anywhere, it runs it full course and just skips the writing to the graph part. I have just one graph and I pass just 1 instance of the batchInserter to the map function. My code is in Scala, sample code attached below class ExportReducer extends Reducer[Text,MapWritable,LongWritable,Text]{ type Context = org.apache.hadoop.mapreduce.Reducer[Text, MapWritable, LongWritable, Text]#Context @throws(classOf[Exception]) override def reduce(key: Text, value: java.lang.Iterable[MapWritable], context: Context) { var keys: Array[String] = key.toString.split(:) var uri1 = first + keys(0) var uri2 = last + keys(1) ExportReducerObject.propertiesUID.put(ID,uri1); var node1 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesUID); ExportReducerObject.indexService.add(node1,ExportReducerObject.propertiesUID) ExportReducerObject.propertiesCID.put(ID,uri2); var node2 = ExportReducerObject.batchInserter.createNode(ExportReducerObject.propertiesCID); ExportReducerObject.indexService.add(node2,ExportReducerObject.propertiesCID); ExportReducerObject.propertiesEdges.put(fullName,1.0); ExportReducerObject.batchInserter.createRelationship(node1,node2,DynamicRelationshipType.withName(fullName),ExportReducerObject.propertiesEdges) } My graph properties are defined as below :- val batchInserter = new BatchInserterImpl(graph, BatchInserterImpl.loadProperties(neo4j.props)) val indexProvider = new LuceneBatchInserterIndexProvider(batchInserter) val indexService = indexProvider.nodeIndex(ID,MapUtil.stringMap(type,exact)) Mind it that the code works perfectly( writes to the graph) when running in local mode. On Fri, Jun 17, 2011 at 11:32 AM, sulabh choudhury sula...@gmail.comwrote: I am trying to write MapReduce job to do Neo4j Batchinserters. It works fine when I just run it like a java file(runs in local mode) and does the insert, but when I try to run it in the distributed mode it does not write to the graph. Is it issue related to permissions? I have no clue where to look. -- -- Thanks and Regards, Sulabh Choudhury -- -- Thanks and Regards, Sulabh Choudhury -- -- Thanks and Regards, Sulabh Choudhury ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] traversing backwards to reference node
Thanks guys, this mailing list is awesome. On Thu, Jun 16, 2011 at 6:29 AM, Marko Rodriguez okramma...@gmail.comwrote: Hi, I think what he's asking for is just to collect properties along the way. Yea. You are right he said adding a name property to a list. In Gremlin, if you are still interested: x = [ ] // return list startSet = [ ... ] // fill an array/set with leaves startSet.in.sideEffect{x.add(it.name)}.loop(2){true} Or, as Mattias does using paths, do: startSet.in.name.back(1).loop(2){true}.paths The will give you all the paths from the leaves to the root. In a more friendly syntax, do: startSet.as('x').in.name.back(1).loop('x'){true}.paths Though, I would do it the first way with the list being filled as you go. Thanks, Marko. http://markorodriguez.com On Jun 16, 2011, at 2:23 AM, Mattias Persson wrote: 2011/6/12 Marko Rodriguez okramma...@gmail.com Hi, In Gremlin (http://gremlin.tinkerpop.com), you can do: startSet = [ ... ] // fill an array/set with leaves. startSet.in.sideEffect{it.myProperty = 'blah'}.loop(2){true} In this code, it assumes no cycles in the graph and that the root of the tree as no incoming edges. That would actually set properties on entities, right? I think what he's asking for is just to collect properties along the way. If you use a traversal from the leaf and tell it to traverse up to the root, when you're there you have the full path there as an object (reversed though) but can get all information from it directly w/o the need to gather stuff along the way. Example: for ( Path pathToRoot : Traversal.description().relationships( PARENT,OUTGOING).traverse(myFileNode) ) { System.out.println( Path to root of + myFileNode + is + pathToRoot ); } ...and the path contains all the information you need. --- If you are using Gremlin 1.1-SNAPSHOT (all pumped up on it), you can do: startSet.as('x').in.sideEffect{it.myProperty='blah'}.loop('x'){true} Finally: if you have lots and lots of data, then you will want to not have AUTOMATIC transactions and will want to put the graph into MANUAL transaction mode before you start the traversal. I can say more if you are interested. See ya, Marko. http://markorodriguez.com On Jun 11, 2011, at 9:42 PM, Matt C wrote: Hey all, I'm new to Neo4j and I'm really liking it. I'm not sure if its the right tool for my particular job though. I'd like to model a rather larse filesystem (multi-petabyte) and use it to overlay additional metadata or info. The nice thing about neo4j is that if someone moves deeply nested data, all I have to do is update a relationship to point somewhere else. I'm wondering if anyone can show me a traversal method that will walk backwards to the reference node, adding a name property to a list as it goes. -Matt ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Announcing Neo4j 1.4 M04 “Kiruna Stol”
That's awesome! Thanks. Aseem On Fri, Jun 17, 2011 at 11:54 AM, Michael Hunger michael.hun...@neotechnology.com wrote: yes it does. one tx per batch M Sent from my iBrick4 Am 17.06.2011 um 19:17 schrieb Aseem Kishore aseem.kish...@gmail.com: Quick q: will the new REST API batching feature treat the operations as a single transaction? That would be convenient for some scenarios I think, like swapping two nodes in a linked list. Aseem On Fri, Jun 10, 2011 at 7:48 AM, Peter Neubauer peter.neuba...@neotechnology.com wrote: Hello graphistas, today brings us the (hopefully) latest milestone towards the “Kiruna Stol” 1.4 release of Neo4j. You will find it contains two new major features that are meant to make your interaction with the database easier and more efficient as well as the usual range of minor bug fixes. Cypher, an expressive query language for graphs == So far, the main means of interacting with the graph have been either the Traversal API or the REST API, leaving Neo4j wanting of a portable, expressive query language. Starting today, however, we are pleased to release Cypher, the first iteration of a query language designed for both application developers and operations specialists that want to create ad-hoc, portable queries against a Neo4j instance. You will find that the syntax has an SQL flavour to it so it is easy to get used to but all the graphy semantics goodness is there, ready to be harnessed. So, go right ahead and check out the manual at http://docs.neo4j.org/chunked/1.4.M04/query-lang.html and tell us what you think. Batching for the REST API Cypher is not the only major feature in this milestone. The battle-proven REST interface gets new functionality, allowing definition and execution of batch operations. You can now post JSON encoded requests that contain any number of commands to the “batch URI” of the server and have the server execute them in one go, reducing this way the load on the server, the client and the network. Documentation on this experimental feature is available at http://docs.neo4j.org/chunked/1.4.M04/rest-api-batch-ops.html The above might be the stars of the show but, as always, there are many bug fixes and minor improvements scattered around the code. If you are curious, the changelogs have all the juicy details. So, go to http://neo4j.org to download 1.4.M04 and to http://blog.neo4j.org/2011/06/kiruna-stol-14-milestone-4.html to read more about it and let us know what you think. Cheers, /peter ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Integer cost property
Jim, The best I can do as far as a failing test is this series of curl calls. I create 2 nodes, then connect them with a relationship that has a property called distance. When I ask for paths without specifying the algorithm, I get back the path with the relationship. When I specify the algorithm as dijkstra with a cost property of distance, I get back a 400 Bad Request with a stack trace. Now interestingly, if I create the relationship with a distance of 2.0, it works. Unfortunately, PHP's json_encode method turns a double 2.0 into an integer 2. My original thought was to make the DoubleEvaluator class cast the Integer cost property value to a basic double before wrapping it in a Double object. Here is the series of commands: = SHELL $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{name:A}' http://localhost:7474/db/data/node HTTP/1.1 201 Created Content-Length: 996 Location: http://localhost:7474/db/data/node/73 Content-Encoding: UTF-8 Content-Type: application/json Access-Control-Allow-Origin: * Server: Jetty(6.1.25) { outgoing_relationships : http://localhost:7474/db/data/node/73/relationships/out;, data : { name : A }, traverse : http://localhost:7474/db/data/node/73/traverse/{returnType};, all_typed_relationships : http://localhost:7474/db/data/node/73/relationships/all/{-list||types}, property : http://localhost:7474/db/data/node/73/properties/{key};, self : http://localhost:7474/db/data/node/73;, properties : http://localhost:7474/db/data/node/73/properties;, outgoing_typed_relationships : http://localhost:7474/db/data/node/73/relationships/out/{-list||types}, incoming_relationships : http://localhost:7474/db/data/node/73/relationships/in;, extensions : { }, create_relationship : http://localhost:7474/db/data/node/73/relationships;, all_relationships : http://localhost:7474/db/data/node/73/relationships/all;, incoming_typed_relationships : http://localhost:7474/db/data/node/73/relationships/in/{-list||types} } $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{name:B}' http://localhost:7474/db/data/node HTTP/1.1 201 Created Content-Length: 996 Location: http://localhost:7474/db/data/node/74 Content-Encoding: UTF-8 Content-Type: application/json Access-Control-Allow-Origin: * Server: Jetty(6.1.25) { outgoing_relationships : http://localhost:7474/db/data/node/74/relationships/out;, data : { name : B }, traverse : http://localhost:7474/db/data/node/74/traverse/{returnType};, all_typed_relationships : http://localhost:7474/db/data/node/74/relationships/all/{-list||types}, property : http://localhost:7474/db/data/node/74/properties/{key};, self : http://localhost:7474/db/data/node/74;, properties : http://localhost:7474/db/data/node/74/properties;, outgoing_typed_relationships : http://localhost:7474/db/data/node/74/relationships/out/{-list||types}, incoming_relationships : http://localhost:7474/db/data/node/74/relationships/in;, extensions : { }, create_relationship : http://localhost:7474/db/data/node/74/relationships;, all_relationships : http://localhost:7474/db/data/node/74/relationships/all;, incoming_typed_relationships : http://localhost:7474/db/data/node/74/relationships/in/{-list||types} } $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{to:http://localhost:7474/db/data/node/74,type:GO,data:{name:AB,distance:2}}' http://localhost:7474/db/data/node/73/relationships HTTP/1.1 201 Created Content-Length: 421 Location: http://localhost:7474/db/data/relationship/64 Content-Encoding: UTF-8 Content-Type: application/json Access-Control-Allow-Origin: * Server: Jetty(6.1.25) { start : http://localhost:7474/db/data/node/73;, data : { distance : 2, name : AB }, self : http://localhost:7474/db/data/relationship/64;, property : http://localhost:7474/db/data/relationship/64/properties/{key};, properties : http://localhost:7474/db/data/relationship/64/properties;, type : GO, extensions : { }, end : http://localhost:7474/db/data/node/74; } # This succeeds $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{to:http://localhost:7474/db/data/node/74,type:GO}' http://localhost:7474/db/data/node/73/paths HTTP/1.1 200 OK Content-Length: 297 Content-Encoding: UTF-8 Content-Type: application/json Access-Control-Allow-Origin: * Server: Jetty(6.1.25) [ { start : http://localhost:7474/db/data/node/73;, nodes : [ http://localhost:7474/db/data/node/73;, http://localhost:7474/db/data/node/74; ], length : 1, relationships : [ http://localhost:7474/db/data/relationship/64; ], end : http://localhost:7474/db/data/node/74; } ] # This fails $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{to:http://localhost:7474/db/data/node/74,type:GO,algorithm:dijkstra,cost property:distance}' http://localhost:7474/db/data/node/73/paths HTTP/1.1 400 Bad
Re: [Neo4j] Integer cost property
Hi Josh, I'm just wiring up a bunch of code that implements REST paging, and then I'll codify these tests and sort it out. Jim On 18 Jun 2011, at 01:17, Josh Adell wrote: Jim, The best I can do as far as a failing test is this series of curl calls. I create 2 nodes, then connect them with a relationship that has a property called distance. When I ask for paths without specifying the algorithm, I get back the path with the relationship. When I specify the algorithm as dijkstra with a cost property of distance, I get back a 400 Bad Request with a stack trace. Now interestingly, if I create the relationship with a distance of 2.0, it works. Unfortunately, PHP's json_encode method turns a double 2.0 into an integer 2. My original thought was to make the DoubleEvaluator class cast the Integer cost property value to a basic double before wrapping it in a Double object. Here is the series of commands: = SHELL $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{name:A}' http://localhost:7474/db/data/node HTTP/1.1 201 Created Content-Length: 996 Location: http://localhost:7474/db/data/node/73 Content-Encoding: UTF-8 Content-Type: application/json Access-Control-Allow-Origin: * Server: Jetty(6.1.25) { outgoing_relationships : http://localhost:7474/db/data/node/73/relationships/out;, data : { name : A }, traverse : http://localhost:7474/db/data/node/73/traverse/{returnType};, all_typed_relationships : http://localhost:7474/db/data/node/73/relationships/all/{-list||types}, property : http://localhost:7474/db/data/node/73/properties/{key};, self : http://localhost:7474/db/data/node/73;, properties : http://localhost:7474/db/data/node/73/properties;, outgoing_typed_relationships : http://localhost:7474/db/data/node/73/relationships/out/{-list||types}, incoming_relationships : http://localhost:7474/db/data/node/73/relationships/in;, extensions : { }, create_relationship : http://localhost:7474/db/data/node/73/relationships;, all_relationships : http://localhost:7474/db/data/node/73/relationships/all;, incoming_typed_relationships : http://localhost:7474/db/data/node/73/relationships/in/{-list||types} } $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{name:B}' http://localhost:7474/db/data/node HTTP/1.1 201 Created Content-Length: 996 Location: http://localhost:7474/db/data/node/74 Content-Encoding: UTF-8 Content-Type: application/json Access-Control-Allow-Origin: * Server: Jetty(6.1.25) { outgoing_relationships : http://localhost:7474/db/data/node/74/relationships/out;, data : { name : B }, traverse : http://localhost:7474/db/data/node/74/traverse/{returnType};, all_typed_relationships : http://localhost:7474/db/data/node/74/relationships/all/{-list||types}, property : http://localhost:7474/db/data/node/74/properties/{key};, self : http://localhost:7474/db/data/node/74;, properties : http://localhost:7474/db/data/node/74/properties;, outgoing_typed_relationships : http://localhost:7474/db/data/node/74/relationships/out/{-list||types}, incoming_relationships : http://localhost:7474/db/data/node/74/relationships/in;, extensions : { }, create_relationship : http://localhost:7474/db/data/node/74/relationships;, all_relationships : http://localhost:7474/db/data/node/74/relationships/all;, incoming_typed_relationships : http://localhost:7474/db/data/node/74/relationships/in/{-list||types} } $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{to:http://localhost:7474/db/data/node/74,type:GO,data:{name:AB,distance:2}}' http://localhost:7474/db/data/node/73/relationships HTTP/1.1 201 Created Content-Length: 421 Location: http://localhost:7474/db/data/relationship/64 Content-Encoding: UTF-8 Content-Type: application/json Access-Control-Allow-Origin: * Server: Jetty(6.1.25) { start : http://localhost:7474/db/data/node/73;, data : { distance : 2, name : AB }, self : http://localhost:7474/db/data/relationship/64;, property : http://localhost:7474/db/data/relationship/64/properties/{key};, properties : http://localhost:7474/db/data/relationship/64/properties;, type : GO, extensions : { }, end : http://localhost:7474/db/data/node/74; } # This succeeds $ curl -i -HAccept:application/json -HContent-Type:application/json -X POST -d '{to:http://localhost:7474/db/data/node/74,type:GO}' http://localhost:7474/db/data/node/73/paths HTTP/1.1 200 OK Content-Length: 297 Content-Encoding: UTF-8 Content-Type: application/json Access-Control-Allow-Origin: * Server: Jetty(6.1.25) [ { start : http://localhost:7474/db/data/node/73;, nodes : [ http://localhost:7474/db/data/node/73;, http://localhost:7474/db/data/node/74; ], length : 1, relationships : [ http://localhost:7474/db/data/relationship/64; ], end :
Re: [Neo4j] Can I model a Graph data structure without persisting it in DB using Neo4j ?
Any suggestions on this please ? On Fri, Jun 17, 2011 at 11:03 PM, V vlin...@gmail.com wrote: I created a graph model with 2 classes Node and Element as follows: public class Node { @RelatedTo(type = ELEMENT, elementClass = Element.class, direction = OUTGOING) private SetElement Element; public void addElement(Element e) { relateTo(e, Relationships.ELEMENT.toString()); } } public class Element{ public String name; } I want to create an in memory graph structure without persisting the nodes as follows : Node n = new Node(); n.addElement(new Element()); *However it throws an exception as the Node n has not been persisted so the call to relateTo(..) fails. * If instead I do n.persist() and then call addElement(..) it works fine as the aspect kicks in. Any workaround for this ? That is, is there a way I can still use the above style without persisting the Node object ? My application needs this as first I create a structure and persist it, and then I create another structure to pass around some values to the persisted structure when doing some computations. -Karan ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Generating suggestions in a Neo4j db
Hi Jim, The way you mentioned, that will take care of these suggestions, thanks for the same. But here's a tougher problem If I have a database of 50k people, and I want to find friends based upon the places that those 50k people have visited (i.e. People who have visited same places as me should be suggested as friends to me), then how to to that... I've thought all that I could, but I always come up with something stupid... Any suggestions about this? On 6/18/11, Jim Webber j...@neotechnology.com wrote: Hi Aman, I'm puzzled. Why not Aman--HAS_VISITED--USA Jim--HAS_VISITED--India And if: Aman--FRIEND-OF--Jim Then you just need to traverse from Aman following outgoing FRIEND_OF relationships to all your friends, and then traverse out their outgoing HAS_VISITED relationships to find places your friends have been. The general idiom with Neo4j is use indexes the find your start node (e.g. the Aman node in the above) then traverse from there. Jim ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Amandeep +91-9878483857 ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user
Re: [Neo4j] Generating suggestions in a Neo4j db
Hi Jim, The way you mentioned, that will take care of these suggestions, thanks for the same. But here's a tougher problem If I have a database of 50k people, and I want to find friends based upon the places that those 50k people have visited (i.e. People who have visited same places as me should be suggested as friends to me), then how to to that... I've thought all that I could, but I always come up with something stupid... Any suggestions about this? On 6/18/11, Aman aman.6...@gmail.com wrote: Hi Jim, The way you mentioned, that will take care of these suggestions, thanks for the same. But here's a tougher problem If I have a database of 50k people, and I want to find friends based upon the places that those 50k people have visited (i.e. People who have visited same places as me should be suggested as friends to me), then how to to that... I've thought all that I could, but I always come up with something stupid... Any suggestions about this? On 6/18/11, Jim Webber j...@neotechnology.com wrote: Hi Aman, I'm puzzled. Why not Aman--HAS_VISITED--USA Jim--HAS_VISITED--India And if: Aman--FRIEND-OF--Jim Then you just need to traverse from Aman following outgoing FRIEND_OF relationships to all your friends, and then traverse out their outgoing HAS_VISITED relationships to find places your friends have been. The general idiom with Neo4j is use indexes the find your start node (e.g. the Aman node in the above) then traverse from there. Jim ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user -- Amandeep +91-9878483857 -- Amandeep +91-9878483857 ___ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user