Re: [Neo4j] Cypher DSL and result mapping

2011-11-04 Thread Tobias Ivarsson
On Fri, Nov 4, 2011 at 10:45 AM, Rickard Öberg <
rickard.ob...@neotechnology.com> wrote:

> On 11/4/11 17:29 , Daniel Yokomizo wrote:
> >> What are the projection methods that you would like to see? What are
> >> common usecases?
> >
> > Supporting @java.beans.ConstructorProperties is nice because we can use
> > immutable objects as dtos.
>
> Right, that is a good point, and that will definitely be supported.
>

+1, a really good suggestion. I'm not a big fan of that annotation per se,
it would have been nicer to annotate each parameter individually, but it is
standardized which makes it VERY compelling.

-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857 (Swe); +1 650 450 3806 (US)
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Cypher DSL and result mapping

2011-11-04 Thread Tobias Ivarsson
I started a prototype for something similar a while back:
https://github.com/thobe/neo4j-community-experiments/tree/cypher-annotations

It has a different approach to constructing queries, it uses annotations
with query strings in them, but uses compile time annotation processing to
process those annotations in order to verify syntax. In the future (when
Cypher supports it) I'd like to do type checking as well.

What it has that is similar though is the way it converts the result to
java classes. I know that Spring-Data-Neo4j does similar things as well.
Since that kind of conversion seems to be something that multiple higher
level libraries do, it would probably make sense to move it to a shared
place.

Note please that this branch is just three hours worth of throwing some
ideas together, it's not complete, but should at least display the ideas.

-tobias

On Fri, Nov 4, 2011 at 6:10 AM, Rickard Öberg <
rickard.ob...@neotechnology.com> wrote:

> Hi,
>
> I've briefly started to look at how to map Cypher query results into
> DTO's. I'm using the QueryDSL helper classes to do it, but instead of
> putting the projection methods into the query object (as QueryDSL does
> it), I have a separate Projection class for it. The reason is that I
> don't want to require DSL users to have access to the execution engine,
> which will obviously not be the case if you are creating queries on the
> client which are to be sent to the server.
>
> Here's an example of what I want it to look like when used:
> Projection projection = new Projection(engine);
>
> Iterable friends = projection.iterable( start( node( "john",
> john ) )
>   .match( path().from( "john" ).out( "friend" )
>   .link().out( "friend" ).to( "fof" ) )
>   .returns( properties( "john.name", "fof.name" ) ),
> Friend.class );
> System.out.println( friends );
> ---
> So the Projection encapsulates the reference to the query execution,
> which means that you don't need to have a reference to it when executing
> the queries to do the projection. The "iterable" method takes a DSL
> query and the Java class you want the results to be projected into.
> Pretty straightforward.
>
> For now the code assumes that the fields in Friend is the same as the
> order of the return results. This is broken, and will be fixed later to
> use proper mapping, preferably with aliases in the return statement as
> hints.
>
> What are the projection methods that you would like to see? What are
> common usecases?
>
> /Rickard
>
> --
> Rickard Öberg
> Developer
> Neo Technology
> Twitter: @rickardoberg, Skype: rickardoberg
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857 (Swe); +1 650 450 3806 (US)
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


[Neo4j] Article: "The Coming SQL Collapse"

2011-10-14 Thread Tobias Ivarsson
We had an interesting discussion about this internally at Neo Technology
today. We thought it might be of interest to the broader community. I don't
think the discussion is over, so it would be interesting to continue it on
the public mailing list.

It regards the initial paragraphs of an article posted to dzone recently:
http://www.dzone.com/links/rss/the_coming_sql_collapse.html
It mentions Neo4j and how the author dislikes a common way of using Neo4j
for building applications.

It would be interesting to hear suggestions on how to improve this.

Forwarded conversation follows:

On Fri, Oct 14, 2011 at 10:13 AM, Tobias Ivarsson <
tobias.ivars...@neotechnology.com> wrote:

> I found this while reading feeds in bed last night:
>
> *The Coming SQL Collapse*
> http://www.dzone.com/links/rss/the_coming_sql_collapse.html
>
> (Sent from Flipboard <http://flipboard.com>)
>
>
> The things he say about SQL vs NOSQL is not very interesting, but I'd like
> to raise what he says about Neo4j:
>
>  I looked at neo4j briefly the other day, and quite predictably thought
>> ‘wow, this looks like a serious tinkertoy: it‘s basically a bunch of nodes
>> where you just blob your attributes.‘ Worse than that, to wrap objects
>> around it, you have to have them explicitly incorporate their node class,
>> which is ugly, smelly, violates every law of separation of concerns and
>> logical vs. physical models. On the plus side, as I started to look at it
>> more, I realized that it was the perfect way to implement a backend for a
>> bayesian inference engine (more on that later). Why? Because inference
>> doesn‘t care particularly about all the droll requirements that are settled
>> for you by SQL, and there are no real set operations to speak of.
>
>
> He attacks our pattern of building domain models with Neo4j, calling it
> "ugly", "smelly" and "in violation of every law of separation of concerns
> and logical vs. physical models". Is he right? My feeling is that he is
> brain washed with too many so called "best practices", but Neo4j has been my
> main model for a long time now, my perspective is likely skewed. I'd like to
> hear your thoughts.
>
> --
> Tobias Ivarsson 
>

On Fri, Oct 14, 2011 at 10:32 AM, Rickard Öberg <
rickard.ob...@neotechnology.com> wrote:
>
>
> Well, I'd tend to agree with the author. Mixing persistence details with
> the domain model itself is really a bad idea. Infrastructure details should
> not pollute the domain logic as it does with the currently "suggested" usage
> of Neo4j. But I think both Spring Data Graph and the Qi4j usage model fixes
> this, as it allows you to keep many of those things outside of the domain
> code.
>
> /Rickard


On Fri, Oct 14, 2011 at 11:45 AM, Tobias Ivarsson  wrote:

> On Fri, Oct 14, 2011 at 11:21 AM, Rickard Öberg <
> rickard.ob...@neotechnology.com> wrote:
>
>> On 10/14/11 17:16 , Tobias Ivarsson wrote:
>>
>>> I was hoping for a bit more elaboration, of why it is a bad idea.
>>>
>>> Spring Data Neo4j operates mainly in the same way (at least it did when
>>> I was part of the design process), it just hides the details of it.
>>>
>>> The model we suggest is not to mix infrastructure details (nodes,
>>> relationships, traversals) with the domain logic. We suggest the domain
>>> logic be a separate layer, acting on domain data objects (defined as a
>>> set of interfaces). What we do suggest though is for those domain data
>>> objects to be implemented as wrappers of nodes and relationships.
>>>
>>
>> That sounds like "transaction script+anemic domain model", which is an
>> anti-pattern as well.
>
>
> I'm guessing the anemic domain model is what you are pointing out as the
> anti-pattern. I can see how transaction scripts are and ADM usually come
> together though.
>
> References:
>
> http://martinfowler.com/eaaCatalog/transactionScript.html
> http://martinfowler.com/bliki/AnemicDomainModel.html
>
>
>
>> Domain logic should be in the domain objects, and so splitting them into
>> several layers confuse things more than it helps.
>
>
> I agree with you, SDN "solves" this, and does so well.
>
>
>> So is the bad part of it just the part of having the implementation of
>>> your domain data objects deal with the Neo4j API, instead of having DTOs
>>> and DAOs that you load from the database, operate on in memory, then
>>> store back to the db at explicit points? Or are there deeper issues than
>>> that?
>>>
>>
>> It relates to testability (you

Re: [Neo4j] Clarification on read and write locks

2011-09-26 Thread Tobias Ivarsson
On Mon, Sep 26, 2011 at 2:28 AM, Bryce  wrote:

> Is there any reason that access to the lock manager is a little difficult?
>  Is there any issue with using it (both single server and HA)?  Are their
> any issues to look out for?  And does the above code look workable?
>

The reason the LockManager is "hidden away" is because it is considered an
implementation detail.
We reserve the right to change it at any point without prior notice.
>From one version to another, the API of this class could potentially look
completely different, or have very different semantics.
If you write code that depend on implementation internal classes it will at
best cause you compilation errors when upgrading to a later version of
Neo4j, at worst break in subtle ways after you've deployed your application.

There is another important thing to note about your sample code:

On Mon, Sep 26, 2011 at 2:28 AM, Bryce  wrote:
>
>private void acquireLock( LockType lockType )
>{
>GraphDatabaseService graphDb = baseNode.getGraphDatabase();
>if ( lockType == LockType.READ && graphDb instanceof
> AbstractGraphDatabase )
>{
>((AbstractGraphDatabase)
> baseNode.getGraphDatabase()).getConfig().getLockManager().getReadLock(
> baseNode );
>}
>else {
>// default to write lock if read locks unavailable
>baseNode.removeProperty( "___dummy_property_to_acquire_lock___"
> );
>}
>}
>

The two different code paths in this code have very different semantics. The
first path (if it is a read lock and the db is and AbstractGraphDatabase)
will acquire a read lock and hold it indefinitely. The second path will try
to remove a dummy property, resulting in a write lock that gets tied to the
current transaction, and thus gets released when the transaction completes.

There is another class involved in the lock management in Neo4j, it is
called LockReleaser. All locks that are acquired through the public APIs are
registered with the LockReleaser. This will tie the lock to the transaction
to ensure that the lock is released when the transaction completes. If the
lock is only acquired through the LockManager, and not registered with the
LockReleaser, you need to manually release the lock.


The reason for the remove-non-existing-property-hack is that we haven't
decided on a good public API for lock management. The questions around this
are:
* Should there be release() methods for locks as well? or should locks
always be tied to the transaction?
* Where should the methods live? On the entities themselves? i.e.
node.acquireReadLock() / node.aquireWriteLock() or on the Transaction object
to signal that locks are tied to the life cycle of the transaction? i.e.
tx.readLock(node) / tx.writeLock(node)

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857 (Swe); +1 650 450 3806 (US)
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Synchronization of EmbeddedReadOnlyGraphDatabase - Bug?

2011-08-01 Thread Tobias Ivarsson
I think a bit of elaboration might be in order.

EmbeddedReadOnlyGraphDatabase was created for one specific purpose:

Being able to interactively introspect a graph without having to shut down
the application that uses it.

Specifically the tools that we wanted to support with this were the Neo4j
shell and Neoclipse.

EmbeddedReadOnlyGraphDatabase (EROGD) has two major issues with way caching
is done internally in Neo4j (one issue with each cache):

   - When the EROGD reads data from the file system it will, like a normal
   EGD, cache the node and relationship objects. If a normal EGD modifies the
   graph "under the feet" of the EROGD, there is no way for the EROGD to know
   that the data in cache is now stale, which will lead to an inconsistent view
   of the graph. If for example the EROGD has cached Node[15] with the
   information that it is connected to some other node through
   Relationship[344], and Relationship[344] is deleted you will get
   InvalidRecordException (as you described). And of course if relationships
   are added to Node[15] these will not be seen at all by the EROGD (until
   Node[15] is evicted from the cache due to not being used for a while).
   - Neo4j also caches data on the filesystem level by memory mapping (mmap)
   hot regions of the store files. Writes to these regions will not be flushed
   to the actual file until the mmapped window is evicted due to being less hot
   than other windows, or when the transaction log for Neo4j is rotated. This
   means that from the p.o.v. of the EROGD the actual data written to disk will
   look inconsistent. Which would also lead to InvalidRecordExcaption. This
   situation is actually made even more complicated by the fact that unix
   operating systems will attempt to share memory mapped data from the same
   file between multiple processes, but the normal EGD and the EROGD will not
   make the same decisions on which regions to mmap, they might not even decide
   on the same size for mmap windows. We haven't tested how well different
   operating systems deal with reading data that was written to an mmap region
   through non-mmap syscalls from a different process, most likely this varies
   from OS to OS.

The second of these problems is of course the worst, since it cannot be
worked around. The first one can be mitigated by configuring Neo4j to not
use the object cache, by passing the cache_type=none parameter to the
constructor of the EROGD. This should really be made default for EROGD,
unless we decide to completely remove EROGD.

I hope that sheds some light on the reasons why you experience these
problems with EmbeddedReadOnlyGraphDatabase, and what the intention of
creating it was.

As a side note I can mention that I had a different idea for how to solve
the introspection-of-live-graph problem at the time
EmbeddedReadOnlyGraphDatabase was created: Create network based
implementation of the GraphDatabaseService API and connect directly to the
running instance. This would completely avoid the cache staleness problem,
but at the cost of network overhead for each graph operation, which is
probably fine for tooling purposes. With the JVM agent attach protocol it
would be possible to inject such a server into a running graph database that
wasn't originally configured for it. I in fact implemented this as the
RemoteGraphDatabase subproject.
Since my colleagues did not share my vision about that idea, this project
didn't receive much attention after its initial inception. It was also never
really used for these purposes, but rather misused for building
applications, leading us to deprecate the project. When we then later
discovered a severe bug in the implementation of the remote transaction
handling logic, we completely removed the project.
I still believe this to be a superior model for tools, but would build it
differently if I were to build it today.

-tobias

On Mon, Aug 1, 2011 at 4:48 PM, Jim Webber  wrote:

> Hi Mathias,
>
> EmbeddedReadOnlyGraphDatabase is not quite what it seems, and I think
> should be deprecated/removed. The correct way for database instances to
> become consistent is through the HA protocol.
>
> Jim
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] cypher packages

2011-07-28 Thread Tobias Ivarsson
They should be in the neo4j-cypher-1.4.jar.

That jar-file should be among your dependencies if you simply depend on (in
maven):


  org.neo4j
  neo4j
  1.4



Cheers,
Tobias

On Thu, Jul 28, 2011 at 12:07 PM, Jean-Sébastien Stoffen wrote:

> Hi,
>
> Sorry for the newbie questions who happens very frequently at the begining.
>
> I'm trying to submit some request to my graph using the cypher query
> language
>
> I get those messages :
> unable to resolve class CypherParser
> unable to resolve class ExecutionResult
> ...
>
> when I try the example showed here :
> http://docs.neo4j.org/chunked/1.4.M04/query-lang.html
>
> After some research, I've not found where I can download those packages
> I've searched for org.neo4j.cypher.javacompat but without succes.
>
> Could you tell me where to find it?
>
> Regards,
> Jean-Sébastien Stoffen.
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Django + Neo4j seamless installation error: No module named CallbackFilter

2011-07-17 Thread Tobias Ivarsson
ango documentation:
https://docs.djangoproject.com/en/dev/topics/logging/#id3 the CallbackFilter
feature seems to not be released yet. How it got into your settings.py (I'm
guessing that is where 'require_debug_false' is configures) I don't know. If
I had not had your complete description of everything you did, I would have
guessed that you either:
a) Followed the documentation of the wrong version of Django from their
website (the dev version is easier to find then the ones for released
versions). Or
b) Used a newer version of Django to auto-generate the settings.py file, and
then an older version to run the code.

But since neither of those steps are in your description, my best guess is
that the Django folks released parts of that feature too early. You'd think
there be more mentionings of this problem online then though. Do you think
you could grep through your settings.py for CallbackFilter
and/or require_debug_false to see if that might be the problem.

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] No index provider 'lucene' found

2011-06-09 Thread Tobias Ivarsson
   at java.lang.Class.newInstance0(Class.java:355)
>at java.lang.Class.newInstance(Class.java:308)
>at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
>at
> org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
>at
> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:463)
>at
> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
>at
> org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
>at
> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
>at
> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
>at
> org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
>at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
>at
> org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
>at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
>at org.mortbay.jetty.Server.handle(Server.java:324)
>at
> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
>at
> org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
>at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
>at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
>    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
>at
> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
>at
> org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Generic expansion?

2011-05-20 Thread Tobias Ivarsson
org.neo4j.kernel.Traversal.expanderForAllTypes();

On Fri, May 20, 2011 at 4:53 PM, Marko Rodriguez wrote:

> Hey,
>
> Yea. Thats what I'm looking for, but it doesn't seem to be part of the API?
> .. ?
>
> I can only find StandardExpander (abstract) and OrderedByTypeExpander.
>
> Thoughts?, -- IM me if you wish.
> Marko.
>
> On May 20, 2011, at 8:46 AM, Peter Neubauer wrote:
>
> > Marko,
> > you could do an AllExpander(Direction.BOTH) or really any subclass of
> > Expander, http://api.neo4j.org/current/org/neo4j/graphdb/Expander.html
> >
> > Does that help?
> >
> > 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, May 20, 2011 at 4:43 PM, Marko Rodriguez  >wrote:
> >
> >> Hi,
> >>
> >> How do I do something like this:
> >>
> >>   PathFinder finder = GraphAlgoFactory.shortestPath(new
> >> OrderedByTypeExpander().add(DynamicRelationshipType.withName("knows")),
> 6);
> >>
> >> ...but where I don't care about the RelationshipType taken (and I don't
> >> want to enumerate all the types I have as I have 100's of types).
> >>
> >> Above, when I don't have "knows," it doesn't find any paths.
> >>
> >> Thanks,
> >> Marko.
> >>
> >> http://markorodriguez.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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] about relationship whit himself.

2011-05-18 Thread Tobias Ivarsson
Neo4j does not support relationships with the same start node as end node
yet.

This is being worked on however. We actually had it working, passing even
the meanest test cases we could come up with, for a few minutes last friday.
But then we were given a choice between the functionality of these self
relationships, or a substantial performance improvement. We went for the
latter, putting self relationships on hold for a while. We have some ideas
that could make it possible to put self relationships back in, but I don't
know when we can get there.

Cheers,
Tobias

On Wed, May 18, 2011 at 8:54 PM, Jose Angel Inda Herrera <
jai...@estudiantes.uci.cu> wrote:

> hello list,
> I have a question you would like to clarify,
> in a graph may have a sibling with himself, that I have it clear.
> neo4j now allow this??, because when I create a relation from ni to nf,
> where ni = nf gives me a exetion,
>
> thanks very much,
> cheers.
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Color suggestions for the Self-Relationship bike shed

2011-05-17 Thread Tobias Ivarsson
Having an API that changes behavior based on configuration is a very bad
idea.
It makes the system very hard to work with.

On Tue, May 17, 2011 at 8:30 PM, Craig Taverner  wrote:

> What about a system config enabling/disabling loops? Then we could have
> option 1, but for people that never loops, they can still get the extra
> loop
> check by setting the system config option.
>
>
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] GraphRepository parameter

2011-05-17 Thread Tobias Ivarsson
Hi,

Yes, it has to be a special type. Your class has to extend GraphBacked (as
clearly stated by the error you are getting).

The AspectJ compiler will make your class extend GraphBacked automatically
if you have annotated it with either NodeEntity or RelationshipEntity.

The error you are experiencing will usually occur when AspectJ is not
present, are you sure you have set up AspectJ properly in your build
pipeline.

Cheers,
Tobias

On Tue, May 17, 2011 at 2:48 PM, mujer_esponja wrote:

> Hello!!
> I have asked another question just a few hours ago, but I am new on neo4j
> and I need some help.
>
> Now the problem is with this class
>
> http://static.springsource.org/spring-data/data-graph/docs/current/api/org/springframework/data/graph/neo4j/repository/GraphRepository.html
>
> In a declaration I need to do: GraphRepository
> as I have seen in examples.
>
> But I am getting the error:
>
> Bound mismatch: The type MyClass is not a valid substitute for the bounded
> parameter > of the type
>  GraphRepository
>
> Must it be a special type? Where is the error?? Thanks in advance
>
> --
> View this message in context:
> http://neo4j-user-list.438527.n3.nabble.com/GraphRepository-parameter-tp2952354p2952354.html
> Sent from the Neo4J User List mailing list archive at Nabble.com.
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] ClosedChannelExceptions in highly concurrent environment

2011-05-16 Thread Tobias Ivarsson
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  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  >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
> > this would be a common problem, though perhaps I am missing something?
> >
> > SimpleFSDirectory seems a bit of a performance bottleneck, so I switched
> to
> > MMapDirectory and the problem did go away.  I didn't see a way to switch
> > implementations w/out modifying neo4j code, so I changed LuceneDataSource
> as
> > follows:
> >
> >  static Directory getDirectory( String storeDir,
> >IndexIdentifier identifier ) throws IOException
> > {
> >MMapDirectory dir=new MMapDirectory(getFileDirectory( storeDir,
> > identifier), null);
> >if(MMapDirectory.UNMAP_SUPPORTED) {
> >dir.setUseUnmap(true);
> >}
> >return dir;
> >  }
> >
> > So I'm wondering if others have seen this problem and/or if there is a
> > recommended solution?  Our product runs on quite a few different
> operating
> > systems, so I have some reservations about using MMapDirectory as well
> > (javadoc speaks of a few caveats on Windows, 64 vs 32, etc). Also, I'd
> >

Re: [Neo4j] Color suggestions for the Self-Relationship bike shed

2011-05-16 Thread Tobias Ivarsson
Does anyone NOT planning to use loops have an opinion in the matter?
That would be very valuable input.

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


[Neo4j] Color suggestions for the Self-Relationship bike shed

2011-05-16 Thread Tobias Ivarsson
There has been a few discussions around supporting Loops, relationships with
the same start node as end node, recently. Both here on the mailing list,
and even more at the Neo Technology office.

We have a working patch for handling loops in Neo4j, but one final piece is
missing: what should the API look like for creating a loop? There are three
suggestions for this, I'll list them with the pros and cons we've found for
each. It would be great if you could provide some feedback on what you think
on the matter, and which alternative you prefer.

The alternatives:

1. let the existing createRelationshipTo(Node,RelationshipType) create loops
if the same node is passed as argument.
2. add a new createLoop(RelationshipType) method for creating loops.
3. add a createRelationshipOrLoop(Node,RelationshipType) method that would
work like createRelationshipTo, except it would permit creating loops.


The pros and cons:

PRO 1: does not add a new method to the API that developers have to learn.

CON 1: changes the semantics of the createRelationshipTo method slightly
from what it is today.

CON 1: will not help you catch programming errors where you've mistakenly
written code that creates a relationship to the same node (most of the cases
where code creates relationships to the wrong node it is to the same node).

PRO 2: will let you be explicit of when creating a loop.

PRO 2: will let createRelationshipTo preserve the semantics it has today.
Which will help catching many create relationships to the wrong node cases.

CON 2: will force you to be explicit about loops, most applications that
wan't loops will just treat them as any relationship where the start node
and end node will just happen to be the same.

PRO 3: adds loops as a generic construct (start and end just happens to be
the same) without changing the current semantics of createRelationshipTo

CON 3: Introduces a new method that creates relationships between any two
nodes.


It would of course be possible to go with both 2 and 3, and I think option 3
makes more sense as an addition to option 2, rather than as an alternative
to it.

What do you think?
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo4j and Java 1.5

2011-05-16 Thread Tobias Ivarsson
The service code was written before Java 1.5 support was dropped, so that
will still work.

There are a few other places where we use java 6 APIs, mainly
java.util.Queue and java.util.concurrent.TimeUnit. javax.scripting is super
simple to support under 1.5 (there is a backport package), and it is only
used in the server.

Java 1.5 is not supported by Neo4j, since it has reached its End Of Life.

If really need it, you could create your own (unsupported) branch of Neo4j
and modify that yourself to make things work, or pay Neo Technology for
commercial Java 1.5 +Neo4j support.

Cheers,
Tobias

On Sat, May 14, 2011 at 1:04 AM, Peter Neubauer <
peter.neuba...@neotechnology.com> wrote:

> Julien,
> I think there are some parts in the server that require Java 1.6 liek the
> javax.scripting , but I am not sure about the kernel. I suspect some of the
> service loader extensions being Java 1.6.
>
> Anyone else having that info?
>
> 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, May 13, 2011 at 10:40 AM, Julien Serdaru 
> wrote:
>
> > Hi all,
> >
> >
> >
> > I am considering using Neo4j embedded into a web application. We have to
> > support Java 1.5 since we deploy on client J2EE application servers which
> > still run on 1.5.
> >
> > Looking at the documentation, it seems that Java 1.6 is a prerequisite.
> >
> >
> >
> > http://docs.neo4j.org/chunked/stable/deployment-requirements.html
> >
> >
> >
> > Are there any plans to maintain 1.5 compatibility?
> >
> >
> >
> > 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Traversing all relationship types

2011-05-11 Thread Tobias Ivarsson
There is a tentative new traversal API included in Neo4j that features this
functionality:

org.neo4j.kernel.Traversal.description().expand(
org.neo4j.kernel.Traversal.expanderForAllTypes( Direction.OUTGOING ) );

You can read more about it here:
http://wiki.neo4j.org/content/Traversal_Framework

Cheers,
Tobias

On Wed, May 11, 2011 at 9:08 AM, Jean-Pierre Bergamin
wrote:

> Hello neo4j users
>
> I'm just diving into neo4j and playing around with graph algorithms and
> traversers.
> As a start, I just wanted to traverse the whole graph with all relationship
> types in the OUTGOING direction. The traverse() method always expects a
> RelationshipType.
> Is there a simpler way to traverse all RelationshipTypes then building up
> an
> array that contains all types and the outgoing direction (as described here
> http://sujitpal.blogspot.com/2009/06/custom-traverser-for-neo4j.html)?
>
>
> Thanks for the help,
> James
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Relationship iterator doesn't implement remove()

2011-05-09 Thread Tobias Ivarsson
As you know it is perfectly valid for an iterator to not implement the
remove() method, the fact of that being a poorly designed API is a separate
issue.

The main reasons for the remove() method not being implemented are:
1. It is very rarely used. Invoking the delete() method on the relationship
object is easy enough anyhow.
2. It adds complexity. In order to support remove() you need to keep track
of the previously returned item to know what to remove, this adds more state
to the iterator and makes the code a bit more complex, which of course means
a higher likelihood of bugs. The cost of this seems a bit high for
supporting a method that is hardly ever used.

Those are the reasons. If you have arguments that counters or invalidates
those reasons please put them forward.

Cheers,
Tobias

On Thu, May 5, 2011 at 5:12 PM, Balazs E. Pataki wrote:

> Hi,
>
> Anothor bug like feature I just found. :-)
>
> Node#getRelationships() return an Iterablle, from which I can get an
> Iterator. This Iterator (actually IntArrayIterator) however doesn't
> implement the full Iterator interface as it throws an
> UnsupportedOperationException() when remove() is called on it. (APi
> documentationd doesn't mention this restriction)
>
> Is there any reason why this Iterator cannot implement remove()?
>
> I now have a wrapper around it, where I call delete() on the last
> Relationship returned by next().
>
> Regards,
> ---
> balazs
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Retrieving a node linked to the reference node takes forever

2011-05-06 Thread Tobias Ivarsson
Could you provide a stack trace of what the stuck thread is doing?

If you issue 'kill -3' to the process it will print a threaddump to stdout,
that will contain a stack trace for the stuck thread.
If you send that to me it would greatly help me diagnose the issue.

Cheers,
Tobias

On Fri, May 6, 2011 at 12:53 PM, Pablo Pareja  wrote:

> Hi !
>
> I just run into a problem I don't understand at all.
> The scenario is actually quite simple, basically it consists of a simple
> node retrieving through a relationship:
>
> 1. - There is a node (Protein self-interactions node) which is linked to
> the
> reference node by means of one
>  relationship (Protein self-interactions relationship). This is the
> piece of code for the node creation/linkage
>
> public static ProteinSelfInteractionsRel proteinSelfInteractionsRel =
> new ProteinSelfInteractionsRel(null);
>...
>
>
> proteinSelfInteractionsProperties.put(ProteinSelfInteractionsNode.NODE_TYPE_PROPERTY,
> ProteinSelfInteractionsNode.NODE_TYPE);
>long proteinSelfInteractionsNodeId =
> inserter.createNode(proteinSelfInteractionsProperties);
>inserter.createRelationship(inserter.getReferenceNode(),
> proteinSelfInteractionsNodeId,
>proteinSelfInteractionsRel, null);
>
> You can check the real code for this file
> here<
> https://github.com/pablopareja/Bio4j/blob/master/src/com/era7/bioinfo/bio4j/programs/InitBio4jDB.java
> >.
> (line 157)
>
> 2.-  Later on when I try to get the id of that node:
>
>  Iterable iterable =
> manager.getReferenceNode().getRelationships(new
> ProteinSelfInteractionsRel(null),Direction.OUTGOING);
>  logger.log(Level.INFO,"getting node");
>  long proteinSelfInteractionsNodeId =
> iterable.iterator().next().getEndNode().getId();
>  logger.log(Level.INFO,"done!");
>
>  (You can also check the code for this here
> <
> https://github.com/pablopareja/Bio4j/blob/master/src/com/era7/bioinfo/bio4j/programs/ImportProteinInteractions.java
> >(line
> 117)
>
>  It just gets stuck forever after "getting node"
>
> There's no exception thrown and the program just seems to freeze forever
> (I've already been waiting for more than 1h with no success)
>
> Do you have any ideas of what could be going on??
>
> I really have no clue of what could I be doing wrong...
> In case it may be useful, the size of the DB at this point is around
> 46.000.000 nodes and 380.000.000 relationships (only a dozen or so
> coming/going to
> the reference node)
>
> Thanks in advance,
>
>
> Pablo
>
> --
> Pablo Pareja Tobes
> LinkedInhttp://www.linkedin.com/in/pabloparejatobes
> Twitter   http://www.twitter.com/pablopareja
>
> http://about.me/pablopareja
> http://www.ohnosequences.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] First-class "type" property on relationships but not nodes; why?

2011-05-05 Thread Tobias Ivarsson
The RelationshipType isn't a type. It is a navigational feature.

I've slapped this link around for a few years now, every time this question
has been brought up:
http://lists.neo4j.org/pipermail/user/2008-October/000848.html

The fact that RelationshipType is a navigational feature and not a type
means that there is in fact already a corresponding thing for nodes: the
Indexes.

But I agree that there would be things we could gain by adding a Type
concept to Nodes. Such as for example better automatic indexing. But I don't
know what it would look like. And I want it to be clear that such a feature
is very different from what RelationshipType is today.

Cheers,
Tobias

On Thu, May 5, 2011 at 10:29 AM, Aseem Kishore wrote:

> I've found it interesting that Neo4j has a mandatory "type" property on
> relationships, but not nodes. Just curious, what's the reasoning behind the
> design having this distinction?
>
> If you say "you need to know what type of relationship these two nodes
> have", I would reply, "don't you also need to know what type of nodes they
> are, as well?"
>
> Similarly, if you say "because there can be many different types of
> relationships", I would reply, "there can also be many different types of
> nodes, and in both cases, there doesn't need to be".
>
> A perfect example is in the documentation/tutorial: movies and actors. Just
> the fact that we talk about the nodes in the database as "movies" and
> "actors" -- wouldn't it be helpful for the database to support that
> categorization first-class?
>
> To be precise, it's easy for us to add a "type" property to nodes ourselves
> (we do in our usage), but it's not a first-class property like
> relationships, where queries and traversals can easily and naturally
> specify
> the type or types they expect.
>
> Thanks!
>
> Aseem
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] No applicable backend found error in Neo4j.py

2011-05-04 Thread Tobias Ivarsson
If you pass the parameter log=True, you'll get more details on why it fails,
like so:
graphdb = neo4j.GraphDatabase('some/path',log=True)

That will help me figure out what the problem is in your case.

I know that the process with the current version of neo4j.py is painful.
It is mainly due to it being old. There has not been any updates in a really
long time.
I am working on a new version, where the code is simpler, which will
hopefully make people more willing to contribute. But that task keeps
getting interrupted by other things.

-tobias

On Wed, May 4, 2011 at 4:02 PM, Milena Araujo  wrote:

> So I'm starting with this graph database thing and decided to give Neo4j.py
> a try, but it's being painful just to set it up.
>
> After setting all the dependencies (I'm using Jpype/Cpython) I got this
> error when I try to create a database:
>
>  File "", line 1, in 
> >   File
> >
> "/usr/local/lib/python2.6/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.6.egg/neo4j/__init__.py",
> > line 522, in __new__
> > neo = core.load_neo(resource_uri, params)
> >   File
> >
> "/usr/local/lib/python2.6/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.6.egg/neo4j/_core.py",
> > line 180, in load_neo
> > backend.initialize(**parameters)
> >   File
> >
> "/usr/local/lib/python2.6/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.6.egg/neo4j/_backend/__init__.py",
> > line 61, in initialize
> > raise ImportError("No applicable backend found.")
> > ImportError: No applicable backend found.
> >
>
>
> The command that I'm using is :
>
> graphdb = neo4j.GraphDatabase('some/path')
> >
>
> I can import neo4j and pype in the command line with no problems ...
> Any ideas what it might be ?
>
> Thanks in advance :D
>
> Milena.
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Regarding Weighted Node

2011-05-03 Thread Tobias Ivarsson
Hi Pooja,

You could add the weight as a property on the nodes.

For inserting the nodes in a particular order, if you have a complete
dataset when you insert you can always sort it before you insert it. Or did
I misunderstand your question?

Cheers,
Tobias

On Tue, May 3, 2011 at 7:24 PM, pooja naik  wrote:

> Hi
>
> Is there a way in neo 4j to add weights to the node ?
>
> I want to add weights to the node and want to insert and delete nodes in
> the increasing order of weight?
>
> For example:
>
> The following is the graph/tree representation I am interested in.
>
> Parent
> node 1 - weight 1
>
> Has children with weights
>
> Node 2 - weight 3, node 3- weight 5
>
>
>
>
>
>
> So the insertion of node4 -weight 4 will go before node3- weight 5 and
> after node 2- 3
>
>
>
> Regards
> Pooja
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo Memory Tuning - Autotuning

2011-04-29 Thread Tobias Ivarsson
Right. Thanks for pointing out that there is a faulty documentation in the
wiki. I'll add it to the backlog of documentation fixes.

Have a great weekend.
-tobias

On Fri, Apr 29, 2011 at 5:52 PM, Rick Bullotta
wrote:

> This was a case of RTFM, or rather RTWM (read the wrong manual) - the old
> Neo4J Wiki stuff on Configuration Settings and Performance still comes up
> first on search results, thus my confused questions.
>
>
> -Original Message-
> From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org]
> On Behalf Of Tobias Ivarsson
> Sent: Friday, April 29, 2011 11:46 AM
> To: Neo4j user discussions
> Subject: Re: [Neo4j] Neo Memory Tuning - Autotuning
>
> Auto tuning is what happens when you don't specify any memory mapping
> parameters.
> Default values was a long time ago.
>
> -tobias
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo Memory Tuning - Autotuning

2011-04-29 Thread Tobias Ivarsson
Auto tuning is what happens when you don't specify any memory mapping
parameters.
Default values was a long time ago.

-tobias

On Fri, Apr 29, 2011 at 5:41 PM, Rick Bullotta
wrote:

> Cool! Didn't even know it was in there! I thought it used the default
> values unless told otherwise.  How can auto tuning be enabled?
>
>
> -Original Message-
> From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org]
> On Behalf Of Tobias Ivarsson
> Sent: Friday, April 29, 2011 11:40 AM
> To: Neo4j user discussions
> Subject: Re: [Neo4j] Neo Memory Tuning - Autotuning
>
> This is roughly what the built in auto tuning does.
> In what ways is that insufficient for your needs?
>
> Cheers,
> Tobias
>
> On Fri, Apr 29, 2011 at 3:43 PM, Rick Bullotta
> wrote:
>
> > Is there any suggested way to auto-tune the various Neo memory mapping
> > settings?  We have such a wide variety of database scenarios and system
> > configurations, that it is not possible for us to have a static set of
> > configuration parameters, but we'd like to avoid requiring "human
> > intervention".
> >
> > Curious as to if others have faced this challenge and how they solved it.
> >  I was thinking about asking the JVM how much memory was allocated (using
> > the Runtime class) and checking the file sizes of the various Neo stores
> to
> > prepare a HashMap with the appropriate mapped memory settings prior to
> > starting the EmbeddedGraphDatabase.  I was going to allocate memory
> mapping
> > based on proportional sizes of the node and relationship db files.
> >
> > I have to think this would be generally useful capability, so I'm
> wondering
> > if anyone has already implemented something along those lines.
> >
> > Thanks,
> >
> > Rick
> >
> > ___
> > Neo4j mailing list
> > User@lists.neo4j.org
> > https://lists.neo4j.org/mailman/listinfo/user
> >
>
>
>
> --
> Tobias Ivarsson 
> Hacker, Neo Technology
> www.neotechnology.com
> Cellphone: +46 706 534857
> _______
> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo Memory Tuning - Autotuning

2011-04-29 Thread Tobias Ivarsson
This is roughly what the built in auto tuning does.
In what ways is that insufficient for your needs?

Cheers,
Tobias

On Fri, Apr 29, 2011 at 3:43 PM, Rick Bullotta
wrote:

> Is there any suggested way to auto-tune the various Neo memory mapping
> settings?  We have such a wide variety of database scenarios and system
> configurations, that it is not possible for us to have a static set of
> configuration parameters, but we'd like to avoid requiring "human
> intervention".
>
> Curious as to if others have faced this challenge and how they solved it.
>  I was thinking about asking the JVM how much memory was allocated (using
> the Runtime class) and checking the file sizes of the various Neo stores to
> prepare a HashMap with the appropriate mapped memory settings prior to
> starting the EmbeddedGraphDatabase.  I was going to allocate memory mapping
> based on proportional sizes of the node and relationship db files.
>
> I have to think this would be generally useful capability, so I'm wondering
> if anyone has already implemented something along those lines.
>
> Thanks,
>
> Rick
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] neo4j.py + django relationship to same node type

2011-04-29 Thread Tobias Ivarsson
Pythons evaluation model prevents you from referencing things that have not
been defined yet.
In this case you are trying to reference Person before the class definition
of Person is done.
Just like in regular Django models this can be worked around by just
providing the name of the class as a string. Then the actual class will be
looked up at a later time.

Cheers,
tobias

On Thu, Apr 28, 2011 at 10:31 PM, Hammad  wrote:

> hey it my first try at using django + neo4j together. and i have already
> run
> into a problem:
>
> here is my model:
>
> from neo4j.model import django_model as neoModel
>
> class Person(neoModel.NodeModel):
>name = neoModel.Property(indexed=True)
>age = neoModel.Property()
>related = neoModel.Relationship(Person, type=neoModel.Outgoing.related)
>href = property(lambda self: ('/idea/%s/' % (self.node.id,)))
>
>def __unicode__(self):
>return u'"%s"' % (self.name)
>
> while testing it by starting the shell from manage.py i get this error when
> i import the models(from myapp import models):
>
> Traceback (most recent call last):
>  File "", line 1, in 
>  File "/home/hammad/Dev/Project/Myproj/myapp/models.py", line 4, in
> 
>class Person(neoModel.NodeModel):
>  File "/home/hammad/Dev/Project/Myproj/myapp/models.py", line 7, in Person
>related = neoModel.Relationship(Person, type=neoModel.Outgoing.related)
> NameError: name 'Person' is not defined
>
> any ideas on how i can create a relationship between two nodes of the same
> time. Its such a basic use-case that i am sure i am missing something...
>
> --
> Hammad Ullah
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] How Do You Configure neo4j Not to Reuse IDs?

2011-04-28 Thread Tobias Ivarsson
No, that patch has not made it into the mainline.

Why do you want to disable id reuse?

-tobias

On Thu, Apr 28, 2011 at 3:10 PM, espeed  wrote:

> I found the mentions of a patch from about a year ago...
>
> http://lists.neo4j.org/pipermail/user/2010-June/003964.html
>
> Has something like this with a configuration param made it into the main
> branch?
>
> Thanks.
>
> - James
>
> --
> View this message in context:
> http://neo4j-user-list.438527.n3.nabble.com/How-Do-You-Configure-neo4j-Not-to-Reuse-IDs-tp2874501p2874642.html
> Sent from the Neo4J User List mailing list archive at Nabble.com.
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] ClosedChannelExceptions in highly concurrent environment

2011-04-28 Thread Tobias Ivarsson
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 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
> this would be a common problem, though perhaps I am missing something?
>
> SimpleFSDirectory seems a bit of a performance bottleneck, so I switched to
> MMapDirectory and the problem did go away.  I didn't see a way to switch
> implementations w/out modifying neo4j code, so I changed LuceneDataSource as
> follows:
>
>  static Directory getDirectory( String storeDir,
>IndexIdentifier identifier ) throws IOException
> {
>MMapDirectory dir=new MMapDirectory(getFileDirectory( storeDir,
> identifier), null);
>if(MMapDirectory.UNMAP_SUPPORTED) {
>dir.setUseUnmap(true);
>}
>return dir;
>  }
>
> So I'm wondering if others have seen this problem and/or if there is a
> recommended solution?  Our product runs on quite a few different operating
> systems, so I have some reservations about using MMapDirectory as well
> (javadoc speaks of a few caveats on Windows, 64 vs 32, etc). Also, I'd
> rather not maintain a patched version of the neo4j code if avoidable.
>
> Thanks!
> Jennifer
>
> Exception:
> Caused by: java.nio.channels.ClosedChannelException
> at sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:88)
> at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:613)
> at
> org.apache.lucene.store.NIOFSDirectory$NIOFSIndexInput.readInternal(NIOFSDirectory.java:161)
> at
> org.apache.lucene.store.BufferedIndexInput.readBytes(BufferedIndexInput.java:139)
> at
> org.apache.lucene.index.CompoundFileReader$CSIndexInput.readInternal(CompoundFileReader.java:285)
> at
> org.apache.lucene.store.BufferedIndexInput.refill(BufferedIndexInput.java:160)
> at
> org.apache.lucene.store.BufferedIndexInput.readByte(BufferedIndexInput.java:39)
> at org.apache.lucene.store.DataInput.readVInt(DataInput.java:86)
> at
> org.apache.lucene.index.codecs.DeltaBytesReader.read(DeltaBytesReader.java:40)
> at
> org.apache.lucene.index.codecs.PrefixCodedTermsReader$FieldReader$SegmentTermsEnum.next(PrefixCodedTermsReader.java:469)
> at
> org.apache.lucene.index.codecs.PrefixCodedTermsReader$FieldReader$SegmentTermsEnum.seek(PrefixCodedTermsReader.java:385)
> at org.apache.lucene.index.TermsEnum.seek(TermsEnum.java:68)
> at org.apache.lucene.index.Terms.docFreq(Terms.java:53)
> at org.apache.lucene.index.SegmentReader.docFreq(SegmentReader.java:898)
> at org.apache.lucene.index.IndexReader.docFreq(IndexReader.java:882)
> at
> org.apache.lucene.index.DirectoryReader.docFreq(DirectoryReader.java:687)
>
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Question about REST interface concurrency

2011-04-28 Thread Tobias Ivarsson
The PresistenceWindows are flushed only when the transaction log is rotated.

Writes to the transaction log is flushed when the transaction commits
though.

If you wish to look at the code for this, have a look at for instance:
https://github.com/neo4j/community/blob/master/kernel/src/main/java/org/neo4j/kernel/impl/transaction/xaframework/XaLogicalLog.java

Cheers,
Tobias

On Wed, Apr 27, 2011 at 4:31 AM, Stephen Roos wrote:

> Hi Jim,
>
> From what I understand, it flushes with various granularities, though I'd
> suspect that it's not flushing after writes the size of empty nodes, so this
> is certainly a possible bottleneck point.  I've been looking through the
> code and don't see exactly where the flush takes place.  Can you point me at
> the right class?
>
> I did come across the PersistenceWindowPool class which seems to come into
> play when the underlying node record is updated during the transaction
> commit.  It looks as if the windows are mapped over contiguous blocks of the
> primitives ID space and that because the new node IDs are typically
> sequential, each of my create-node operations is likely to target the same
> window.  These windows are locked and waiting threads are queued up to wait
> for the locking thread to notify on unlock.  Am I reading the code
> correctly?  If so, do you have any thoughts on how we might remove that
> bottleneck?
>
> Thanks again for your help,
> Stephen
>
>
> -Original Message-
> From: Mattias Persson [mailto:matt...@neotechnology.com]
> Sent: Tuesday, April 26, 2011 12:19 AM
> To: Neo4j user discussions
> Subject: Re: [Neo4j] Question about REST interface concurrency
>
> Does your disk benchmark tests flush the data to disk or just write to
> it, making file system / OS flush when ever it feel like it (making it
> much faster, of course)?
>
> 2011/4/25 Stephen Roos :
> > Hi Jim,
> >
> > I took a look at my disk utilization and I'm only getting up to about
> 9379 KBps (write).  My disk benchmarking tests show max write rates to be
> around 220 MBps, so I shouldn't be maxed out there.  Interestingly, I don't
> see that much data in the graph.db directory (I see about 15 MB there after
> creating 150k empty nodes, no relationships, no index).  The largest file is
> nioneo_logical.log.1 (14 MB), the next largest is the neostore.nodestore.db
> (1.3 MB).  I don't know if that information is helpful, but I thought it was
> a bit strange that I'm sustaining disk write rates of > 9 MBps for over 40
> secs yet I don't have anywhere close to 9 * 40 MB of data.
> >
> > I do wonder about the flush operation though.  Flush is a blocking
> operation, maybe that's the bottleneck even though the disk isn't over
> utilized.  I'll look into that.  Let me know if you have any other ideas.
> >
> > Thanks!
> > Stephen
> >
> > -Original Message-
> > From: Jim Webber [mailto:j...@neotechnology.com]
> > Sent: Friday, April 22, 2011 3:34 AM
> > To: Neo4j user discussions
> > Subject: Re: [Neo4j] Question about REST interface concurrency
> >
> > Hi Stephen,
> >
> > I think the network IO you've measured is consistent with the rest of the
> behaviour your've described.
> >
> > What I'm thinking is that you're simply reaching the limits of create
> transaction->create a node->complete transaction->flush to filesystem (that
> is, you're basically testing disk write speed/seek time/etc).
> >
> > Can you check how busy your IO to disk is? I expect it'll be relatively
> high.
> >
> > Jim
> > ___
> > 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo4j on OSGi

2011-04-28 Thread Tobias Ivarsson
t;> for example. Those features could also for example look for exposed
> > >>> GraphDatabase and then register management of webadmin features
> > >>> automatically.
> > >>> I don't know if it would be useful or even if that makes sense
> > regarding
> > >>> neo4j use cases. Let me know what you think about that.
> > >>>
> > >>> Nicolas.
> > >>> ___
> > >>> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] REST results pagination

2011-04-22 Thread Tobias Ivarsson
On Thu, Apr 21, 2011 at 11:18 PM, Michael Hunger <
michael.hun...@neotechnology.com> wrote:

> Rick,
>
> great thoughts.
>
> Good catch, forgot to add the in-graph representation of the results to my
> mail, thanks for adding that part. Temporary (transient) nodes and
> relationships would really rock here, with the advantage that with HA you
> have them distributed to all cluster nodes.
> Certainly Craig has to add some interesting things to this, as those
> resemble probably his in graph indexes / R-Trees.
>
> As traversers are lazy a count operation is not so easily possible, you
> could run the traversal and discard the results. But then the client could
> also just pull those results until it reaches its
> internal tresholds and then decide to use more filtering or stop the
> pulling and ask the user for more filtering (you can always retrieve n+1 and
> show the user that there are more that "n" results available).
>
> The index result size() method only returns an estimate of the result size
> (which might not contain currently changed index entries).
>
> Please don't forget that a count() query in a RDBMS can be as ridicully
> expensive as the original query (especially if just the column selection was
> replaced with count, and sorting, grouping etc was still left in place
> together with lots of joins).
>
> Sorting on your own instead of letting the db do that mostly harms the
> performance as it requires you to build up all the data in memory, sort it
> and then use it. Instead of having the db do that more efficiently, stream
> the data and you can use it directly from the stream.
>

throw new SlapOnTheFingersException("sometimes the application developer can
do a better job since she has better knowledge of the data, the database
only has generic knowledge");

Since Jake had already mentioned (in this very thread) that he expected one
of those, I thought I might as well throw one in there.

I agree with the analysis of count(), as the name ("count") implies, it will
have to run the entire query in order to count the number of resulting
items.

About sorting I'm torn. The perception of sorting in the database being slow
that Rick points to is one that I've seen a lot. When you hand the
responsibility of sorting to the database you hide the fact that sorting is
an expensive operation, it does require reading in all data in order to sort
it. People often expect databases to be "smarter" than that, since they
sometimes are, but that is pretty much only when reading straight from an
index and not doing much more. A generic sort of data can never be better
than O(log(n!)) [O(log(n!)) is almost equal to, and commonly rounded to the
easier to compute function O(n log(n))]. If you put the responsibility of
sorting in the hands of the application you can sometimes utilize knowledge
about the data to do a more efficient sorting than the database could have
done. Most often by simply doing an application level filtering of the data
before sorting it, based on some filtering that could not be transfered to
the database query. This does however make the work of the application
developer slightly more tedious, which is why I think it would be sensible
to have support for sorting on the database level, and hope that users will
be sensible about using it, and not assume magic from it.

Something I find very interesting is the concept of semi-sorted data.
Semi-sorted data is often good enough, easier to achieve, and quite easy to
then sort completely if that is required. Examples of semi-sorted data could
be data in an order that satisfies the heap property. Or for spatial queries
returning the closest hits first, but not necessarily in perfect order, say
returning the hits within a miles radius first, before the ones in a radius
between 1-10 miles, and so on, without requiring the hits in each 'segment'
to be perfectly ordered by distance. Breadth first order is another example
of semi-sorted data, that could be used when traversing data as you've
outlined with "paging nodes", or similarly "grouped by parent node"-order.

I must say that I really enjoy following this discussion. I really like the
idea of streaming, since I think that can be implemented more easily than
paging, while satisfying many of the desired use cases. But I still want to
hear more arguments for and against both alternatives. And as has already
been pointed out, they aren't mutually exclusive.

I'll keep listening in on the conversation, but I don't have much more to
add at this point. I have one desire for the structure of the conversation
though. When you quote what someone else has said before you, could you
please include who that person was, it makes going back and reading the full
context easier.

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Strange performance difference on different machines

2011-04-20 Thread Tobias Ivarsson
Sorry I got a bit distracted when writing this. I should have added that I
then want you to send the results of running that benchmark to me so that I
can further analyze what the cause of these slow writes might be.

Thank you,
Tobias

On Wed, Apr 20, 2011 at 12:26 PM, Tobias Ivarsson <
tobias.ivars...@neotechnology.com> wrote:

> I agree that 16 transactions / second is much slower than what I usually
> see on linux, even with a slow file system configuration. But I still
> believe this is either disk or filesystem being slow. Could you please go
> through the file system benchmarking outlined on this wiki page:
> http://wiki.neo4j.org/content/Linux_Performance_Guide
>
> Cheers,
> Tobias
>
>
> On Tue, Apr 19, 2011 at 10:11 PM, Bob Hutchison 
> wrote:
>
>> Hi Tobias,
>>
>> On 2011-04-19, at 1:48 AM, Tobias Ivarsson wrote:
>>
>> > Hi Bob,
>> >
>> > What happens here is that you perform a tiny operation in each
>> transaction,
>> > so what you are really testing here is how fast your file system can
>> flush,
>> > because with such tiny transactions all of the time is going to be spent
>> in
>> > transactional overhead (i.e. flushing transaction logs to the disk).
>> >
>> > The reason you see such large differences between Mac OS X and Linux is
>> > because Mac OS X cheats. Flushing a file (fdatasync) on Mac does pretty
>> much
>> > nothing. The only thing Mac OS X guarantees is that it will write the
>> data
>> > that you just flushed before it writes the next data block you flush, so
>> > called "ordered writes". This means that you could potentially get
>> data-loss
>> > on hard failure, but never in a way that makes your data internally
>> > inconsistent.
>>
>> Okay, that's makes some sense. Thanks for the information.
>>
>> >
>> > So to give a short answer to your questions:
>> > 1) The linux number is reasonable, Mac OS X cheats.
>> > 2) What you are testing is the write speed of your disk for writing
>> small
>> > chunks of data.
>>
>> So you're thinking that 16 or 17 writes is what should be expected?
>>
>> Cheers,
>> Bob
>>
>> >
>> > Cheers,
>> > Tobias
>> >
>> > On Mon, Apr 18, 2011 at 10:57 PM, Bob Hutchison <
>> hutch-li...@recursive.ca>wrote:
>> >
>> >> Hi,
>> >>
>> >> Using Neo4j 1.3 and the Borneo (Clojure) wrapper I'm getting radically
>> >> different performance numbers with identical test code.
>> >>
>> >> The test is a simple-minded: create two nodes and a relation between
>> them.
>> >> No properties, no indexes, all nodes and relations are different.
>> >>
>> >> On OS X, it takes about 50s to perform that operation 50,000 times, <
>> 0.8s
>> >> to do it 500 times. It uses roughly 30-40% of one core to do this.
>> >>
>> >> On linux it takes about 30s to perform that operation 500 times. The
>> CPU
>> >> usage is negligible (really negligible... almost none).
>> >>
>> >> I cannot explain the difference in behaviour.
>> >>
>> >> I have two questions:
>> >>
>> >> 1) is either of these a reasonable number? I hoping the OS X numbers
>> are
>> >> not too fast.
>> >>
>> >> 2) any ideas as to what might be the cause of this?
>> >>
>> >> The Computers are comparable. The OS X is a 2.8 GHz i7, the linux box
>> is a
>> >> 3.something GHz Xeon (I don't remember the details).
>> >>
>> >> Thanks in advance for any help,
>> >> Bob
>> >>
>> >> _______
>> >> Neo4j mailing list
>> >> User@lists.neo4j.org
>> >> https://lists.neo4j.org/mailman/listinfo/user
>> >>
>> >
>> >
>> >
>> > --
>> > Tobias Ivarsson 
>> > Hacker, Neo Technology
>> > www.neotechnology.com
>> > Cellphone: +46 706 534857
>> > ___
>> > Neo4j mailing list
>> > User@lists.neo4j.org
>> > https://lists.neo4j.org/mailman/listinfo/user
>>
>> 
>> Bob Hutchison
>> Recursive Design Inc.
>> http://www.recursive.ca/
>> weblog: http://xampl.com/so
>>
>>
>>
>>
>> ___
>> Neo4j mailing list
>> User@lists.neo4j.org
>> https://lists.neo4j.org/mailman/listinfo/user
>>
>
>
>
> --
> Tobias Ivarsson 
> Hacker, Neo Technology
> www.neotechnology.com
> Cellphone: +46 706 534857
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Strange performance difference on different machines

2011-04-20 Thread Tobias Ivarsson
I agree that 16 transactions / second is much slower than what I usually see
on linux, even with a slow file system configuration. But I still believe
this is either disk or filesystem being slow. Could you please go through
the file system benchmarking outlined on this wiki page:
http://wiki.neo4j.org/content/Linux_Performance_Guide

Cheers,
Tobias

On Tue, Apr 19, 2011 at 10:11 PM, Bob Hutchison wrote:

> Hi Tobias,
>
> On 2011-04-19, at 1:48 AM, Tobias Ivarsson wrote:
>
> > Hi Bob,
> >
> > What happens here is that you perform a tiny operation in each
> transaction,
> > so what you are really testing here is how fast your file system can
> flush,
> > because with such tiny transactions all of the time is going to be spent
> in
> > transactional overhead (i.e. flushing transaction logs to the disk).
> >
> > The reason you see such large differences between Mac OS X and Linux is
> > because Mac OS X cheats. Flushing a file (fdatasync) on Mac does pretty
> much
> > nothing. The only thing Mac OS X guarantees is that it will write the
> data
> > that you just flushed before it writes the next data block you flush, so
> > called "ordered writes". This means that you could potentially get
> data-loss
> > on hard failure, but never in a way that makes your data internally
> > inconsistent.
>
> Okay, that's makes some sense. Thanks for the information.
>
> >
> > So to give a short answer to your questions:
> > 1) The linux number is reasonable, Mac OS X cheats.
> > 2) What you are testing is the write speed of your disk for writing small
> > chunks of data.
>
> So you're thinking that 16 or 17 writes is what should be expected?
>
> Cheers,
> Bob
>
> >
> > Cheers,
> > Tobias
> >
> > On Mon, Apr 18, 2011 at 10:57 PM, Bob Hutchison <
> hutch-li...@recursive.ca>wrote:
> >
> >> Hi,
> >>
> >> Using Neo4j 1.3 and the Borneo (Clojure) wrapper I'm getting radically
> >> different performance numbers with identical test code.
> >>
> >> The test is a simple-minded: create two nodes and a relation between
> them.
> >> No properties, no indexes, all nodes and relations are different.
> >>
> >> On OS X, it takes about 50s to perform that operation 50,000 times, <
> 0.8s
> >> to do it 500 times. It uses roughly 30-40% of one core to do this.
> >>
> >> On linux it takes about 30s to perform that operation 500 times. The CPU
> >> usage is negligible (really negligible... almost none).
> >>
> >> I cannot explain the difference in behaviour.
> >>
> >> I have two questions:
> >>
> >> 1) is either of these a reasonable number? I hoping the OS X numbers are
> >> not too fast.
> >>
> >> 2) any ideas as to what might be the cause of this?
> >>
> >> The Computers are comparable. The OS X is a 2.8 GHz i7, the linux box is
> a
> >> 3.something GHz Xeon (I don't remember the details).
> >>
> >> Thanks in advance for any help,
> >> Bob
> >>
> >> ___
> >> Neo4j mailing list
> >> User@lists.neo4j.org
> >> https://lists.neo4j.org/mailman/listinfo/user
> >>
> >
> >
> >
> > --
> > Tobias Ivarsson 
> > Hacker, Neo Technology
> > www.neotechnology.com
> > Cellphone: +46 706 534857
> > ___
> > Neo4j mailing list
> > User@lists.neo4j.org
> > https://lists.neo4j.org/mailman/listinfo/user
>
> 
> Bob Hutchison
> Recursive Design Inc.
> http://www.recursive.ca/
> weblog: http://xampl.com/so
>
>
>
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Strange performance difference on different machines

2011-04-18 Thread Tobias Ivarsson
Hi Bob,

What happens here is that you perform a tiny operation in each transaction,
so what you are really testing here is how fast your file system can flush,
because with such tiny transactions all of the time is going to be spent in
transactional overhead (i.e. flushing transaction logs to the disk).

The reason you see such large differences between Mac OS X and Linux is
because Mac OS X cheats. Flushing a file (fdatasync) on Mac does pretty much
nothing. The only thing Mac OS X guarantees is that it will write the data
that you just flushed before it writes the next data block you flush, so
called "ordered writes". This means that you could potentially get data-loss
on hard failure, but never in a way that makes your data internally
inconsistent.

So to give a short answer to your questions:
1) The linux number is reasonable, Mac OS X cheats.
2) What you are testing is the write speed of your disk for writing small
chunks of data.

Cheers,
Tobias

On Mon, Apr 18, 2011 at 10:57 PM, Bob Hutchison wrote:

> Hi,
>
> Using Neo4j 1.3 and the Borneo (Clojure) wrapper I'm getting radically
> different performance numbers with identical test code.
>
> The test is a simple-minded: create two nodes and a relation between them.
> No properties, no indexes, all nodes and relations are different.
>
> On OS X, it takes about 50s to perform that operation 50,000 times, < 0.8s
> to do it 500 times. It uses roughly 30-40% of one core to do this.
>
> On linux it takes about 30s to perform that operation 500 times. The CPU
> usage is negligible (really negligible... almost none).
>
> I cannot explain the difference in behaviour.
>
> I have two questions:
>
> 1) is either of these a reasonable number? I hoping the OS X numbers are
> not too fast.
>
> 2) any ideas as to what might be the cause of this?
>
> The Computers are comparable. The OS X is a 2.8 GHz i7, the linux box is a
> 3.something GHz Xeon (I don't remember the details).
>
> Thanks in advance for any help,
> Bob
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Multitenancy in neo4j

2011-04-18 Thread Tobias Ivarsson
If you by multitenancy simply mean that you want to have multiple separate
graph database, you can do that as easily as:
GraphDatbaseService graphdb1 = new EmbeddedGraphDatabase(
"/path/to/your/first/graphdb" );
GraphDatbaseService graphdb2 = new EmbeddedGraphDatabase(
"/path/to/your/second/graphdb" );

Since that is already possible in the embedded scenario, the multitencncy
support that has been discussed for the future is a server specific feature.

That work for the server might bring some new capabilities to the embedded
setup as well, but the main part of it is still going to be
as exemplified above.

Or you could of course do as Jim suggested and make the sub-graph
distinction an application level separation.

One thing to keep in mind when starting multiple EmbeddedGraphDatabase
instances in the same JVM (and on the same computer for that matter) is that
the automatic configuration will assume that it is the only graph database
running on that computer, sou you will need to supply manual configuration.
See: http://wiki.neo4j.org/content/Configuration_Settings

Cheers,
Tobias

On Mon, Apr 18, 2011 at 10:21 AM, ntankovic wrote:

> Hi all,
>
> I'm facing a situation to develop a multitenant graph environment. I heard
> from some of you guys that this is planned for neo4j server. Is this neo4j
> server only or will I also be possible to use this on neo4j embedded
> engine?
>
> --
> View this message in context:
> http://neo4j-user-list.438527.n3.nabble.com/Multitenancy-in-neo4j-tp2833480p2833480.html
> Sent from the Neo4J User List mailing list archive at Nabble.com.
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Architecturing Neo4J database

2011-04-17 Thread Tobias Ivarsson
What is the required number of relationships?

I'll answer your questions inline below.

On Sun, Apr 17, 2011 at 7:27 PM, Dima Gutzeit
wrote:

> Oops, small correction. The required number of nodes is 2 billions and not
> 100 millions as originally stated.
>
> On Sun, Apr 17, 2011 at 8:16 PM, Dima Gutzeit
> wrote:
>
> > Dear list members,
> >
> > I have a need for storage engine (graph based) for a server I am
> building.
> >
> > Here are the requirements:
> >
> > 1. Support for High Availability
>

You can tick that box with Neo4j :)


>  > 2. Ability to store around 100 millions of nodes, estimated data size of
> > around 5 terabytes.
>

Measuring data in bytes is blunt and difficult. Statistically, all users
trying to do that before using Neo4j for at least a while has gotten it
wrong in one way or another. Is it ok if I take this figure with a grain of
salt? Your statement of "2 bilion nodes" is more helpful, add to that the
estimated number of relationships (either per node or in total) and the
estimated number of properties for each node and relationship and we'll have
a better model for estimating both on-disk size and how to best configure
your Neo4j installation for optimal cache utilization.


> >
> > I've been reading about different options that Neo4J provides and I need
> to
> > make a final decision about the layout, few questions:
> >
> > - I expect mostly-read-access to the database and I've been reading about
> > the HA approach, by replicating the data across several nodes. Is there
> an
> > option to use a centralized storage server (NAS/SAN) and working with
> > several nodes (for scaling) but without data replication ?
>

No. Since Neo4j requires exclusive file locks for the storage files to
guarantee write consistency.

It also doesn't work well even if you have a single write-instance and let
all other instances be read-only instances used for only scaling reads. This
is because Neo4j relies heavily on caching to get good read performance. If
the underlying storage data is changed by the write-master the read slaves
will not know about it and thus suffer from stale caches which can lead to
an inconsistent view of the graph.

The Neo4j HA solution provides the appropriate replication and cache
invalidation to make this work consistently across multiple instances.


>  >
> > - The documentation describes HA installation with embedded neo4j
> instance,
> > can the same be configured for a standalone server ?
>

Yes.


>  >
> > - If using an embedded version of the database, can still the webadmin be
> > used ?
>

Not yet. This is being considered for future versions.


>  >
> > - What is supported request rate / throughput of a single Neo4j server,
> is
> > there benchmarking data I can consult with including the hardware config
> of
> > a testbed ?
>

The figures for an embedded Neo4j setup is between 1000 to 2000
relationships traversed per millisecond for fully cached data.
With approximately 10% of that for data only in the low level (file system)
cache. The server setup used the same graph database internally, but adds
some per-request network overhead to that. I don't have any benchmark
figures. Could someone fill in?

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Taking a Snapshot.

2011-04-16 Thread Tobias Ivarsson
Hi Guru,

Actually Emil is not completely up to speed with the current state of the
online backup feature.

Our previous online backup feature worked this way, since all it did was
copy the transaction logs and replay those on the backup target.
This had the drawback of requiring an equal database (from a previous state
- usually the initial state) to exist at the target location. It also
requires all transaction logs to exist on the source machine from the time
when the target baseline copy was created to the current point in time.

This functionality still exists in the current backup tool as "incremental
backup". What the is added though is the ability to do full backup. When you
do a full backup you don't need to have all the transaction logs around at
the source db. What we do then is copy the store files. But since we want
the source database to be up an running as usual we don't lock the store
files. This means that they can be modified while we are copying them. This
in turn means that if we only copied the store files the backup target could
contain a database at an inconsistent state. To avoid that we record which
transaction the db was at when the backup started. When the backup of the
store files is complete, we send the transaction logs of all transactions
from the recorded start-transaction to the transaction the db was at when
the copying finished. Playing these transactions back on the backup target
ensures that the store files get to a consistent state.

This means that the state of the backup target after backup will be the same
as it was on the source when the backup process completed there. So for you
this means that you would have to use incremental backup to achieve your
goals. What I would suggest is to do that backup in two phases:
1. Do a full backup ahead of the time for which you want the snapshot from.
2. At the point at which you want a snapshot, do an incremental backup to
the same backup target as the previous full backup.
Since incremental backup copies the transaction logs up until the point when
it started the above procedure will give you the desired outcome.

Cheers,
Tobias

On Sat, Apr 16, 2011 at 8:51 AM, Guru GV  wrote:

> Wow ! Amazingly quick response, Thanks Emil!
>
>
> On Sat, Apr 16, 2011 at 12:20 PM, Emil Eifrem  >wrote:
>
> > On Fri, Apr 15, 2011 at 23:47, Guru GV  wrote:
> > > What happens if I initiate the Backup and then couple of more
> > transactions
> > > are performed on the DB and only after that the Backup finishes.
> > > In that case - is it guaranteed that the those Txs (that started after
> > the
> > > backup was initiated)* are not included* and the backup that I get is
> > > exactly what the *DB was at the point of time I requested for a backup
> ?*
> >
> > Yes. It will behave as you expect in the scenario you outline.
> >
> > Cheers,
> >
> > --
> > Emil Eifrém, CEO [e...@neotechnology.com]
> > Neo Technology, www.neotechnology.com
> > Cell: +46 733 462 271 | US: 206 403 8808
> > http://blogs.neotechnology.com/emil
> > http://twitter.com/emileifrem
> >
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Mac Pro Question ...

2011-04-15 Thread Tobias Ivarsson
There are known issues with "neo4j install" on the mac. We are working on
that.

But just running should be fine, i.e. "neo4j start", I do that on my mac all
the time. Roughly half of the Neo Technology devteam have Macs as their main
development machines.

Cheers,
Tobias

On Fri, Apr 15, 2011 at 6:19 AM, Rense Lange wrote:

>
>
>
> Is there anyone who is running neo4j on their Mac? How did you do it? I
> have a Mac pro, and I can't seem to get it going. Right now, the
> installation methods provided on the web don't work. I hope there is a way
> around this. Help!
>
> Rense Lange
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] 20 billion primitives machine

2011-04-14 Thread Tobias Ivarsson
Hi Jamie,

Very interesting use case you have there.

If you could just provide a few more bits of information about your data,
I'd be able to provide a better analysis.

* Is the distribution of relationships uniform across the nodes. If not, how
much does it vary?

* What kind of operation you want to do in the 50ms latency that you've
specified. You just mentioned "relatively shallow traversals", approximately
how deep is that? The key figure to get at is how many relationships you
need to traverse, and that is a function of the depth of the traversal and
the distribution of the relationships.

* Is the 50ms latency for each single request? What is the estimated number
of concurrent requests?

* What kind of properties are those 32 byte values? ASCII strings of length
32?

* The bulk loading phase you describe, is it a one time import of initial
data, or a regularly recurring thing?

* In the bulk load phase, what form does the data have? Would it be possible
to have that data in a format where each node is uniquely identified by a
number (in both the node data listing, and the edge-list).


Finally, do you have test data for these sizes? If possible I'd love to work
with you on this, to get an good use case to work on for improving the large
data story in Neo4j.

Cheers,
Tobias

On Thu, Apr 14, 2011 at 3:12 PM, Jamie Stephens  wrote:

> Folks,
>
> I've got an application that has (will have) about 2 billion vertexes
> and maybe 8 billion edges (?).  Maybe an avg of 4 properties per
> vertex -- with maybe an avg of 32 bytes/value.  So I guess that's 16
> billion primitives.  Let's round to 20 billion.  My edges estimate is
> a relatively uninformed guess.  Just starting to dig into the data.
>
> Traversals will be relatively shallow.  Concurrent access.  Throughput
> is more important than latency.  But latency should be better than
> maybe 50ms 99% of the time (allowing for some cache warming and some
> GC).  I don't know much yet about locality.  I'm not sure yet how
> sensitive the app will be to long GCs.
>
> We will need to do a big batch load, and writes will need to be fast
> in that phase.  After that, we'll see more reads that writes.  So I
> imagine a config for the batch load and another config for production.
>
> I understand cache sharding, application-level partitioning, and so
> forth.  I'm wondering what I can do on a single machine -- and what
> that machine should look like.
>
> http://docs.neo4j.org/chunked/stable/configuration-jvm.html and
> http://wiki.neo4j.org/content/Neo4j_Performance_Guide are encouraging.
>  And having knobs as documented at
> http://wiki.neo4j.org/content/Configuration_Settings is great.  Nice
> work!
>
> I'm hoping I might be able to get away with 128GB RAM on 12 cores with
> data striped over a handful of disks (SSDs if required).  We'll
> probably also need a cluster for both traffic and availability, but
> that's another topic.
>
> Does anybody have experience with a data set like this on a similar
> machine?  How much RAM and how much disk -- and what kinds and in what
> configuration?  Latency, throughput, general experience?  Any
> production deployments?
>
> I'd appreciate any guidance or feedback.  I'm happy to summarize later
> if that'd be helpful.
>
> BTW, my testbed uses Clojure with clojure.contrib.server-socket and
> https://github.com/wagjo/borneo. Very convenient!
>
> --Jamie
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo Server slow on frequent requests

2011-04-13 Thread Tobias Ivarsson
That one looks much more interesting. I'm too tired right now, but I'll look
at it tomorrow.

On Wed, Apr 13, 2011 at 11:50 AM, Dario Rexin  wrote:

> Hi Tobias,
>
> I was already sending requests to the server in the last dump. Here is
> another, hopefully this one is more helpful. The longer I request data, the
> longer it takes for the server to answer. After some time it frequently
> freezes for up to several seconds without answering to any of the requests.
>
> https://gist.github.com/917283
>
> Cheers,
>
> Dario
>
> Am 13.04.11 11:14 schrieb "Tobias Ivarsson" unter
> :
>
> > Hi Dario,
> >
> > This dump looks perfectly fine, the expected threads are there, but they
> are
> > all idle waiting for work.
> >
> > When I asked for a thread dump, I wanted one from when the server was
> under
> > load and you experienced problems. Sorry for not being clear about that.
> >
> > Cheers,
> > Tobias
> >
> > On Wed, Apr 13, 2011 at 10:34 AM, Dario Rexin 
> wrote:
> >
> >> Hey,
> >>
> >> Somehow my attached files always get deleted. Heres the dump:
> >>
> >> https://gist.github.com/917199
> >>
> >>
> >> Cheers,
> >>
> >> Dario
> >>
> >> Am 13.04.11 10:30 schrieb "Dario Rexin" unter :
> >>
> >>> Hi Tobias,
> >>>
> >>> Here's the thread dump you asked for. Thank you for taking a look at
> >> this.
> >>>
> >>>
> >>> Cheers,
> >>>
> >>> Dario
> >>>
> >>>
> >>> Am 12.04.11 22:16 schrieb "Tobias Ivarsson" unter
> >>> :
> >>>
> >>>> Hi Dario,
> >>>>
> >>>> Looking at that picture it is indeed clear that a number of threads
> are
> >>>> waiting for something. What is not shown is the more important
> >> information
> >>>> about *what* they are waiting for. I would love to get information
> like
> >> that
> >>>> in order to investigate the cause of the performance problem you are
> >> seeing.
> >>>> If you could send a thread dump instead of a screenshot that would be
> a
> >> lot
> >>>> more useful, since that would contain information about contention
> that
> >> I
> >>>> could actually analyze. The easiest way to get a thread dump is by
> >> sending
> >>>> the SIGQUIT signal (kill -3) to the JVM process running Neo4j.
> >>>>
> >>>> Cheers,
> >>>> Tobias
> >>>>
> >>>> On Tue, Apr 12, 2011 at 6:35 PM, Dario Rexin 
> >> wrote:
> >>>>
> >>>>> Hi all,
> >>>>>
> >>>>> Due to huge performance issues with some of our neo queries I
> profiled
> >> my
> >>>>> calls on the neo server. The profiling shows, that up to 85% of the
> >> time the
> >>>>> threads are waiting for other threads. I don¹t understand what¹s
> going
> >> on
> >>>>> there. Hopefully someone with a deeper knowledge can help me. Am I
> >> doing
> >>>>> something wrong, or is it normal, that most of the time the threads
> are
> >>>>> blocking each other? Her is a screenshot, showing the results of my
> >>>>> profiling: http://i.imgur.com/eIfam.jpg
> >>>>>
> >>>>>
> >>>>> Thanks in advice,
> >>>>>
> >>>>> Dario
> >>>>> ___
> >>>>> Neo4j mailing list
> >>>>> User@lists.neo4j.org
> >>>>> https://lists.neo4j.org/mailman/listinfo/user
> >>>>>
> >>>>
> >>>>
> >>
> >> --
> >> Dario Rexin
> >> Junior Manager Engineering
> >> dario.re...@xing.com
> >>
> >> XING AG
> >> Gaensemarkt 43, 20354 Hamburg, Germany
> >>
> >> Commercial Reg. (Registergericht): Amtsgericht Hamburg, HRB 98807
> >> Exec. Board (Vorstand): Dr. Stefan Groß-Selbeck (Vorsitzender), Ingo
> Chu,
> >> Dr. Helmut Becker, Jens Pape
> >> Chairman of the Supervisory Board (Aufsichtsratsvorsitzender): Dr. Neil
> >> Sunderland
> >>
> >> Please join my network on XING:
> >> https://www.xing.com/profile/Dario_Rexin
>

Re: [Neo4j] Neo Server slow on frequent requests

2011-04-13 Thread Tobias Ivarsson
Hi Dario,

This dump looks perfectly fine, the expected threads are there, but they are
all idle waiting for work.

When I asked for a thread dump, I wanted one from when the server was under
load and you experienced problems. Sorry for not being clear about that.

Cheers,
Tobias

On Wed, Apr 13, 2011 at 10:34 AM, Dario Rexin  wrote:

> Hey,
>
> Somehow my attached files always get deleted. Heres the dump:
>
> https://gist.github.com/917199
>
>
> Cheers,
>
> Dario
>
> Am 13.04.11 10:30 schrieb "Dario Rexin" unter :
>
> > Hi Tobias,
> >
> > Here's the thread dump you asked for. Thank you for taking a look at
> this.
> >
> >
> > Cheers,
> >
> > Dario
> >
> >
> > Am 12.04.11 22:16 schrieb "Tobias Ivarsson" unter
> > :
> >
> >> Hi Dario,
> >>
> >> Looking at that picture it is indeed clear that a number of threads are
> >> waiting for something. What is not shown is the more important
> information
> >> about *what* they are waiting for. I would love to get information like
> that
> >> in order to investigate the cause of the performance problem you are
> seeing.
> >> If you could send a thread dump instead of a screenshot that would be a
> lot
> >> more useful, since that would contain information about contention that
> I
> >> could actually analyze. The easiest way to get a thread dump is by
> sending
> >> the SIGQUIT signal (kill -3) to the JVM process running Neo4j.
> >>
> >> Cheers,
> >> Tobias
> >>
> >> On Tue, Apr 12, 2011 at 6:35 PM, Dario Rexin 
> wrote:
> >>
> >>> Hi all,
> >>>
> >>> Due to huge performance issues with some of our neo queries I profiled
> my
> >>> calls on the neo server. The profiling shows, that up to 85% of the
> time the
> >>> threads are waiting for other threads. I don¹t understand what¹s going
> on
> >>> there. Hopefully someone with a deeper knowledge can help me. Am I
> doing
> >>> something wrong, or is it normal, that most of the time the threads are
> >>> blocking each other? Her is a screenshot, showing the results of my
> >>> profiling: http://i.imgur.com/eIfam.jpg
> >>>
> >>>
> >>> Thanks in advice,
> >>>
> >>> Dario
> >>> ___
> >>> Neo4j mailing list
> >>> User@lists.neo4j.org
> >>> https://lists.neo4j.org/mailman/listinfo/user
> >>>
> >>
> >>
>
> --
> Dario Rexin
> Junior Manager Engineering
> dario.re...@xing.com
>
> XING AG
> Gaensemarkt 43, 20354 Hamburg, Germany
>
> Commercial Reg. (Registergericht): Amtsgericht Hamburg, HRB 98807
> Exec. Board (Vorstand): Dr. Stefan Groß-Selbeck (Vorsitzender), Ingo Chu,
> Dr. Helmut Becker, Jens Pape
> Chairman of the Supervisory Board (Aufsichtsratsvorsitzender): Dr. Neil
> Sunderland
>
> Please join my network on XING:
> https://www.xing.com/profile/Dario_Rexin
>
> This e-mail may contain confidential and/or privileged information. If you
> are not the intended recipient (or have received this e-mail in error)
> please notify the sender immediately and destroy this e-mail. Any
> unauthorised copying, disclosure or distribution of the material in this
> e-mail is strictly forbidden and may be unlawful.
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo Server slow on frequent requests

2011-04-12 Thread Tobias Ivarsson
Hi Dario,

Looking at that picture it is indeed clear that a number of threads are
waiting for something. What is not shown is the more important information
about *what* they are waiting for. I would love to get information like that
in order to investigate the cause of the performance problem you are seeing.
If you could send a thread dump instead of a screenshot that would be a lot
more useful, since that would contain information about contention that I
could actually analyze. The easiest way to get a thread dump is by sending
the SIGQUIT signal (kill -3) to the JVM process running Neo4j.

Cheers,
Tobias

On Tue, Apr 12, 2011 at 6:35 PM, Dario Rexin  wrote:

> Hi all,
>
> Due to huge performance issues with some of our neo queries I profiled my
> calls on the neo server. The profiling shows, that up to 85% of the time the
> threads are waiting for other threads. I don’t understand what’s going on
> there. Hopefully someone with a deeper knowledge can help me. Am I doing
> something wrong, or is it normal, that most of the time the threads are
> blocking each other? Her is a screenshot, showing the results of my
> profiling: http://i.imgur.com/eIfam.jpg
>
>
> Thanks in advice,
>
> Dario
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Number of nodes/relationships visited in query?

2011-04-10 Thread Tobias Ivarsson
That information is not available at the moment. But it is an interesting
idea. How would you like to access it? Can you give a quick sketch of how
you envision the API for it.

Would it be something like this?

interface PathFinder {
P findSinglePath( Node start, Node end ); // ok, nothing added here
// you'd have to use this version to get those statistics:
CountIterable findAllPaths( Node start, Node end );
}

interface CountIterable extends Iterable {
CountIterator iterator();
}

interface CountIterator extends Iterator {
int numberOfNodesVisitedSoFar();
int numberOfRelationshipsVisitedSoFar();
}

(But with more thought through names)

Since computation isn't performed until actually requested (when the
iterator is iterated over), and since the Iterable could give a different
result when you iterate over it subsequent times (due to the graph being
modified), the Iterator object is the only object where I could see that
such information could be added usefully. This does mean that you cannot use
the java foreach loop with such an Iterable AND get the visited count, but
would have to resort to using the hasNext() and next() methods. We could
quite easily add some convenience methods for making that easier though,
something like:

CountIterator pathIter = shortestPath.findAllPaths( start, end
).iterator();
for ( Path path : IterUtil.loop( pathIter ) ) {
doSomethingWith(path);
}
// after the loop is done, "number of nodes visited so far" is the total
number of visited nodes.
int visitedNodes = pathIter.numberOfNodesVisitedSoFar();

WDYT? If this is useful we could add this kind of statistics to all types of
traversals. Exposing that through the REST interface would be even simpler,
the implementation would simply do the equivalent of the iteration above
then add the statistics to the result. For paginated results (when those are
added) we could have the statistics reflect the number of nodes visited for
creating that page of data, for algorithms that find the "easiest" solutions
first, you could use those statistics to stop a search when the number of
nodes visited to collect a page grows too big.

Cheers,
Tobias

PS. I had a few other ideas on how such statistics information could be
added, but this was the least invasive of them. I sketched this up in five
minutes (after half a bottle of wine), so I'm very open to the possibility
of there being more elegant ways of adding this information.

On Sun, Apr 10, 2011 at 10:45 PM, Stephan Hagemann <
stephan.hagem...@googlemail.com> wrote:

> Hi all,
>
> is there a way for me to get to the number of nodes or relationships that
> the graph algorithms (like ShortestPath) have visited and output it with
> the
> result of the query? I would like to do that to analyze the performance and
> load of query processing. Any ideas?
>
> Thanks!
>
> Stephan
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo4j Storage provider

2011-04-10 Thread Tobias Ivarsson
Hi Elangovan,

In theory it would be possible. Neo4j started out as an abstraction layer on
top of other storage systems many years ago. The first implementation that
was somewhat useable was based on Berkley DB for storage. But even then
performance wasn't good enough. Not until we implemented our own storage
technology was it good enough for actual use. Since then evolution of Neo4j
has been progressing with our own native storage (nioneo) as the primary
storage, which has made the rest of Neo4j more closely tied to that specific
implementation.

That said, there are still remnants of the time when the storage engine was
pluggable, so it could be possible to substitute your own engine. It is
going to take some patching of the internals and a fair bit of coding work,
but you are welcome to try it on your own.

If you don't mind me asking, why couldn't you just use Neo4j as is? That bit
was a bit lost in your message.

If I were you I would start out with writing a prototype of my application
using Neo4j as-is. That would validate the benefits of the Neo4j graph
database model, and show the benefits it would have to solving the problems
that the application is meant to solve. This prototype I would then bring to
my co-workers, showing them the benefits of using a graph for structuring
data. First then would I start thinking of how this would fit in with the
rest of the infrastructure for the application, does the benefits outweigh
the cost of adding another storage engine? If the value of it is high *and*
the cost of adding another storage engine is high, then I would consider
adapting the model to the existing storage, but carefully being aware of the
cost of doing so (i.e. losing the ability to get commercial support from the
vendor, Neo Technology). I'd start with quick simple prototypes to verify to
myself that the performance and other values of Neo4j didn't get lost too
much to make it unfit to my needs as I adapted the model to that other
storage solution.

I hope that was at least the beginning of an answer to your question. I'm
looking forward to your follow-up.

Cheers,
Tobias

On Sun, Apr 10, 2011 at 3:15 AM, elangovan shanmugam  wrote:

>
> Hi, I am new to Neo4j. Currently trying some simple graph prototypes to our
> business problems. Neo4j comes up with its own storage technology. Is it
> possible to use other storage technologies (say MongoDB) with Neo4j?
> The main reason is that... I will be if I asked for another storage
> technology in our group. I just convinced that we needed MongoDB, I would
> like to see if I can leverage that with Neo4j.
> Thanks & Appreciate your help.
> Elangovan S
>
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Trouble with Exclude and Continue in Traversal

2011-04-08 Thread Tobias Ivarsson
tImpl.java:366)
>at java.net.Socket.connect(Socket.java:529)
>at java.net.Socket.connect(Socket.java:478)
>at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
>at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
>at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
>at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:760)
>at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
>at
> sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
>at
> java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
>at
> com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:218)
>at
> com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:129)
>... 14 more
>
> What have I done wrong?
>
> Thanks Mattias for helping me doing lot of the code in the Traversal
> description.
>
> Brendan
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Lucene 3.1 with neo4j. Is it OK?

2011-04-07 Thread Tobias Ivarsson
1.3 is frozen, nothing new is going in until the 1.4 line.

-tobias

On Thu, Apr 7, 2011 at 6:32 PM, Rick Bullotta
wrote:

> Any plans to officially test Lucene 3.1 for Neo 1.3 GA?
>
> There are plenty of useful things and bug fixes in Lucene 3.1.
>
>
> -Original Message-
> From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org]
> On Behalf Of Tobias Ivarsson
> Sent: Thursday, April 07, 2011 5:45 AM
> To: Neo4j user discussions
> Subject: Re: [Neo4j] Lucene 3.1 with neo4j. Is it OK?
>
> I see no reason for it not to work, Lucene has a good story of
> compatibility
> between releases with the same major version.
>
> But please note that this isn't something Neo Technology would officially
> support (yet), so from that point of view you'd be "on your own".
>
> -t
>
> On Thu, Apr 7, 2011 at 11:16 AM, Balazs E. Pataki  >wrote:
>
> > Hi,
> >
> > the subject says is all. :-) But anyway, is it possible/safe to use the
> > brand new 3.1 (31 March 2011) release of Lucene with neo4j?
> >
> > Thanks,
> > ---
> > balazs
> > _______
> > Neo4j mailing list
> > User@lists.neo4j.org
> > https://lists.neo4j.org/mailman/listinfo/user
> >
>
>
>
> --
> Tobias Ivarsson 
> Hacker, Neo Technology
> www.neotechnology.com
> Cellphone: +46 706 534857
> ___
> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] building from source

2011-04-07 Thread Tobias Ivarsson
The failures you are seeing are for tests that deal with large data. They
thus need a large heap configuration to succeed.

For specifying such settings for maven you would use the MAVEN_OPTS
environment variable, something like:

export MAVEN_OPTS=-Xmx1G

Cheers,
Tobias

On Thu, Apr 7, 2011 at 4:58 PM, Will Holcomb  wrote:

> Thanks. I was trying to use the jar target rather than install.
>
> That build fails with:
>
> ---
>  T E S T S
> ---
> Running org.neo4j.com.TestCommunication
> Thu Apr 07 10:53:14 EDT 2011: MadeUpServer communication server started and
> bound to 1234
> [MadeUpServerProcess:27271] Thu Apr 07 10:53:15 EDT 2011: MadeUpServer
> communication server started and bound to 
> [MadeUpServerProcess:27271] Thu Apr 07 10:53:24 EDT 2011: MadeUpServer
> shutdown, closing all channels
> Tests run: 5, Failures: 1, Errors: 3, Skipped: 0, Time elapsed: 10.353 sec
> <<< FAILURE!
>
> Results :
>
> Failed tests:
>  clientGetResponseFromServerViaComLayer(org.neo4j.com.TestCommunication)
>
> Tests in error:
>  makeSureClientStoreIdsMustMatch(org.neo4j.com.TestCommunication)
>  makeSureServerStoreIdsMustMatch(org.neo4j.com.TestCommunication)
>  makeSureClientCanStreamBigData(org.neo4j.com.TestCommunication)
>
> Tests run: 5, Failures: 1, Errors: 3, Skipped: 0
>
>
> I can get it to build though with: mvn -Dmaven.test.skip=true install
>
> –☮W
>
> On Thu, Apr 7, 2011 at 1:05 AM, Peter Neubauer <
> peter.neuba...@neotechnology.com> wrote:
>
> > Willi,
> > the main build tool is maven, and we are in the middle of a
> > major reshuffling on GIT, so if you install maven.apache.org and try
> > "mvn clean install" that, things should work out better. Would that be
> > an option?
> >
> > Cheers,
> >
> > /peter neubauer
> >
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Lucene 3.1 with neo4j. Is it OK?

2011-04-07 Thread Tobias Ivarsson
I see no reason for it not to work, Lucene has a good story of compatibility
between releases with the same major version.

But please note that this isn't something Neo Technology would officially
support (yet), so from that point of view you'd be "on your own".

-t

On Thu, Apr 7, 2011 at 11:16 AM, Balazs E. Pataki wrote:

> Hi,
>
> the subject says is all. :-) But anyway, is it possible/safe to use the
> brand new 3.1 (31 March 2011) release of Lucene with neo4j?
>
> Thanks,
> ---
> balazs
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Constructing an evaluator that only takes specific nodes from a path

2011-04-06 Thread Tobias Ivarsson
That would be EXCLUDE_AND_PRUNE.

On Thu, Apr 7, 2011 at 7:58 AM, Dario Rexin  wrote:

> Hi Peter, yes that would be not to include the path in the result set.
>
>
>
> On 07.04.2011, at 07:01, "Peter Neubauer" <
> peter.neuba...@neotechnology.com> wrote:
>
> > Dario,
> > I am not quite sure I understand what you mean by "drop" is that not
> > to include the path into the result or prune or something else? Do you
> > have a concrete example of this, maybe a simple toy graph test with
> > toy information?
> >
> > 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 Wed, Apr 6, 2011 at 6:35 PM, Dario Rexin 
> wrote:
> >> Hello,
> >>
> >> we are trying to construct an Evaluator that will select only one node
> from the middle of a path and include it in the result. We do have a
> specific path we are looking for and the endNode is stored in 'end'. Now
> what we would like to do is have an Evaluator like this:
> >>
> >>  import org.neo4j.graphdb.traversal.
> >> Evaluator;
> >>
> >>  new Evaluator(){
> >>@Override
> >>public Evaluation evaluate(org.neo4j.graphdb.Path path) {
> >>if(path.length() > 3) {
> >>return Evaluation.EXCLUDE_AND_PRUNE;
> >>} else if (path.length() == 2) {
> >>return Evaluation.INCLUDE_AND_CONTINUE;
> >>} else if (path.length() < 2){
> >>return Evaluation.EXCLUDE_AND_CONTINUE;
> >>} else {
> >>return path.endNode().getId() == end.getId() ?
> Evaluation.EXCLUDE_AND_PRUNE : Evaluation.DROP_PATH_AND_PRUNE;
> >>}
> >>}
> >>  }
> >>
> >> The decision on whether to accept or drop a path is based on wether we
> have reached the endNode. That's why we would like to use something like
> DROP_PATH_AND_PRUNE, which doesn't exist. What are we missing?
> >>
> >> Any help appreciated!
> >>
> >> Thanks,
> >> Stephan and Dario
> >> ___
> >> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] CNFE in Neo4j Server

2011-04-06 Thread Tobias Ivarsson
The simplest explanation is probably the correct one: it is not on the
classpath.
This class is to be found in the jersey-server-1.3.jar is that jar on the
classpath? (or in jersey-client-1.3.jar, either will do)

The simplest way one might be fooled into not including it in the classpath
is due to there not being a compile-time dependency on it. the JAX-RS API
does not require an implementation for compiling, but at runtime you must
have a valid JAX-RS implementation available on the classpath. The default
implementation is the one defined by com.sun.ws.rs.ext.RuntimeDelegateImpl,
a class that jersey provides, being the reference implementation.

-tobias

On Thu, Apr 7, 2011 at 7:19 AM, Peter Neubauer <
peter.neuba...@neotechnology.com> wrote:

> Hi there,
> trying to execute
>
> https://github.com/peterneubauer/neo4j-gremlin-plugin/blob/master/src/test/org/neo4j/server/plugin/gremlin/GremlinPluginTest.java
> as a JUnit test on Eclipse/Mac with default JDK, Saikat is getting the
> following:
>
>
> java.lang.ExceptionInInitializerError
>   at
> org.neo4j.server.rest.repr.formats.JsonFormat.(JsonFormat.java:43)
>   at
> org.neo4j.server.plugin.gremlin.GremlinPluginTest.setUpBeforeClass(GremlinPluginTest.java:37)
>   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>   at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>   at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>   at java.lang.reflect.Method.invoke(Method.java:597)
>   at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
>   at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>   at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>   at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
>   at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
>   at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
>   at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>   at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>   at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>   at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>   at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: java.lang.RuntimeException:
> java.lang.ClassNotFoundException:
> com.sun.ws.rs.ext.RuntimeDelegateImpl
>   at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:122)
>   at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:91)
>   at javax.ws.rs.core.MediaType.(MediaType.java:44)
>   ... 17 more
> Caused by: java.lang.ClassNotFoundException:
> com.sun.ws.rs.ext.RuntimeDelegateImpl
>   at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
>   at java.security.AccessController.doPrivileged(Native Method)
>   at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
>   at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
>   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
>   at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
>   at java.lang.Class.forName0(Native Method)
>   at java.lang.Class.forName(Class.java:169)
>   at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:62)
>   at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:155)
>   at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:105)
>   ... 19 more
>
> Any clues on why there is a class missing?
>
> 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.
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] EmbeddedReadOnlyGraphDatabase workings

2011-04-06 Thread Tobias Ivarsson
nce its creation. It there a way to force refresh
> besides
> >> > >> creating a new instance?
> >> > >>
> >> > >> Also are there any other/better ways to do that (1 writer, 1
> reader)
> >> > >> without going into the server mode?
> >> > >>
> >> > >> Thanks a lot,
> >> > >>
> >> > >> Alfredas
> >> > >> ___
> >> > >> Neo4j mailing list
> >> > >> User@lists.neo4j.org
> >> > >> https://lists.neo4j.org/mailman/listinfo/user
> >> > >
> >> > >
> >> > >
> >> > > --
> >> > > David Montag 
> >> > > Neo Technology, www.neotechnology.com
> >> > > Cell: 650.556.4411
> >> > > Skype: ddmontag
> >> > >
> >> >
> >>
> >>
> >>
> >> --
> >> David Montag 
> >> Neo Technology, www.neotechnology.com
> >> Cell: 650.556.4411
> >> Skype: ddmontag
> >> ___
> >> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] InvalidRecordException

2011-04-06 Thread Tobias Ivarsson
This has been very thoroughly investigated, and still is being thoroughly
investigated, since we have not been able to reproduce the problem at all.
Any hints on what scenario this occurred in that you can provide would be
immensely helpful.

Cheers,
Tobias

On Tue, Apr 5, 2011 at 9:41 PM, Degrassi Francesco <
francesco.degra...@emaze.net> wrote:

> Hello everyone.
> Was this issue investigated and, perhaps, solved ?
> We started experiencing the same today, on Neo 1.1 on CentOS 5 and couldn't
> manage to reproduce it reliably yet.
>
> I will attach a stacktrace and more info tomorrow, but wanted to know if
> there
> were any news on the issue.
>
> Thanks in advance
>
> Francesco Degrassi
>
> Il 10 marzo 2011 alle 21.58 Massimo Lusetti  ha
> scritto:
>
> > On Thu, Mar 10, 2011 at 6:11 PM, Axel Morgner  wrote:
> >
> > > Hi,
> > >
> > > I'm getting an InvalidRecordException
> > >
> > > org.neo4j.kernel.impl.nioneo.store.InvalidRecordException: Node[5] is
> > > neither firstNode[37781] nor secondNode[37782] for Relationship[188125]
> > > at
> > >
> org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.getMoreRelationships(ReadTransaction.java:131)
> > > at
> > >
> org.neo4j.kernel.impl.nioneo.xa.NioNeoDbPersistenceSource$ReadOnlyResourceConnection.getMoreRelationships(NioNeoDbPersistenceSource.java:280)
> > > at
> > >
> org.neo4j.kernel.impl.persistence.PersistenceManager.getMoreRelationships(PersistenceManager.java:100)
> > > at
> > >
> org.neo4j.kernel.impl.core.NodeManager.getMoreRelationships(NodeManager.java:585)
> > > at
> > >
> org.neo4j.kernel.impl.core.NodeImpl.getMoreRelationships(NodeImpl.java:358)
> > > at
> > >
> org.neo4j.kernel.impl.core.IntArrayIterator.hasNext(IntArrayIterator.java:115)
> > >
> > > when iterating through the relationships of a certain node:
> > >
> > > Node node = graphDb.getNodeById(sNode.getId());
> > >
> > > Iterable rels =
> > > node.getRelationships(relType, dir);
> > >
> > > for (Relationship r : rels) { <- here the expeption
> > > occurs
> > > ...
> > > }
> > >
> > > I'm using 1.3.M03.
> > >
> > > Seems that the database is in an inconsitant state. Don't know how this
> > > could happen ...
> > >
> > >
> > > Greetings
> > >
> > > Axel
> > >
> > > ___
> > > Neo4j mailing list
> > > User@lists.neo4j.org
> > > https://lists.neo4j.org/mailman/listinfo/user
> > >
> >
> >
> > I'm encountering this same/similar exception quite ofter lately, with
> > the same 1.3.M03 version, on FreeBSD 8.2 with  OpenJDK Runtime
> > Environment (build 1.6.0-b21) OpenJDK 64-Bit Server VM (build
> > 19.0-b09, mixed mode):
> >
> > org.neo4j.kernel.impl.nioneo.store.InvalidRecordException:
> > Record[4130751] not in use
> > at
>
> >org.neo4j.kernel.impl.nioneo.store.RelationshipStore.getRecord(RelationshipStore.java:194)
> > at
>
> >org.neo4j.kernel.impl.nioneo.store.RelationshipStore.getRecord(RelationshipStore.java:96)
> > at
>
> >org.neo4j.kernel.impl.nioneo.xa.WriteTransaction.connectRelationship(WriteTransaction.java:1435)
> > at
>
> >org.neo4j.kernel.impl.nioneo.xa.WriteTransaction.relationshipCreate(WriteTransaction.java:1389)
> > at
>
> >org.neo4j.kernel.impl.nioneo.xa.NeoStoreXaConnection$RelationshipEventConsumerImpl.createRelationship(NeoStoreXaConnection.java:256)
> > at
>
> >org.neo4j.kernel.impl.nioneo.xa.NioNeoDbPersistenceSource$NioNeoDbResourceConnection.relationshipCreate(NioNeoDbPersistenceSource.java:370)
> > at
>
> >org.neo4j.kernel.impl.persistence.PersistenceManager.relationshipCreate(PersistenceManager.java:153)
> > at
>
> >org.neo4j.kernel.impl.core.NodeManager.createRelationship(NodeManager.java:309)
> > at
>
> >org.neo4j.kernel.impl.core.NodeImpl.createRelationshipTo(NodeImpl.java:387)
> > at
>
> >org.neo4j.kernel.impl.core.NodeProxy.createRelationshipTo(NodeProxy.java:186)
> >
> > Did it rings and alert bell!?
> >
> > Cheers
> > --
> > Massimo
> > http://meridio.blogspot.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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Query paths of certain lengths...

2011-03-31 Thread Tobias Ivarsson
Hi Jeff,

What you are describing is a Friends-of-a-friend (foaf) traversal, "which
are the friends of my friends, who are not my direct friends".

The best way to perform such a traversal is by using the traversal API:

n.traverse( Order.BREADTH_FIRST, // because we want to exclude the direct
friends early
  new StopEvaluator() { // don't traverse deeper than depth two
  boolean isStopNode(TraversalPosition pos) { return pos.depth() == 2; }
   }, new ReturnableEvaluator() { // return the ones found on depth two
  boolean isReturnableNode(TraversalPosition pos) { return pos.depth()
== 2; }
   }, RelTypes.FRIEND, Direction.BOTH ); // Traverse Friend relationships,
in any direction

Since this traverses breadth first, it will find the direct friends first,
and exclude those, since this kind of traversal does not revisit nodes.

The traversal above almost does what you want, except that it only returns
nodes, and you wanted the paths. For that you can use our more capable
tentative traversal API to do the same traversal, but getting paths instead:

TraversalDescription foaf = Traversal.description()
.breadthFirst()
.relationships( RelTypes.FRIEND, Direction.OUTGOING )
.evaluator( new Evaluator() {
Evaluation evaluate( Path path )
{
return ( path.length() == 2 ) ? Evaluation.INCLUDE_AND_PRUNE :
Evaluation.EXCLUDE_AND_CONTINUE;
}
} );

Then you'd just iterate over the paths from the given node:

for (Path foafPath : foaf.traverse( n ) ) {
printPath( foafPath );
}

If you want that for ALL possible start-nodes, I guess you would have to
iterate through all nodes and apply the same traversal. But given just a
single start node, the above traversal is enough, and it is fast enough to
do in real time (show the friends of my friends on a social media website).

Cheers,
Tobias

On Wed, Mar 30, 2011 at 7:51 PM, jisenhart  wrote:

>
> Suppose I have the following node/paths
>
> n -> n1
> n -> n2
> n -> n4
>
> n2 -> n1
> n2 -> n3
> n2 -> n4
>
> I want to find all paths of depth two (for example):
>
> n -> n2 -> n3
> n -> n2 -> n4
>
> and filter out those paths where a shorter path exists to a given node
> (n) leaving just
>
> n -> n2 -> n3
>
> since n -> n4 is "shallower" than n -> n2 -> n4
>
>
> Is this possible? I see GraphAlgoFactory.pathsWithLength(expander,
> length). But unclear on how to proceed beyond that.
>
> Jeff
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Glassfish problem

2011-03-27 Thread Tobias Ivarsson
Hi Matěj,

As the error message says, most likely this is caused by another instance
already being open in the same JVM.

If I were to have I guess, I think that your code (in the singleton you
mention) create a new GraphDatabaseService without invoking shutdown() on
the existing one first. Probably what you've done is just null out the
reference (which is why your code thinks it has to start a new instance).

There is no need to startup and shutdown the graph database multiple times
(are you doing this for each request?), it is not a database connection, it
is the database, and startup and shutdown takes time. It is better to tie
the lifecycle of the graph database to the lifecycle of your application.

Cheers,
Tobias

2011/3/28 Matěj Plch 

> Hi! So we deployed our application, but we get Caused by:
> java.lang.IllegalStateException: Unable to lock store ... SEVERE:
> 0-database/neostore], this is usually caused by another Neo4j kernel
> already running in this JVM for this particular store
> Is there any best practise how to avoid this? The database is opened or
> created from class with is Singleton. Can this be the problem?
> I googled this problem, but no solution found.
> Matěj Plch
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] A picture worth a 170'000 nodes and 650'000 edges

2011-03-24 Thread Tobias Ivarsson
Nice to see my visualization code being put to good use.

The most recent version has moved to github, along with the rest of Neo4j,
since this is an unofficial tool it is on my personal github:
https://github.com/thobe/neoviz

Cheers,
Tobias

On Thu, Mar 24, 2011 at 8:09 PM, Alfredas Chmieliauskas  wrote:

> For fun:
>
> This is a visualization of the graph resulting from a simulation
> (interacting energy markets).
>
> http://test.eeni.tbm.tudelft.nl/~alfredas/d13n-graph.png
>
> After 10 simulation ticks we have ~170'000 entities (agents, markets,
> power plants, bids, substances, technologies, etc) and ~650'000
> relations between these entities. Different colors represent different
> types of relations. These relations are created at a rate of ~60'000
> per tick, as a result of agents trading, investing and energy flows.
> By the end of the simulation we get ~1m nodes and ~4m edges.
>
> The visualization was made using neo-graphviz:
> https://svn.neo4j.org/laboratory/components/neo-graphviz/
>
> The crazy part is that we can still make sense of what's happening
> there, using a few pipes and traversals :-)
>
> Alfredas
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Filter by relationship Property

2011-03-24 Thread Tobias Ivarsson
For the first position (at the start node), there is no relationship leading
up to it, which means that the lastRelationship() method returns null.
This is a special case that has to be dealt with.

Cheers,
Tobias

On Wed, Mar 23, 2011 at 9:05 PM, Justine Mathews  wrote:

> Tobias,
>
>
>
> I have used the return filter, I am getting following error when making
> rest call for node  traverse,
>
> Error : The remote server returned an error: (500) Internal Server Error.
>
> Response header status : *javax.script.ScriptException:
> sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot call method
> "getProperty" of null (#1)*
>
>
>
> please find below the syntax,
>
>
>
> *url:* http://localhost:7474/db/data/node/80/traverse/node
>
> *traverse:*
>
> {"order": "depth first","relationships": [
>
>   {
>
> "type": "Friend",
>
> "direction": "all"
>
>   }
>
> ],"return filter": {
>
>   "language": "javascript",
>
>   "body": "position.lastRelationship().hasProperty(\"customerId\");"
>
> },"max depth": 1}
>
>
>
> · *Kernel version*
>
> Neo4j - Graph Database Kernel 1.3.M03
>
>
>
>
>
> --
> Regards,
> Justine K Mathews, MCSD.NET
> Mob: +44-(0) 7795268546
>
> http://www.justinemathews.com
>
> http://uk.linkedin.com/in/justinemathews
>
>
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] 回复: neo4j reade with getNodeById && index.with...

2011-03-23 Thread Tobias Ivarsson
Why not just keep the reference to the actual Node object then? Neo4j's
internal cache and memory management makes this really cheap to do. [1]

As to your questions about size of property of an index and maximum memory,
you will have to be clearer, I really don't understand what you are asking
for.

-tobias

[1] a Node object always occupies exactly 32B in a 64bit JVM, and I believe
that would translate to 20B on a 32bit JVM. The actual state of the Node is
stored internally in Neo4j and managed through the Neo4j cache.

2011/3/23 孤竹 

> Yes, I know I can't assign the IDS. But I can got some node's ID ,and cache
> it in some place( i.e. in the cache).
>
>
> when I need to search something , I got the id in the cache . Is it better
> ?
>
>
> At last, I wonder what size is property of the index? Depends On the memory
> I gived to Neo4j ?
>
>
> Is there a suggest rate ? for example , If the max-memory for Neo4j is 1G,
> and the index is better less than 500M ?
>
>
> -- 原始邮件 --
> 发件人: "mattias";
> 发送时间: 2011年3月23日(星期三) 下午4:24
> 收件人: "Neo4j user discussions";
>
> 主题: Re: [Neo4j] neo4j reade with getNodeById && index.with...
>
>
>  And also to circumvent this different in performance for not-very-big
> indexes you can make use of the built-in caching (for the new API)... see
>
> http://docs.neo4j.org/chunked/snapshot/indexing-lucene-extras.html#indexing-lucene-caching
>
> 2011/3/23 Tobias Ivarsson 
>
> > It is correct that getNodeById is much faster than an index lookup, but
> IDs
> > are assigned by Neo4j, there is no way for you as a user to assign IDs,
> > which makes it a very blunt tool for looking up entities. To know which
> id
> > corresponds to a particular name or similar attribute, you would have to
> go
> > through an index, and that is exactly what the Neo4j index API does for
> > you.
> >
> > By the way, the LuceneIndexService is a deprecated API, use
> > GraphDatabaseService#index() instead:
> >
> >
> http://components.neo4j.org/neo4j/1.3.M04/apidocs/org/neo4j/graphdb/GraphDatabaseService.html#index()
> >
> > Cheers,
> > Tobias
> >
> > On Wed, Mar 23, 2011 at 3:45 AM, 孤竹  wrote:
> >
> > > HI,all
> > >
> > >   I Found something interesting, The test as  follow:
> > >
> > > public static void main(String args[]) {
> > >GraphDatabaseService db = new EmbeddedGraphDatabase("testDB");
> > >indexService = new LuceneIndexService(db);
> > >Long startTime = System.currentTimeMillis();
> > >for(int i =0 ;i <1;i++){
> > >Node node = getNodeByIndexProperty(db,String.valueOf(i));
> > >}
> > >Long endTime = System.currentTimeMillis();
> > >System.out.println("time = " + (endTime - startTime));
> > >}
> > >public static Node getNodeByIndexProperty(GraphDatabaseService db,
> > > String keyValue) {
> > > //Node node = indexService.getSingleNode(KEY_NAME, keyValue);
> > >Node node = db.getNodeById(Long.valueOf(keyValue));
> > >return node;
> > >}
> > >
> > > When I try to use the method indexService.getSingleNode.. with 
> > > times, It will take 2 seconds (nearly) , BY when I use
> db.getNodeById
> > > same times, It just take 350 millisecond . Does it mean getById is
> faster
> > > than use index ? or Does that mean the natural index is better than
> index
> > if
> > > I can use it ?
> > >
> > > thanks for your help ,and replies, that help me very much!
> > > ___
> > > Neo4j mailing list
> > > User@lists.neo4j.org
> > > https://lists.neo4j.org/mailman/listinfo/user
> > >
> >
> >
> >
> > --
> > Tobias Ivarsson 
> > Hacker, Neo Technology
> > www.neotechnology.com
> > Cellphone: +46 706 534857
> > ___
> > 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] neo4j reade with getNodeById && index.with...

2011-03-23 Thread Tobias Ivarsson
It is correct that getNodeById is much faster than an index lookup, but IDs
are assigned by Neo4j, there is no way for you as a user to assign IDs,
which makes it a very blunt tool for looking up entities. To know which id
corresponds to a particular name or similar attribute, you would have to go
through an index, and that is exactly what the Neo4j index API does for you.

By the way, the LuceneIndexService is a deprecated API, use
GraphDatabaseService#index() instead:
http://components.neo4j.org/neo4j/1.3.M04/apidocs/org/neo4j/graphdb/GraphDatabaseService.html#index()

Cheers,
Tobias

On Wed, Mar 23, 2011 at 3:45 AM, 孤竹  wrote:

> HI,all
>
>   I Found something interesting, The test as  follow:
>
> public static void main(String args[]) {
>GraphDatabaseService db = new EmbeddedGraphDatabase("testDB");
>indexService = new LuceneIndexService(db);
>Long startTime = System.currentTimeMillis();
>for(int i =0 ;i <1;i++){
>Node node = getNodeByIndexProperty(db,String.valueOf(i));
>}
>Long endTime = System.currentTimeMillis();
>System.out.println("time = " + (endTime - startTime));
>}
>public static Node getNodeByIndexProperty(GraphDatabaseService db,
> String keyValue) {
> //Node node = indexService.getSingleNode(KEY_NAME, keyValue);
>Node node = db.getNodeById(Long.valueOf(keyValue));
>return node;
>}
>
> When I try to use the method indexService.getSingleNode.. with 
> times, It will take 2 seconds (nearly) , BY when I use db.getNodeById
> same times, It just take 350 millisecond . Does it mean getById is faster
> than use index ? or Does that mean the natural index is better than index if
> I can use it ?
>
> thanks for your help ,and replies, that help me very much!
> _______
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Filter by relationship Property

2011-03-23 Thread Tobias Ivarsson
Hi Justine,

What you have specified is to prune traversal branches where customerId is
2, this means that the traversal will not continue further from that point,
but it doesn't mean that this position will not be returned. For that you
need to specify a "return filter" instead of or in addition to the "prune
evaluator".

The syntax for "return filter" is the same as for "prune evaluator", see:
http://components.neo4j.org/neo4j-server/stable/rest.html#Traverse

Cheers,
Tobias

On Tue, Mar 22, 2011 at 11:55 PM, Justine Mathews <
justine.math...@megree.com> wrote:

>
> Please find below the traversal syntax I am using from rest client, The
> result is not filtered by the
> customerId( relationship property)  value 2.
>
> {"order": "depth first","relationships": [
>  {
>"type": "Friend",
>"direction": "all"
>  }
> ],"prune evaluator": {
>  "language": "javascript",
>  "body": "position.lastRelationship().getProperty(\"customerId\") == 2;"
> }}
>
>
>
> --
> Regards,
> Justine K Mathews, MCSD.NET
> Mob: +44-(0) 7795268546
> http://www.justinemathews.com<http://www.justinemathews.com/>
> http://uk.linkedin.com/in/justinemathews
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Fans of Neo4j From Chinese

2011-03-22 Thread Tobias Ivarsson
Rick, I don't quite understand what you are asking for. Could you elaborate
further?

-tobias

2011/3/22 Rick Bullotta 

> I'd like to explore this question a bit further.  Does this mean that
> basically there's no way to scale beyond a single thread/CPU for
> disconnected graphs if you have complex graph dependencies (e.g. you cannot
> create disjoint subgraphs)?
>
>
>
> -Original Message-
> From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org]
> On Behalf Of Tobias Ivarsson
> Sent: Saturday, March 19, 2011 5:59 AM
> To: Neo4j user discussions
> Subject: Re: [Neo4j] Fans of Neo4j From Chinese
>
> Neo4j serializes commits. I.e. at most one thread is committing a
> transaction at once.
> For the actual work of building up the data to be committed, Neo4j supports
> multiple concurrent threads.
>
> This fact alone, that there is a single congestion point, means that if an
> application, like in your case, is very write centric, it is unlikely for
> it
> to scale beyond two threads, with one building up the next commit while the
> other is commiting its data. It might scale to a few more threads than that
> if the buildup time is significantly larger than the commit time. It is
> simple time slicing, "only one train can be at the station at once", then
> you have to do the maths on how many "trains can be out on the track"
> during
> that time.
>
> It is also worth keeping in mind, that for CPU bound operation, an
> application doesn't scale much further than the number of CPUs in the
> computer. The threads that are not in commit mode - i.e. the ones that are
> building up the data for their next commit - are CPU bound, and contending
> for the same CPU resources. This means that your application is not going
> to
> scale much further than the number of CPUs in your computer, and few
> desktop/laptop computers have more than 4 CPUs these days, which makes 5
> threads about the most you can squeeze out of it, anything more than that
> is
> just going to add contention, and possibly even slow things down.
>
> Finally, the (CPU bound) threads that create the graph might be contending
> on the same resources. As Peter said. If multiple threads modify the same
> node or relationship, i.e. if they create relationships to the same node
> (the root node for example), they are all going to block on that resource.
> Neo4j only allows one transaction to modify each entity at a time. This
> means that to get maximum concurrency out of your data creation, each
> thread
> should be creating each own disconnected subgraph. And if they have
> connected parts, the connections to the "global data" should be made last
> in
> the transaction (in a predictable order to avoid deadlocks[1]), to maximize
> the time the thread is operational before hitting the
> "congestion point" that is the (potentially) contended data.
>
> Cheers,
> Tobias
>
> [1] Neo4j will detect if a deadlock has occurred and throw a
> DeadlockDetectedException in that case.
>
> 2011/3/18 孤竹 
>
> > hi,
> >
> >
> >   Sorry for disturb you , I am a chinese engineer , Excused for my bad
> > english :) .
> >
> >
> >   Recently, I am learning Neo4j and trying to use it in my project . But
> > When I make a Pressure on neo4j with 5 theads , 10 theads, 20 and 30, I
> > found the nodes inserted to the Neo4J is not change obvious (sometimes
> not
> > change ~ ~! ). Does it not matter with threads ? the kenerl will make it
> > Serial ? Is there any documents or something about The performance of
> Neo4j
> > ? thanks for your help
> >
> >
> >
> >   The program as follows:
> >   I put this function in ExecutorService ,with 5/10/30 threads. then test
> > for the nodes inserted into at same time .(The counts have not changed
> > obviously)
> >
> >
> > Transaction tx = null;
> >Node before = null;
> >try {
> >for (int i = 0; i < 100; i++) {
> >if(stop == true){
> >return;
> >}
> >if (graphDb == null) {
> >return;
> >}
> >try {
> >if (tx == null) {
> >tx = graphDb.beginTx();
> >}
> > 

Re: [Neo4j] Fans of Neo4j From Chinese

2011-03-19 Thread Tobias Ivarsson
gt; KNOWS);
>before = end;
>// 每一千次 commit一次
>if (i % 100 == 0) {
>tx.success();
>tx.finish();
>tx = null;
>}
>} catch (Exception e) {
>         System.out.println("write : = " +
> e);
>}
>}
>} catch (Exception e) {
>} finally {
>tx.finish();
>}
>}
>
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Problems installing neo4j.py on Mac

2011-03-17 Thread Tobias Ivarsson
   neo4j-python/src/site/site.xml
> Aneo4j-python/src/site/apt
> Aneo4j-python/src/site/apt/apidoc
> Aneo4j-python/src/site/apt/apidoc/index.apt
> Aneo4j-python/src/examples
> Aneo4j-python/src/examples/python
> Aneo4j-python/src/examples/python/djangosites
> Aneo4j-python/src/examples/python/djangosites/manage.py
> Aneo4j-python/src/examples/python/djangosites/faces
> Aneo4j-python/src/examples/python/djangosites/faces/views.py
> Aneo4j-python/src/examples/python/djangosites/faces/__init__.py
> Aneo4j-python/src/examples/python/djangosites/faces/tests.py
> Aneo4j-python/src/examples/python/djangosites/faces/models.py
> Aneo4j-python/src/examples/python/djangosites/faces/urls.py
> Aneo4j-python/src/examples/python/djangosites/blog
> Aneo4j-python/src/examples/python/djangosites/blog/views.py
> Aneo4j-python/src/examples/python/djangosites/blog/__init__.py
> Aneo4j-python/src/examples/python/djangosites/blog/tests.py
> Aneo4j-python/src/examples/python/djangosites/blog/models.py
> Aneo4j-python/src/examples/python/djangosites/blog/urls.py
> Aneo4j-python/src/examples/python/djangosites/__init__.py
> Aneo4j-python/src/examples/python/djangosites/settings.py
> Aneo4j-python/src/examples/python/djangosites/imdb
> Aneo4j-python/src/examples/python/djangosites/imdb/orm_model.py
> Aneo4j-python/src/examples/python/djangosites/imdb/views.py
> Aneo4j-python/src/examples/python/djangosites/imdb/__init__.py
> Aneo4j-python/src/examples/python/djangosites/imdb/importer.py
> Aneo4j-python/src/examples/python/djangosites/imdb/neo_model.py
> Aneo4j-python/src/examples/python/djangosites/imdb/data
> A
>  neo4j-python/src/examples/python/djangosites/imdb/data/test-actors.list
> Aneo4j-python/src/examples/python/djangosites/imdb/data/sample.py
> Aneo4j-python/src/examples/python/djangosites/imdb/data/actors.txt
> A
>  neo4j-python/src/examples/python/djangosites/imdb/data/test-movies.list
> Aneo4j-python/src/examples/python/djangosites/imdb/tests.py
> Aneo4j-python/src/examples/python/djangosites/imdb/models.py
> Aneo4j-python/src/examples/python/djangosites/imdb/templatetags
> A
>  neo4j-python/src/examples/python/djangosites/imdb/templatetags/__init__.py
> A
>  neo4j-python/src/examples/python/djangosites/imdb/templatetags/apply.py
> Aneo4j-python/src/examples/python/djangosites/imdb/urls.py
> Aneo4j-python/src/examples/python/djangosites/urls.py
> Aneo4j-python/src/examples/python/djangosites/templates
> A
>  neo4j-python/src/examples/python/djangosites/templates/list_of_links.html
> Aneo4j-python/src/examples/python/djangosites/templates/imdb
> A
>  neo4j-python/src/examples/python/djangosites/templates/imdb/parts_table.html
> A
>  neo4j-python/src/examples/python/djangosites/templates/imdb/list_view.html
> Aneo4j-python/src/examples/python/djangosites/templates/imdb/index.html
> A
>  neo4j-python/src/examples/python/djangosites/templates/imdb/searchform.html
> Aneo4j-python/src/examples/python/djangosites/templates/imdb/view.html
> Aneo4j-python/src/examples/python/djangosites/templates/imdb/list.html
> Aneo4j-python/src/examples/python/djangosites/templates/base.html
> Aneo4j-python/pom.xml
> Aneo4j-python/README.txt
> Aneo4j-python/tech-debt.txt
> Exported revision 8590.
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neo4j OSGI bundle

2011-03-12 Thread Tobias Ivarsson
Oh, right.

Only the bundles that org.neo4j:neo4j depends on exports packages. I
guess org.neo4j:neo4j
would have to re-export the packages it depends on, so that your application
can depend on org.neo4j:neo4j and use those packages. Is that the
appropriate way? I have little OSGi experience (other than cursing over it
when it fails the build process because you need to very explicitly declare
which packages to include).

If that would solve things for you we will make sure to make those changes
for the next milestone. In the meantime you can directly depend on the
bundles org.neo4j:neo4j depends on, you are probably interested in at least:
org.neo4j:neo4j-kernel
org.neo4j:neo4j-lucene-index
But perhaps these as well:
org.neo4j:neo4j-management - JMX support
org.neo4j:neo4j-graph-algo - Graph algorithms, such as shortest path
org.neo4j:neo4j-com - Communication support, this includes the online-backup
server, and the bases that HA depends on
org.neo4j:neo4j-ha - High availability support for Neo4j
You might also want to be nice to us and have Neo4j send a ping to us every
day, letting us know how many people use Neo4j:
org.neo4j:neo4j-udc

Please let us know how this works out for you, and if there are any
problems. We have only done casual testing with OSGi, so any feedback is
much appreciated.

Cheers,
Tobias

On Fri, Mar 11, 2011 at 10:40 PM, Nicolas Jouanin  wrote:

> Hi,
>
> I'm planning to use Neo4j under OSGi framework. Because org.neo4j:neo4j
> defines the needed headers (in MANIFEST.MF), it can be deployed as a bundle
> on equinox or felix.
> Unfortunatelly, the bundle doesn't export any package so it's quite
> unuseful for me as my own bundle can't import them.
> I guess, at least neo4j bundle should have Export-Package directive in
> MANIFEST.MF file.
> Do you think these headers could be added in the next snapshot ?
>
> Thanks.
>
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Announcing Neo4j 1.3 “Abisko Lampa” M04

2011-03-11 Thread Tobias Ivarsson
It is in git: https://github.com/neo4j/graphdb

Neo4j moved from svn to git a little over a month ago.

Cheers,
Tobias

On Fri, Mar 11, 2011 at 3:21 PM, Jonah H. Harris <
jonah.har...@myyearbook.com> wrote:

> On Fri, Mar 11, 2011 at 9:02 AM, Chris Gioran <
> chris.gio...@neotechnology.com> wrote:
>
> > The most important feature of this release is of course the expansion of
> > the
>
> storage layer to allow for even more entities,
>
>
> Hey Chris,
>
> This sounds great.  Is it checked into SVN?  I'd like to see the
> differences
> in the file formats.
>
> --
> Jonah H. Harris, VP of Database Administration
> myYearbook.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] InvalidRecordException

2011-03-11 Thread Tobias Ivarsson
I need at least these two files:
neostore.nodestore.db
neostore.relationshipstore.db

-tobias

On Fri, Mar 11, 2011 at 11:26 AM, Massimo Lusetti wrote:

> On Fri, Mar 11, 2011 at 10:49 AM, Tobias Ivarsson
>  wrote:
>
> > Please tell me that you have the database file in the state they were in
> > when this happened. That you have not tried to repair the database in any
> > way.
> > If you do, could you please send me those database files off-list
> (dropbox
> > or similar, or contact me directly to discuss how to transfer it).
>
> Sure I have it unmodified and could make it available to you with
> dropbox but the db dir it's 2G... so is there something I could leave
> out?
> If you prefer you can continue to mail privately...
>
> > Massimo: If you can produce a test case that reliably (or at least
> > semi-reliably) reproduces this, that would of course be even better, but
> it
> > doesn't hurt if I could look at the store files and try to deduce the
> > problem in parallell.
>
> I'm working on it... will let you know soon.
>
> Thanks for the interest... Cheers
> --
> Massimo
> http://meridio.blogspot.com
> _______
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] InvalidRecordException

2011-03-11 Thread Tobias Ivarsson
Please tell me that you have the database file in the state they were in
when this happened. That you have not tried to repair the database in any
way.
If you do, could you please send me those database files off-list (dropbox
or similar, or contact me directly to discuss how to transfer it).

I will of course treat your data with utmost privacy, but I would love to
get to examine a store that exhibits this behavior to find out what could
have caused it.

Massimo: If you can produce a test case that reliably (or at least
semi-reliably) reproduces this, that would of course be even better, but it
doesn't hurt if I could look at the store files and try to deduce the
problem in parallell.

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] doInternalRecovery takes a long time

2011-03-10 Thread Tobias Ivarsson
J2SE 5.0 reached its End of Service Life (EOSL) on November 3, 2009, which
is the date of the final publicly available update of version 5.0 (J2SE 5.0
Update 22).

See:
http://www.oracle.com/technetwork/java/javase/downloads/index-jdk5-jsp-142662.html

We have decided to not support a JDK that is no longer supported by the JDK
vendor.

Compiling our code with the class file version set to 1.6 is our way to
*strongly* urge you to move to JDK 1.6, which in every way is a better JDK.

If you for some reason still need to use JDK 1.5, you could build your own,
unsupported, Neo4j version.
It should be possible to compile Neo4j using JDK 1.6 but setting the target
version to 1.5. Most of the strict 1.6 dependencies are compile-time only.
There might be a few runtime dependencies on 1.5, but those are probably
limited to java.util.Deque and java.util.concurrent.TimeUnit.

Your other option is to get a payed JDK 1.5 support contract for Neo4j from
Neo Technology.

Cheers,
Tobias

On Thu, Mar 10, 2011 at 8:54 AM, Samuel Feng  wrote:

> David,
>
> I am using jdk1.5.
>
> After upgraded to 1.3M03, I Encountered* *
> *java.lang.UnsupportedClassVersionError: Bad version number in .class file*
> Error.
>
> Seems the jars in neo4j's lib folder are complied using jdk6.
>
> Can I use 1.5 to compiled the sources directly?
>
>
> 2011/3/10 Samuel Feng 
>
> > Thanks David.
> >
> > My concern is if the neo4j data in 1.2 can be used in 1.3 directly?
> >
> > I have used custom analyzer in my index.
> >
> > 2011/3/10 David Montag 
> >
> > Samuel,
> >>
> >> Can you try it with 1.3.M03, if possible?
> >>
> >> Thanks,
> >> David
> >>
> >> On Wed, Mar 9, 2011 at 6:13 PM, Samuel Feng  wrote:
> >>
> >>> Dear list,
> >>>
> >>> I am developing a tomcat application in eclipse which has about 100,000
> >>> nodes using EmbeddedGraphDatabase (Neo4j version 1.2M05)
> >>>
> >>> Sometimes I took me a long time(more than half an hour) to
> >>> doInternalRecovery, maybe because I shutdown the tomcat server
> directly.
> >>>
> >>> From the messages.log, I can find many many "Injected two phase
> commit",
> >>> *Can
> >>> u tell me what cause this and how to prevent it?*
> >>>
> >>> Thu Mar 10 09:47:47 CST 2011: Opened
> >>> [C:\home\heartwater\graph\\nioneo_logical.log.1] clean empty log,
> >>> version=1
> >>> Thu Mar 10 09:47:47 CST 2011: Opened
> >>> [C:\home\heartwater\graph\/lucene/lucene.log.1] clean empty log,
> >>> version=0
> >>> Thu Mar 10 09:47:47 CST 2011: Opened
> >>> [C:\home\heartwater\graph\/lucene-fulltext/lucene.log.1] clean empty
> log,
> >>> version=0
> >>> Thu Mar 10 09:47:47 CST 2011: Non clean shutdown detected on log
> >>> [C:\home\heartwater\graph\index/lucene.log.1]. Recovery started ...
> >>> Thu Mar 10 09:47:47 CST 2011:
> >>> [C:\home\heartwater\graph\index/lucene.log.1]
> >>> logVersion=0 with committed tx=1
> >>> Thu Mar 10 09:47:48 CST 2011: Injected two phase commit, txId=2
> >>> Thu Mar 10 09:47:48 CST 2011: Injected two phase commit, txId=3
> >>> Thu Mar 10 09:47:48 CST 2011: Injected two phase commit, txId=4
> >>> Thu Mar 10 09:47:49 CST 2011: Injected two phase commit, txId=5
> >>> Thu Mar 10 09:47:49 CST 2011: Injected two phase commit, txId=6
> >>> Thu Mar 10 09:47:49 CST 2011: Injected two phase commit, txId=7
> >>> Thu Mar 10 09:47:49 CST 2011: Injected two phase commit, txId=8
> >>> Thu Mar 10 09:47:49 CST 2011: Injected two phase commit, txId=9
> >>> Thu Mar 10 09:47:49 CST 2011: Injected two phase commit, txId=10
> >>> Thu Mar 10 09:47:49 CST 2011: Injected two phase commit, txId=11
> >>> Thu Mar 10 09:47:49 CST 2011: Injected two phase commit, txId=12
> >>> Thu Mar 10 09:47:50 CST 2011: Injected two phase commit, txId=13
> >>> Thu Mar 10 09:47:50 CST 2011: Injected two phase commit, txId=14
> >>> ___
> >>> Neo4j mailing list
> >>> User@lists.neo4j.org
> >>> https://lists.neo4j.org/mailman/listinfo/user
> >>>
> >>
> >>
> >>
> >> --
> >> David Montag
> >> Neo Technology, www.neotechnology.com
> >> Cell: 650.556.4411
> >> david.mon...@neotechnology.com
> >>
> >
> >
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] How to copy a complete database?

2011-03-07 Thread Tobias Ivarsson
That class is in Neo4j kernel. It is the actual implementation class.
You can find the source code here:
https://github.com/neo4j/graphdb/blob/master/kernel/src/main/java/org/neo4j/kernel/impl/nioneo/store/ShortString.java

All of the classes in the org.neo4j.kernel.impl.nioneo.store package of my
neo4j-admin-store project are of that kind, facade classes that provide
access to internals of the neo4j kernel implementation.

Cheers,
Tobias

On Mon, Mar 7, 2011 at 1:00 PM, Balazs E. Pataki wrote:

> Hi Tobias,
>
> I tried to use ShortStringEncoding.java, however it seems to refer to a
> class called ShortString, which is not available in github:
>
>
> https://github.com/thobe/neo4j-admin-store/tree/master/src/main/java/org/neo4j/kernel/impl/nioneo/store
>
> Could you also please provide it?
>
> Thanks,
> ---
> balazs
>
> On 3/4/11 5:05 PM, Tobias Ivarsson wrote:
> > Hi Balazs,
> >
> > I have created such a thing, the tool is available here:
> >
> https://github.com/downloads/thobe/neo4j-admin-store/propstat-1.3.M03.jar
> > Run it as: java -jar propstat-1.3.M03.jar
> >
> > This tool will gather statistics about all of your properties, and output
> > how many you have of each kind.
> > For short string properties it will output how many you have in each
> > encoding.
> > For regular string properties it will output how many could have been
> stored
> > as short strings, and with which encoding that would be.
> >
> > That jar file contains a class that can be used for testing if a given
> > string is "short" or not, and how it would be stored if it was considered
> > short:
> >
> https://github.com/thobe/neo4j-admin-store/blob/master/src/main/java/org/neo4j/kernel/impl/nioneo/store/ShortStringEncoding.java
> > The method you are interested in is (the first one) getEncoding(String),
> it
> > returns one of the Enum constants in that class, or null if the provided
> > string would not be considered "short".
> >
> > While I wrote this I realized that it would be really simple to write a
> tool
> > that converts all strings that are short enough to be stored as short
> > strings, that tool is available here:
> >
> https://github.com/downloads/thobe/neo4j-admin-store/makeshort-1.3.M03.jar
> > Run it as: java -jar makeshort-1.3.M03.jar
> >
> > This tool will modify your string properties to store them as short
> strings
> > when possible. It will then rebuild the id generator for the
> > DynamicStringStore so that the "holes" created where the strings were
> > previously stored will be reused the next time you write string
> properties
> > to Neo4j (unless they are also short of course).
> >
> > Please note that both of these tools come with no official support or
> > guarantees. Use at your own risk.
> >
> > Cheers,
> > Tobias
> >
> > On Fri, Mar 4, 2011 at 10:19 AM, Balazs E. Pataki >wrote:
> >
> >> Actually both options would be very useful, but the first option (string
> >> as input and tell me if it is short or not) would be enough for me for
> >> now if available.
> >>
> >> Thanks,
> >> ---
> >> balazs
> >>
> >> On 3/3/11 6:37 PM, Tobias Ivarsson wrote:
> >>> Yes, the statistics tool almost does that, but with a wider range of
> >>> possible encodings.
> >>>
> >>> What would you want from a class like that? Give it a string as input
> and
> >>> have it tell you if it is short or not? Or go through an existing store
> >> and
> >>> tell you how many of the strings are short?
> >>>
> >>> -tobias
> >>>
> >>> On Thu, Mar 3, 2011 at 5:18 PM, Balazs E. Pataki >>> wrote:
> >>>
> >>>> Hi Tobias,
> >>>>
> >>>> Do you happen to have some little class which can at tell us which
> >>>> property values neo4j would consider short and which of your 6
> encoding
> >>>> would it use? Maybe the string statistics collecting program you
> created
> >>>> earlier has this logic - but I'm just guessing.
> >>>>
> >>>> Thanks,
> >>>> ---
> >>>> balazs
> >>>>
> >>>> On 3/3/11 11:52 AM, Tobias Ivarsson wrote:
> >>>>> No there is no simpler way, yet. We've been thinking about creating a
> >>>> "short
> >>>>> string compression tool" for accomplishing this, but haven't done so
> >> 

Re: [Neo4j] How to copy a complete database?

2011-03-04 Thread Tobias Ivarsson
Hi Balazs,

I have created such a thing, the tool is available here:
https://github.com/downloads/thobe/neo4j-admin-store/propstat-1.3.M03.jar
Run it as: java -jar propstat-1.3.M03.jar 

This tool will gather statistics about all of your properties, and output
how many you have of each kind.
For short string properties it will output how many you have in each
encoding.
For regular string properties it will output how many could have been stored
as short strings, and with which encoding that would be.

That jar file contains a class that can be used for testing if a given
string is "short" or not, and how it would be stored if it was considered
short:
https://github.com/thobe/neo4j-admin-store/blob/master/src/main/java/org/neo4j/kernel/impl/nioneo/store/ShortStringEncoding.java
The method you are interested in is (the first one) getEncoding(String), it
returns one of the Enum constants in that class, or null if the provided
string would not be considered "short".

While I wrote this I realized that it would be really simple to write a tool
that converts all strings that are short enough to be stored as short
strings, that tool is available here:
https://github.com/downloads/thobe/neo4j-admin-store/makeshort-1.3.M03.jar
Run it as: java -jar makeshort-1.3.M03.jar 

This tool will modify your string properties to store them as short strings
when possible. It will then rebuild the id generator for the
DynamicStringStore so that the "holes" created where the strings were
previously stored will be reused the next time you write string properties
to Neo4j (unless they are also short of course).

Please note that both of these tools come with no official support or
guarantees. Use at your own risk.

Cheers,
Tobias

On Fri, Mar 4, 2011 at 10:19 AM, Balazs E. Pataki wrote:

> Actually both options would be very useful, but the first option (string
> as input and tell me if it is short or not) would be enough for me for
> now if available.
>
> Thanks,
> ---
> balazs
>
> On 3/3/11 6:37 PM, Tobias Ivarsson wrote:
> > Yes, the statistics tool almost does that, but with a wider range of
> > possible encodings.
> >
> > What would you want from a class like that? Give it a string as input and
> > have it tell you if it is short or not? Or go through an existing store
> and
> > tell you how many of the strings are short?
> >
> > -tobias
> >
> > On Thu, Mar 3, 2011 at 5:18 PM, Balazs E. Pataki >wrote:
> >
> >> Hi Tobias,
> >>
> >> Do you happen to have some little class which can at tell us which
> >> property values neo4j would consider short and which of your 6 encoding
> >> would it use? Maybe the string statistics collecting program you created
> >> earlier has this logic - but I'm just guessing.
> >>
> >> Thanks,
> >> ---
> >> balazs
> >>
> >> On 3/3/11 11:52 AM, Tobias Ivarsson wrote:
> >>> No there is no simpler way, yet. We've been thinking about creating a
> >> "short
> >>> string compression tool" for accomplishing this, but haven't done so
> yet.
> >>>
> >>> Cheers,
> >>> Tobias
> >>>
> >>> On Thu, Mar 3, 2011 at 11:35 AM, Balazs E. Pataki >>> wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> I have a big database based on Neo4J 1.2. Now, if I would like to use
> >>>> the "short strings" feature of Neo4j 1.3 M03 I should regenerate my
> full
> >>>> database, that is all strings should be reset so that it may or may
> not
> >>>> be stored according to the new "short strings" policy.
> >>>>
> >>>> It seems to me that the easiest way to do this would be to somehow be
> >>>> able to copy the full 1.2 database to a newly created 1.3 M03 database
> >>>> by traversing the 1.2 database. But there maybe a simpler (neo4j
> >>>> builtin) way to do this. Any hints about this?
> >>>>
> >>>> Thanks,
> >>>> ---
> >>>> balazs
> >>>> ___
> >>>> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] How to copy a complete database?

2011-03-03 Thread Tobias Ivarsson
Yes, the statistics tool almost does that, but with a wider range of
possible encodings.

What would you want from a class like that? Give it a string as input and
have it tell you if it is short or not? Or go through an existing store and
tell you how many of the strings are short?

-tobias

On Thu, Mar 3, 2011 at 5:18 PM, Balazs E. Pataki wrote:

> Hi Tobias,
>
> Do you happen to have some little class which can at tell us which
> property values neo4j would consider short and which of your 6 encoding
> would it use? Maybe the string statistics collecting program you created
> earlier has this logic - but I'm just guessing.
>
> Thanks,
> ---
> balazs
>
> On 3/3/11 11:52 AM, Tobias Ivarsson wrote:
> > No there is no simpler way, yet. We've been thinking about creating a
> "short
> > string compression tool" for accomplishing this, but haven't done so yet.
> >
> > Cheers,
> > Tobias
> >
> > On Thu, Mar 3, 2011 at 11:35 AM, Balazs E. Pataki >wrote:
> >
> >> Hi,
> >>
> >> I have a big database based on Neo4J 1.2. Now, if I would like to use
> >> the "short strings" feature of Neo4j 1.3 M03 I should regenerate my full
> >> database, that is all strings should be reset so that it may or may not
> >> be stored according to the new "short strings" policy.
> >>
> >> It seems to me that the easiest way to do this would be to somehow be
> >> able to copy the full 1.2 database to a newly created 1.3 M03 database
> >> by traversing the 1.2 database. But there maybe a simpler (neo4j
> >> builtin) way to do this. Any hints about this?
> >>
> >> Thanks,
> >> ---
> >> balazs
> >> _______
> >> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] How to copy a complete database?

2011-03-03 Thread Tobias Ivarsson
No there is no simpler way, yet. We've been thinking about creating a "short
string compression tool" for accomplishing this, but haven't done so yet.

Cheers,
Tobias

On Thu, Mar 3, 2011 at 11:35 AM, Balazs E. Pataki wrote:

> Hi,
>
> I have a big database based on Neo4J 1.2. Now, if I would like to use
> the "short strings" feature of Neo4j 1.3 M03 I should regenerate my full
> database, that is all strings should be reset so that it may or may not
> be stored according to the new "short strings" policy.
>
> It seems to me that the easiest way to do this would be to somehow be
> able to copy the full 1.2 database to a newly created 1.3 M03 database
> by traversing the 1.2 database. But there maybe a simpler (neo4j
> builtin) way to do this. Any hints about this?
>
> Thanks,
> ---
> balazs
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Slow down on insertion as db grow

2011-03-03 Thread Tobias Ivarsson
Hi Massimo,

I'm terribly sorry, I've had a lot of things on my plate, and this sadly
fell off. Thanks for the reminder!

Could you please try lowering the heap size (to somewhere between 512M-1G
with your available RAM). The Neo4j memory mapping is managed outside of the
Java heap. What you want to achieve for ideal performance is to get the
entire nodestore and relationshipstore to fit in the memory mapped file
cache. You might have to tweak the memory mapping settings to make sure that
they are configured to prefer the nodestore and relationship, and have them
fully memory mapped. See documentation here:
http://docs.neo4j.org/chunked/snapshot/configuration-caches.html#_configuration

I didn't see any information on which operating system you are using, so I
assumed linux or some other unix. If you are running on Windows the memory
mapping IS managed in the Java heap, then you should keep your heap settings
at the same size (1.5G) and instead just focus on configuring the memory
mapping so that the nodestore and relationship store are fully memory
mapped.

Cheers,
Tobias

On Thu, Mar 3, 2011 at 11:18 AM, Massimo Lusetti  wrote:

> On Fri, Feb 18, 2011 at 2:31 PM, Tobias Ivarsson
>  wrote:
>
> > WRT the slowdown you've seen, I'll have to investigate that further.
>
> Didn't mean to bother anyone but do you have any news regarding the
> slowdown I'm still experiencing... !?
>
> Cheers
> --
> Massimo
> http://meridio.blogspot.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] ServerPlugin example GetAll failed to load

2011-02-27 Thread Tobias Ivarsson
Looks like we should augment that exception to include some information
about what the name was that it didn't except :)

-tobias

On Sun, Feb 27, 2011 at 6:49 PM, Andreas Kollegger <
andreas.kolleg...@neotechnology.com> wrote:

> Hi again,
>
> So, it looks like the verifyName() complaint is about the name containing
> characters that aren't URL encoded.
>
> And, sorry, you asked for the source to ServerPlugin.java. That's here:
>
> https://github.com/neo4j/server/blob/master/server-api/src/main/java/org/neo4j/server/plugins/ServerPlugin.java
>
> Cheers,
> Andreas
>
> On Feb 27, 2011, at 4:27 PM, Brendan Cheng wrote:
>
> > Hi,
> >
> > I tried to load the GetAll example into ServerPlugin directory of
> > 1.3.M03 but found:
> >
> > 22:58:28 | 850 [WrapperSimpleAppMain] WARN
> > org.neo4j.server.plugins.PluginManager  - Failed to load plugin:
> > ServerPlugin[GetAll]
> > INFO   | jvm 1| 2011/02/27 22:58:28 |
> > java.lang.IllegalArgumentException: Name contains illegal characters
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.plugins.ServerPlugin.verifyName(ServerPlugin.java:120)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.plugins.PluginPoint.(PluginPoint.java:36)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.plugins.PluginMethod.(PluginMethod.java:40)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> >
> org.neo4j.server.plugins.PluginPointFactoryImpl.createFrom(PluginPointFactoryImpl.java:98)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> >
> org.neo4j.server.plugins.ServerPlugin.getDefaultExtensionPoints(ServerPlugin.java:175)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> >
> org.neo4j.server.plugins.ServerPlugin.loadServerExtender(ServerPlugin.java:152)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.plugins.PluginManager.(PluginManager.java:57)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.plugins.PluginManager.(PluginManager.java:45)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.modules.RESTApiModule.loadPlugins(RESTApiModule.java:75)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.modules.RESTApiModule.start(RESTApiModule.java:50)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> >
> org.neo4j.server.NeoServerWithEmbeddedWebServer.startModules(NeoServerWithEmbeddedWebServer.java:114)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> >
> org.neo4j.server.NeoServerWithEmbeddedWebServer.start(NeoServerWithEmbeddedWebServer.java:83)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.BootStrapper.start(BootStrapper.java:62)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > org.neo4j.server.BootStrapper.main(BootStrapper.java:115)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > java.lang.reflect.Method.invoke(Method.java:597)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> >
> org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:272)
> > INFO   | jvm 1| 2011/02/27 22:58:28 | at
> > java.lang.Thread.run(Thread.java:662)
> >
> > I have changed a character from your example.
> > Any idea?
> > where can I locate your ServerPlugin.java file?
> > Cheers,
> >
> > Brendan
> > ___
> > 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] MMap Error on importing large data

2011-02-27 Thread Tobias Ivarsson
his at my machine.
> > >>
> > >
> > > I've just pushed the code to github. The test class is the
> TestOSMImport.
> > > Currently it skips a test if the test data is missing, and there is
> only
> > > data for two specific test cases in the code base (Billesholm and
> Malmö).
> > To
> > > get it to run the big tests, simply download denmark.osm and/or
> > croatia.osm
> > > from downloads.cloudmade.com. At the moment croatia.osm imports fine,
> at
> > > reasonable performance, but denmark.osm is the one giving the problems.
> > >
> > > Looks like the memory mapped buffer configuration needs to be tweaked.
> > >>
> > >
> > > From Johans previous answer, combined with something I read on the
> wiki,
> > it
> > > seems that the batch inserter needs different mmap settings than the
> > normal
> > > API. I read that the batch inserter uses the heap for its mmap, while
> the
> > > normal API does not. If I understand correctly, this means that when
> > using
> > > the batch inserter, we have to use smaller mmap, otherwise we might
> fill
> > the
> > > heap too soon?
> > >
> > > In any case, it seems like keeping mmap settings relatively small
> should
> > > avoid this problem, although might not lead to best performance? Have I
> > > understood correctly?
> > >
> > > On Windows heap buffers are used by default and auto configuration
> > >> will look how much heap is available. Getting out of memory exceptions
> > >> is an indication that the configuration passed in is using more memory
> > >> than available heap.
> > >>
> > >
> > > I am currently using -Xmx2048 on a 4GB ram machine, 32bit java, and the
> > > settings:
> > >
> > >static {
> > >NORMAL_CONFIG.put( "neostore.nodestore.db.mapped_memory", "50M"
> );
> > >NORMAL_CONFIG.put(
> > > "neostore.relationshipstore.db.mapped_memory", "150M" );
> > >NORMAL_CONFIG.put( "neostore.propertystore.db.mapped_memory",
> > "200M" );
> > >NORMAL_CONFIG.put(
> > > "neostore.propertystore.db.strings.mapped_memory", "300M" );
> > >NORMAL_CONFIG.put(
> > > "neostore.propertystore.db.arrays.mapped_memory", "10M" );
> > >NORMAL_CONFIG.put( "dump_configuration", "false" );
> > >}
> > >
> > >
> > > These settings do not seem to be too high, but if the normal graph
> > database
> > > service will allocate memory outside the heap, and the heap has already
> > been
> > > filled by the batch inserter, perhaps that is where the problem lies?
> > > Perhaps we do need a way of freeing memory more aggressively after the
> > batch
> > > insertion phase? Get the heap down before allowing the normal API
> access
> > to
> > > the memory?
> > >
> > > Regards, Craig
> > > ___
> > > 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] String statistics after 1.3.M03

2011-02-27 Thread Tobias Ivarsson
The tool is theoretically safe, and has never caused any problems during
testing.
It does however come with NO GUARANTEES, and running it is on your own risk.

I'm not sure the input from those statistics would influence anything at
this point, but since I haven't looked at any of these statistics of the
string store WITH short strings in place it would at least be fun to look
at. The information to be found in that data is: how many strings
are reasonably short (could have been covered by one of the originally
proposed short string encodings), but were not covered by the actual
implementation.

However, when implementing this optimization I found an embarrassing bug in
my statistics code. Nothing that will harm your data, but rather make the
statistics slightly misleading. Some sort of bonus points to anyone who
finds it. I should perhaps fix that bug if the tool is to be used further.
But on the other hand, not fixing it means that the statistics would show me
how much the implementation misses because of my mistake in coding up the
statistics tool, and I would actually find that interesting.

I don't think I'll have time to investigate any statistics in quite a while.
So if you do decide to run the tool and send data to me, I might not respond
for a few weeks.

Cheers,
Tobias

On Sun, Feb 27, 2011 at 6:44 PM, Massimo Lusetti  wrote:

> Hi neo4j developers,
>  I'm repopulating a neo4j db with fresh data made after M03 release,
> so I guess If I could run Tobias statistics tool to gather some
> info... are these interesting to you and safe for data?
>
> Cheers
> --
> Massimo
> http://meridio.blogspot.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Two new milestones: Neo4j 1.3.M03 and Spring Data Graph 1.0.0.M3 Released

2011-02-26 Thread Tobias Ivarsson
On Sat, Feb 26, 2011 at 2:05 PM, rick.bullo...@burningskysoftware.com <
rick.bullo...@burningskysoftware.com> wrote:

> Also, I assume the new string storage system works with existing neo
> databases?
>

Yes, as I have explained in my emails to this list before, and in my blog
post describing this feature (linked from the release announcement), this
feature is fully backwards compatible.

-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


[Neo4j] Two new milestones: Neo4j 1.3.M03 and Spring Data Graph 1.0.0.M3 Released

2011-02-25 Thread Tobias Ivarsson
Friends!

Today the Neo4j team released milestone 3 of Neo4j 1.3.

This release features some interesting kernel improvements, such as a better
storage of short strings.
It also improves the Neo4j graph database server. For example by making it
easier to write server plugins.

For more details, please see the release blog post:
http://blog.neo4j.org/2011/02/neo4j-13-m03-with-short-strings.html

As if that was not enough, we then took that fresh new release and included
it in Spring Data Graph. The component for integrating Neo4j with Spring
that we are building together with VMWare/SpringSource. Spring Data Graph
version 1.0.0 was then also released in it's third milestone! This release
contains soo many nice things that the best way to tell you about it is by
including the original release note (forwarded below).

For downloading Neo4j 1.3, milestone 3, please go to:
http://neo4j.org/download
For downloading Spring Data Graph, please see the official release
announcement: http://www.springsource.org/node/3040

I would like to thank everyone who were involved in making this release
possible, especially all of you who helped me with gathering statistics for
better short string support.

Please try out the new features in these releases, and continue to give us
feedback. We really appreciate the mutual support in this community.

Cheers,
Tobias

-- Forwarded message --
From: Thomas Risberg
Date: Sat, Feb 26, 2011 at 12:03 AM
Subject: Spring Data Graph - Neo4j Support 1.0.0.M3 Released


Hi everyone,

We are pleased to announce that a new milestone release (1.0.0.M3) of the
Spring Data Graph 1.0
project with Neo4j support is now available. The new M3 release provides:

* update to Neo4j-1.3.M03, AspectJ 1.6.11.M2
* added explicit support for detachable entities
* added bean validation support for property changes
* added external transaction manager support (XA and one phase commit best
effort)
* added xml namespace configuration
* simplified Spring Java Config configuration class
* added automatic numerical indexing and range queries
* added full featured Neo4jTemplate
* all methods introduced to entities are now generified

and updated reference documentation.

See the official announcement at http://www.springsource.org/node/3040

Feedback welcome!
--
Thomas

-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Neovigator Weekend Project

2011-02-20 Thread Tobias Ivarsson
Nice stuff!

On Mon, Feb 21, 2011 at 6:18 AM, Max De Marzi Jr. wrote:

> Guys,
>
> So I ran into the Ask Ken project ( http://askken.heroku.com/ ) by
> Michael Aufreiter yesterdat, and though it was pretty awesome... so I
> ported it to using Neo4j.
>
> Check it out: http://neovigator.heroku.com/
>
> On github at https://github.com/maxdemarzi/neovigator
>
> Regards,
> Max
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Traversal Framework question

2011-02-20 Thread Tobias Ivarsson
Marko, I don't understand what you are trying to say.

Is the question about finding, given a person node, the co-creators for that
person on any project? Or is it about reasoning in the abstract co-creator
graph. I was under the impression that finding co-creators was the only
thing we were interested in, in that case path-uniqueness will do the trick.

What node-path-uniqueness guarantees is that within each path the same node
occurs at most once. In a path from a creator to her co-creator that would
mean that the creator cannot be her own co-creator. If the starting person
has created both x and y, the path through x and the path through y will be
different paths, which means that the path uniqueness will allow the same
persons to be co-creator on both projects.

Path uniqueness would get you into problem if person A created person B and
person B (who was created) was also a creator of herself, then person B
would not be discovered as a co-creator. I cannot imagine a case where that
would be sensible. It is also impossible to store in Neo4j, since
self-relationships are not allowed.

You can do something like .filter("from two steps ago") by looking two steps
back in the path of what you've traversed so far in the evaluator.

I fear that if we continue further on the path where this discussion is
currently headed, it will become too theoretical to be of use to anyone.
Let's keep such discussions isolated.

Cheers,
Tobias

On Sun, Feb 20, 2011 at 7:14 PM, Marko Rodriguez wrote:

> Hi,
>
> Just to be picky:
>
> >> The easiest way to do that in this case is by adding:
> >> .uniqueness(Uniqueness.NODE_PATH)
>
> A co-creator's co-creator can be you. Thus, marko's co-creator's co-creator
> is marko (amongst other people). In this case, unique on a path would not
> fail, no? Can you do something like .filter("from two steps ago")?
>
> Thanks,
> Marko.
>
>
>
>
> _______
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Traversal Framework question

2011-02-20 Thread Tobias Ivarsson
On Sun, Feb 20, 2011 at 7:04 PM, Marko Rodriguez wrote:

> Hi,
>
> > Traversal.description()
> > .depthFirst()
> > .relationships(RelationshipTypes.CREATED, Direction.BOTH)
> > .traverse(developer).nodes()
>
> To be clear, a co-creator is someone is who has created the same things as
> you and who is not you. Thus, you need to go outgoing CREATED, then incoming
> CREATED, then you need to make sure that the vertex you land at is not the
> one you left from -- thus, you need to filter the originating vertex.
>

The easiest way to do that in this case is by adding:

.uniqueness(Uniqueness.NODE_PATH)

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Online backup works in full but not incremental

2011-02-20 Thread Tobias Ivarsson
On Sun, Feb 20, 2011 at 6:11 PM, Brendan  wrote:

> Hi,
>
> After I install the neo4j on ubuntu server I'm able to backup the full
> database, even repeatedly but it crashed on incremental.
>

Could you please provide a stacktrace, and other kinds of error output from
this crash.

Thank you,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Better support for large property data

2011-02-20 Thread Tobias Ivarsson
ne for LargeStoreString and yet
another for SmallStoreString, to preserve backwards compatibility without
the need for a migration tool. Writing new strings would the of course only
write LargeStore string and ShortStore string, but when reading all three
types would be possible. The drawback of this would be that memory mapping
would be spread over four files instead of only two.

Keep the comments coming.

Cheers,
Tobias

 -Original Message-
> From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org]
> On
> Behalf Of Tobias Ivarsson
> Sent: Friday, February 18, 2011 9:20 AM
> To: Neo user discussions
> Subject: [Neo4j] Better support for large property data
>
> Having tackled short strings, I feel up for taking a stab at long strings,
> and large binary data objects.
>
> I know that Rick Bullotta is really interested in this, and I can imagine
> others wanting to store large properties as well. I would love to get your
> input on the ideas I have, as well as hearing about the ideas you might
> have.
>
> The way I see it there are two different kinds of large data objects.
>
> The first one is long strings, or text. Imagine building a blog engine on
> Neo4j, the text body of a blog post is likely going to be around a thousand
> characters. That is a lot of blocks in the DynamicStringStore. But you
> still
> want to support shorter strings (the title of the post for example),
> without
> much overhead, so you don't want to increase the block size for the
> DynamicStringStore. In your code you want to deal with these values as
> String objects though, you don't want a different object type just because
> the string happens to be longer.
>
> The second one is large binary data objects. Data objects that are too
> large
> to want to have allocated as a String object, or even as a byte[] object.
> You want to manipulate them through some sort of streaming interface. These
> data objects are also so large that you would prefer if their content
> wasn't
> written to the transaction logs, because that would mean that Neo4j needed
> to rotate the log extremely frequently, and since you keep the logical logs
> for HA and backup, it would fill up your disks twice as quickly as it
> needed. Properties like this would, for example, be used for storing images
> that are included in the blog posts.
>
>
> For long Strings (the first point), the solution I'm thinking of is to
> replace the stringstore and arraystore with a smallstore and a largestore.
> Both being dynamic block stores as they are today, but with different block
> sizes. Then store both arrays and strings in both of these stores. The type
> of the data stored in the block is stored in the property record for the
> property that references the blocks anyhow, so there isn't a great
> advantage
> of having different block stores for strings and arrays.
>
> For BLOBs (the second point), we need additions to the API, since you want
> to work with these things in a streaming fashion.
> I am thinking that we use java.nio.channels.ReadableByteChannel for these
> properties. Why ReadableByteChannel you ask? Why not InputStream?
> First reason: InputStream can be converted to ReadableByteChannel, and vice
> versa:
>
> http://download.oracle.com/javase/6/docs/api/index.html?java/nio/channels/Ch
> annels.html<http://download.oracle.com/javase/6/docs/api/index.html?java/nio/channels/Channels.html>
> Second reason: ReadableByteChannel is a really simple interface (only three
> methods) if you want to write your own custom implementation.
>
> Setting a BLOB property would then look like this:
>
> ReadableByteChannel myBlob = ...
> node.setProperty("a_blob", myBlob);
>
> Getting would look like this:
>
> ReadableByteChannel myBlob =
> (ReadableByteChannel)node.getProperty("a_blob");
>
>
> Perhaps we could then, also come up with some nice API for appending to a
> BLOB property:
>
> ReadableByteChannel moreData = ...
> ReadableByteChannel myBlob =
> (ReadableByteChannel)node.getProperty("a_blob");
> node.setProperty( "a_blob", BlobUtils.append(myBlob, moreData) );
>
>
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Traversal Framework question

2011-02-20 Thread Tobias Ivarsson
On Sun, Feb 20, 2011 at 10:48 AM, Alfredas Chmieliauskas <
al.fre...@gmail.com> wrote:

> Dear all,
>
> could somebody point me to more documentation on the new traversal
> framework (besides http://wiki.neo4j.org/content/Traversal_Framework)?
> Also the new Evaluator and how to use it?
>

That page, along with the examples pages is the best there is:
* http://components.neo4j.org/neo4j-examples/snapshot/traversal.html
* http://wiki.neo4j.org/content/Traversal_HowTo


>
> If we have a graph described in the pipes Co-Developers example
> (https://github.com/tinkerpop/pipes/wiki/Using-Pipes-to-Traverse-Graphs).
> Would this traversal return the co-developers?
>
> Traversal.description()
> .depthFirst()
> .relationships(RelationshipTypes.CREATED, Direction.OUTGOING)
> .relationships(RelationshipTypes.CREATED, Direction.INCOMING)
> .traverse(developer).nodes()
>

No, unfortunately it wouldn't. Relationship type specifications in
TraversalDescriptions are not ordered, what you have written is just a
different spelling of:

Traversal.description()
.depthFirst()
.relationships(RelationshipTypes.CREATED, Direction.BOTH)
.traverse(developer).nodes()

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


[Neo4j] Better support for large property data

2011-02-18 Thread Tobias Ivarsson
Having tackled short strings, I feel up for taking a stab at long strings,
and large binary data objects.

I know that Rick Bullotta is really interested in this, and I can imagine
others wanting to store large properties as well. I would love to get your
input on the ideas I have, as well as hearing about the ideas you might
have.

The way I see it there are two different kinds of large data objects.

The first one is long strings, or text. Imagine building a blog engine on
Neo4j, the text body of a blog post is likely going to be around a thousand
characters. That is a lot of blocks in the DynamicStringStore. But you still
want to support shorter strings (the title of the post for example), without
much overhead, so you don't want to increase the block size for the
DynamicStringStore. In your code you want to deal with these values as
String objects though, you don't want a different object type just because
the string happens to be longer.

The second one is large binary data objects. Data objects that are too large
to want to have allocated as a String object, or even as a byte[] object.
You want to manipulate them through some sort of streaming interface. These
data objects are also so large that you would prefer if their content wasn't
written to the transaction logs, because that would mean that Neo4j needed
to rotate the log extremely frequently, and since you keep the logical logs
for HA and backup, it would fill up your disks twice as quickly as it
needed. Properties like this would, for example, be used for storing images
that are included in the blog posts.


For long Strings (the first point), the solution I'm thinking of is to
replace the stringstore and arraystore with a smallstore and a largestore.
Both being dynamic block stores as they are today, but with different block
sizes. Then store both arrays and strings in both of these stores. The type
of the data stored in the block is stored in the property record for the
property that references the blocks anyhow, so there isn't a great advantage
of having different block stores for strings and arrays.

For BLOBs (the second point), we need additions to the API, since you want
to work with these things in a streaming fashion.
I am thinking that we use java.nio.channels.ReadableByteChannel for these
properties. Why ReadableByteChannel you ask? Why not InputStream?
First reason: InputStream can be converted to ReadableByteChannel, and vice
versa:
http://download.oracle.com/javase/6/docs/api/index.html?java/nio/channels/Channels.html
Second reason: ReadableByteChannel is a really simple interface (only three
methods) if you want to write your own custom implementation.

Setting a BLOB property would then look like this:

ReadableByteChannel myBlob = ...
node.setProperty("a_blob", myBlob);

Getting would look like this:

ReadableByteChannel myBlob =
(ReadableByteChannel)node.getProperty("a_blob");


Perhaps we could then, also come up with some nice API for appending to a
BLOB property:

ReadableByteChannel moreData = ...
ReadableByteChannel myBlob =
(ReadableByteChannel)node.getProperty("a_blob");
node.setProperty( "a_blob", BlobUtils.append(myBlob, moreData) );


Comment please.
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Help us make Neo4j better at handling YOUR data

2011-02-18 Thread Tobias Ivarsson
Yes, I'm thinking of making that my lab project for this weekend.

I'm starting a separate thread for discussing that, title: "Better support
for large property data". I'd love your input Rick.

-tobias

On Fri, Feb 18, 2011 at 2:43 PM, Rick Bullotta <
rick.bullo...@burningskysoftware.com> wrote:

> Awesome!  Now wanna tackle the other end of the spectrum, really big
> strings
> and byte arrays? ;-)
>
>
>
> -Original Message-
> From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org]
> On
> Behalf Of Tobias Ivarsson
> Sent: Friday, February 18, 2011 8:29 AM
> To: Neo user discussions
> Subject: Re: [Neo4j] Help us make Neo4j better at handling YOUR data
>
> Thank you everyone who submitted statistics, both in this thread and to me
> directly!
>
> As of last night, this feature is committed in Neo4j trunk, and should make
> it into the next milestone release, at which point the sum of you guys
> string stores should be possible to store in 65% less space.
>
> I've written up a blog post about how the implementation works:
> http://journal.thobe.org/2011/02/better-support-for-short-strings-in.html
>
> Thank you so much for all your help!
> --
> Tobias Ivarsson 
> Hacker, Neo Technology
> www.neotechnology.com
> Cellphone: +46 706 534857
> ___
> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Slow down on insertion as db grow

2011-02-18 Thread Tobias Ivarsson
On Thu, Feb 17, 2011 at 3:32 PM, Massimo Lusetti  wrote:

> I'm trying to populate the DB with Nodes with only one String
> property, an IPv4 address. This is just a test case for my typical use
> case and it shows that when the process starts the first 440744 nodes
> are going in at a speed of 1.05ms each Node but this speed drops to
> 8.75ms after having inserted 12545155 nodes.
> The final DB size is: 2.9G since i tweaked the sintrg_block_size at
> graphdb creation time to 60bytes instead of 120...
>

I recently (yesterday) committed a new feature for Neo4j that will store
these kinds of short strings, making Neo4j store them without having to
involve the DynamicStringStore at all. You should see a substantial speedup
from using that. IPv4 addresses will always be storeable as a short string,
so if all you store as properties are IPv4 addresses the DynamicStringStore
wouldn't be used at all in your use case.

I've written a bit about how it works on my blog:
http://journal.thobe.org/2011/02/better-support-for-short-strings-in.html

The feature is available in the latest snapshot build:
http://neo4j.org/get?file=neo4j-1.3-SNAPSHOT-unix.tar.gz
And will be released in the next milestone.


WRT the slowdown you've seen, I'll have to investigate that further.

Cheers,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Help us make Neo4j better at handling YOUR data

2011-02-18 Thread Tobias Ivarsson
Thank you everyone who submitted statistics, both in this thread and to me
directly!

As of last night, this feature is committed in Neo4j trunk, and should make
it into the next milestone release, at which point the sum of you guys
string stores should be possible to store in 65% less space.

I've written up a blog post about how the implementation works:
http://journal.thobe.org/2011/02/better-support-for-short-strings-in.html

Thank you so much for all your help!
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Help with exception using BatchInserter

2011-02-15 Thread Tobias Ivarsson
There should have been a cause at the end of that trace, looking something
like:

caused by: java.io.IOException ...

That is what I'm interested in.

-tobias

On Tue, Feb 15, 2011 at 10:12 AM, Pablo Pareja  wrote:

> I already put the stack trace in the first message:
>
> Unable to write record[244986398] @[32583190934]
>
> org.neo4j.kernel.impl.nioneo.store.AbstractPersistenceWindow.writeOut(AbstractPersistenceWindow.java:112)
>
> org.neo4j.kernel.impl.nioneo.store.AbstractPersistenceWindow.force(AbstractPersistenceWindow.java:124)
>
> org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.flushAll(PersistenceWindowPool.java:251)
>
> org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.close(PersistenceWindowPool.java:224)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:614)
>
> org.neo4j.kernel.impl.nioneo.store.PropertyStore.closeStorage(PropertyStore.java:101)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:611)
> org.neo4j.kernel.impl.nioneo.store.NeoStore.closeStorage(NeoStore.java:115)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:611)
>
> org.neo4j.kernel.impl.batchinsert.BatchInserterImpl.shutdown(BatchInserterImpl.java:351)
>
> the missing lines are just from my own classes ending in a
> BatchInserter.shutdown() method.
>
> Cheers,
>
> Pablo
>
> On Tue, Feb 15, 2011 at 9:06 AM, Tobias Ivarsson <
> tobias.ivars...@neotechnology.com> wrote:
>
> > I had a second look at this, and realized that those memory mapping
> > settings
> > aren't used from the batch inserter. Everything is allocated in the Java
> > Heap. 63G out of 64G RAM is still a bit much, but not as big of a problem
> > as
> > I first thought.
> >
> > This also means that there could be another problem behind the exception
> > you
> > receive. There should have been a causing exception for the one you
> listed.
> > Could you please provide a full stack trace?
> >
> > Cheers,
> > Tobias
> >
> > On Thu, Feb 10, 2011 at 10:42 PM, Pablo Pareja  wrote:
> >
> > > Hi all,
> > > I keep getting this exception and don't know what the reason could be:
> > >
> > > Unable to write record[244986398] @[32583190934]
> > >
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.AbstractPersistenceWindow.writeOut(AbstractPersistenceWindow.java:112)
> > >
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.AbstractPersistenceWindow.force(AbstractPersistenceWindow.java:124)
> > >
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.flushAll(PersistenceWindowPool.java:251)
> > >
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.close(PersistenceWindowPool.java:224)
> > >
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:614)
> > >
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.PropertyStore.closeStorage(PropertyStore.java:101)
> > >
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:611)
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.NeoStore.closeStorage(NeoStore.java:115)
> > >
> > >
> >
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:611)
> > >
> > >
> >
> org.neo4j.kernel.impl.batchinsert.BatchInserterImpl.shutdown(BatchInserterImpl.java:351)
> > >
> > > I'm using a 65G RAM machine and the java process is launched with
> -Xmx63G
> > > the conf values I pass to the batch inserter are the following:
> > >
> > > neostore.nodestore.db.mapped_memory=10G
> > > neostore.relationshipstore.db.mapped_memory=10G
> > > neostore.propertystore.db.mapped_memory=10G
> > > neostore.propertystore.db.strings.mapped_memory=10G
> > > neostore.propertystore.db.arrays.mapped_memory=0M
> > >
> > > Besides, there were still 50G free space in the disk when this
> exception
> > > was
> > > thrown
> > >
> > > I'd really appreciate any help,
> > > Cheers
> > >
> > > --
> > > Pablo Pareja Tobes
> > > LinkedInhttp://www.linkedin.com/in/pabloparejatobes
> > > Twitter   http://www.twitter.com/pablopareja
> > >
> > > http://www.ohnosequences.com
> > > _______
> > > Neo4j mailing list
> > &

Re: [Neo4j] Help with exception using BatchInserter

2011-02-15 Thread Tobias Ivarsson
I had a second look at this, and realized that those memory mapping settings
aren't used from the batch inserter. Everything is allocated in the Java
Heap. 63G out of 64G RAM is still a bit much, but not as big of a problem as
I first thought.

This also means that there could be another problem behind the exception you
receive. There should have been a causing exception for the one you listed.
Could you please provide a full stack trace?

Cheers,
Tobias

On Thu, Feb 10, 2011 at 10:42 PM, Pablo Pareja  wrote:

> Hi all,
> I keep getting this exception and don't know what the reason could be:
>
> Unable to write record[244986398] @[32583190934]
>
> org.neo4j.kernel.impl.nioneo.store.AbstractPersistenceWindow.writeOut(AbstractPersistenceWindow.java:112)
>
> org.neo4j.kernel.impl.nioneo.store.AbstractPersistenceWindow.force(AbstractPersistenceWindow.java:124)
>
> org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.flushAll(PersistenceWindowPool.java:251)
>
> org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.close(PersistenceWindowPool.java:224)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:614)
>
> org.neo4j.kernel.impl.nioneo.store.PropertyStore.closeStorage(PropertyStore.java:101)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:611)
> org.neo4j.kernel.impl.nioneo.store.NeoStore.closeStorage(NeoStore.java:115)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:611)
>
> org.neo4j.kernel.impl.batchinsert.BatchInserterImpl.shutdown(BatchInserterImpl.java:351)
>
> I'm using a 65G RAM machine and the java process is launched with -Xmx63G
> the conf values I pass to the batch inserter are the following:
>
> neostore.nodestore.db.mapped_memory=10G
> neostore.relationshipstore.db.mapped_memory=10G
> neostore.propertystore.db.mapped_memory=10G
> neostore.propertystore.db.strings.mapped_memory=10G
> neostore.propertystore.db.arrays.mapped_memory=0M
>
> Besides, there were still 50G free space in the disk when this exception
> was
> thrown
>
> I'd really appreciate any help,
> Cheers
>
> --
> Pablo Pareja Tobes
> LinkedInhttp://www.linkedin.com/in/pabloparejatobes
> Twitter   http://www.twitter.com/pablopareja
>
> http://www.ohnosequences.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Does BatchInserter auto-commit before shutting down?

2011-02-14 Thread Tobias Ivarsson
BatchInserter.shutdown() is synchronous, it has to be, otherwise it wouldn't
be safe at all.
After shutdown() has returned it guarantees that all store files have been
written, and are in a consistent state.

-t

On Mon, Feb 14, 2011 at 4:01 PM, Pablo Pareja  wrote:

> Great, thanks for the information.
> Just out of curiosity then, are calls to BatchInserter.shutdown() sync or
> asynchronous ?
> I mean, does the program flow stops in that call till every operation the
> shutdown implies has been
> performed?
> Cheers,
>
> Pablo
>
> On Mon, Feb 14, 2011 at 3:30 PM, Tobias Ivarsson <
> tobias.ivars...@neotechnology.com> wrote:
>
> > The batch inserter will write data to disk as needed. The memory mapped
> > regions are used to speed up writes, so that the API level writes can be
> > done to the memory mapped regions which can then be written in large
> > sequential chunks to disk.
> >
> > You do not have to shut down the batch inserter for this to happen, it is
> > taken care of automatically.
> >
> > Cheers,
> > Tobias
> >
> > On Mon, Feb 14, 2011 at 10:53 AM, Pablo Pareja  wrote:
> >
> > > Hi,
> > >
> > > I was wondering whether once the memory-mapping configuration for
> > > BatchInserter is full *(for example*
> > > *in the case of  neostore.relationshipstore.db.mapped_memory) *the
> class
> > > would auto-commit these changes
> > > to disk or it would just throw an exception.
> > > In the latter case, what would the options be?
> > >
> > > In my case I have to insert a huge amount of data that cannot be
> > allocated
> > > in RAM.
> > > First I thought the BatchInserter would deal with this kind of
> situation,
> > > however I keep getting exceptions whenever the
> > > program reaches the point where *(I guess) *memory mapping
> configuration
> > is
> > > not enough.
> > >
> > > Since I cannot use more RAM than what I have, I thought, ok so I will
> > > shutdown both inserter and index service and
> > > create them again each time the program have already inserted a decent
> > > amount of data.
> > > Then, don't know why but after a couple of tests, at some point the
> > program
> > > always halts throwing a really weird exception
> > > saying something about a index file that exists but cannot be accessed
> in
> > > the merge process ?!?
> > >
> > > I guess I'd be doing something wrong but cannot figure out what it is.
> > > Thanks in advance
> > >
> > > --
> > > Pablo Pareja Tobes
> > > LinkedInhttp://www.linkedin.com/in/pabloparejatobes
> > > Twitter   http://www.twitter.com/pablopareja
> > >
> > > http://www.ohnosequences.com
> > > ___
> > > Neo4j mailing list
> > > User@lists.neo4j.org
> > > https://lists.neo4j.org/mailman/listinfo/user
> > >
> >
> >
> >
> > --
> > Tobias Ivarsson 
> > Hacker, Neo Technology
> > www.neotechnology.com
> > Cellphone: +46 706 534857
> > ___
> > Neo4j mailing list
> > User@lists.neo4j.org
> > https://lists.neo4j.org/mailman/listinfo/user
> >
>
>
>
> --
> Pablo Pareja Tobes
> LinkedInhttp://www.linkedin.com/in/pabloparejatobes
> Twitter   http://www.twitter.com/pablopareja
>
> http://www.ohnosequences.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Does BatchInserter auto-commit before shutting down?

2011-02-14 Thread Tobias Ivarsson
The batch inserter will write data to disk as needed. The memory mapped
regions are used to speed up writes, so that the API level writes can be
done to the memory mapped regions which can then be written in large
sequential chunks to disk.

You do not have to shut down the batch inserter for this to happen, it is
taken care of automatically.

Cheers,
Tobias

On Mon, Feb 14, 2011 at 10:53 AM, Pablo Pareja  wrote:

> Hi,
>
> I was wondering whether once the memory-mapping configuration for
> BatchInserter is full *(for example*
> *in the case of  neostore.relationshipstore.db.mapped_memory) *the class
> would auto-commit these changes
> to disk or it would just throw an exception.
> In the latter case, what would the options be?
>
> In my case I have to insert a huge amount of data that cannot be allocated
> in RAM.
> First I thought the BatchInserter would deal with this kind of situation,
> however I keep getting exceptions whenever the
> program reaches the point where *(I guess) *memory mapping configuration is
> not enough.
>
> Since I cannot use more RAM than what I have, I thought, ok so I will
> shutdown both inserter and index service and
> create them again each time the program have already inserted a decent
> amount of data.
> Then, don't know why but after a couple of tests, at some point the program
> always halts throwing a really weird exception
> saying something about a index file that exists but cannot be accessed in
> the merge process ?!?
>
> I guess I'd be doing something wrong but cannot figure out what it is.
> Thanks in advance
>
> --
> Pablo Pareja Tobes
> LinkedInhttp://www.linkedin.com/in/pabloparejatobes
> Twitter   http://www.twitter.com/pablopareja
>
> http://www.ohnosequences.com
> _______
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Does the index commit with the transaction?

2011-02-14 Thread Tobias Ivarsson
That is correct. The lucene indexes in Neo4j are tied to the same
transaction life cycle.

On Sun, Feb 13, 2011 at 6:18 PM, Massimo Lusetti  wrote:

> Hi all,
>  Does the inner Lucene index commit toghether with the Transaction
> success()/finish() cycle?
>
> I mean if I start a Transaction and do like
> http://wiki.neo4j.org/content/Transactions#Big_transactions I suppose
> I'm guarantee the Lucene index is synched to disk as soon as the
> Transaction finish(), right?
>
> Cheers
> --
> Massimo
> http://meridio.blogspot.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Help with exception using BatchInserter

2011-02-14 Thread Tobias Ivarsson
Your problem is likely related to the fact that 10G+10G+10G+10G + 63G > 64G.

Memory mapping uses memory outside of the Java heap. All memory you use,
memory mapping plus Java heap must fit in the available RAM.

Cheers,
Tobias

On Thu, Feb 10, 2011 at 10:42 PM, Pablo Pareja  wrote:

> Hi all,
> I keep getting this exception and don't know what the reason could be:
>
> Unable to write record[244986398] @[32583190934]
>
> org.neo4j.kernel.impl.nioneo.store.AbstractPersistenceWindow.writeOut(AbstractPersistenceWindow.java:112)
>
> org.neo4j.kernel.impl.nioneo.store.AbstractPersistenceWindow.force(AbstractPersistenceWindow.java:124)
>
> org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.flushAll(PersistenceWindowPool.java:251)
>
> org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.close(PersistenceWindowPool.java:224)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:614)
>
> org.neo4j.kernel.impl.nioneo.store.PropertyStore.closeStorage(PropertyStore.java:101)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:611)
> org.neo4j.kernel.impl.nioneo.store.NeoStore.closeStorage(NeoStore.java:115)
>
> org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.close(CommonAbstractStore.java:611)
>
> org.neo4j.kernel.impl.batchinsert.BatchInserterImpl.shutdown(BatchInserterImpl.java:351)
>
> I'm using a 65G RAM machine and the java process is launched with -Xmx63G
> the conf values I pass to the batch inserter are the following:
>
> neostore.nodestore.db.mapped_memory=10G
> neostore.relationshipstore.db.mapped_memory=10G
> neostore.propertystore.db.mapped_memory=10G
> neostore.propertystore.db.strings.mapped_memory=10G
> neostore.propertystore.db.arrays.mapped_memory=0M
>
> Besides, there were still 50G free space in the disk when this exception
> was
> thrown
>
> I'd really appreciate any help,
> Cheers
>
> --
> Pablo Pareja Tobes
> LinkedInhttp://www.linkedin.com/in/pabloparejatobes
> Twitter   http://www.twitter.com/pablopareja
>
> http://www.ohnosequences.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Help us make Neo4j better at handling YOUR data

2011-02-10 Thread Tobias Ivarsson
This tool does not gather statistics for string arrays, since they are not
affected by the proposed patch.

The tool still runs, but if there are no String properties, output will be
pretty boring

Cheers,
Tobias

On Wed, Feb 9, 2011 at 7:04 PM, Massimo Lusetti  wrote:

> On Fri, Feb 4, 2011 at 5:13 PM, Tobias Ivarsson
>  wrote:
> > Friends,
> >
> > Please read this, your involvement will make Neo4j more efficient!
>
> Does this run with a db with only String[] data?!
>
> Cheers
> --
> Massimo
> http://meridio.blogspot.com
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Calculating shortest paths in a large graph

2011-02-08 Thread Tobias Ivarsson
a:46)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> com.hbc.locationservices.graph.GraphManager.findCheapestPathWithDijkstra(GraphManager.java:339)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> com.hbc.locationservices.graph.GraphManager.getNodesInCheapestPath(GraphManager.java:413)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> com.hbc.locationservices.graph.GraphManager$$FastClassByCGLIB$$167175c8.invoke()
> > >>>>>>>>at
> > >> net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
> > >>>>>>>>at
> > >>>>>>
> > >>>>
> > >>
> com.hbc.locationservices.graph.GraphManager$$EnhancerByCGLIB$$64354524.getNodesInCheapestPath()
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>>> Regards
> > >>>>>>>> From: sxk1...@hotmail.com
> > >>>>>>>> To: user@lists.neo4j.org
> > >>>>>>>> Date: Sun, 30 Jan 2011 07:41:00 -0800
> > >>>>>>>> Subject: Re: [Neo4j] Calculating shortest paths in a large
> > >> graph
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>>> Hello Tobias,Thanks very much for your help, to be clear I want
> > >> to
> > >>>> find
> > >>>>>> the path that has the least cost, in this case length is the
> > >>>> determinator
> > >>>>>> for doing this.  The total number of nodes are roughly around a
> 100
> > >> but
> > >>>> not
> > >>>>>> much more.  I am attaching my heap dump,my code for parsing the
> > >> google
> > >>>> earth
> > >>>>>> data as well as the actual xml file I use to parse and load the
> > >> data,
> > >>>>>> managing the Graph and the relationships.
> > >>>>>>>> My project does the following:1) Create a physical graph based
> > >> on
> > >>>>>> google earth with a set of nodes and paths2) Load the contents of
> > >> the
> > >>>> google
> > >>>>>> earth file into neo4j using regular expressions to parse the xml3)
> > >> Run
> > >>>> the
> > >>>>>> dijkstra algorithm on this graph
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>>> Your help is much appreciated, let me know if there's anything
> > >> else
> > >>>> I
> > >>>>>> can provide.Regards
> > >>>>>>>>
> > >>>>>>>>> From: tobias.ivars...@neotechnology.com
> > >>>>>>>>> Date: Sun, 30 Jan 2011 16:22:42 +0100
> > >>>>>>>>> To: user@lists.neo4j.org
> > >>>>>>>>> Subject: Re: [Neo4j] Calculating shortest paths in a large
> > >> graph
> > >>>>>>>>>
> > >>>>>>>>&

Re: [Neo4j] Solve a problem using neo4j

2011-02-08 Thread Tobias Ivarsson
Hi John,

The High Availability implementation of Neo4j behaves in the same way.

Reads in HA are done from the local store.

An interesting side effect of this is that while all instances in a HA
cluster will store the same data, they can each have a different dataset in
cache. This can, with some consistent request routing, be used for what we
call "cache sharding".

-tobias

On Tue, Feb 8, 2011 at 10:10 AM, yehohan...@googlemail.com <
yehohan...@gmail.com> wrote:

> Hello Jim,
> To add to the previous question about lazy loading, how does highavailable
> implementation of neo4j behave?
>
> John
>
> Sent from my Nokia phone
> -Original Message-
> From: Jim Webber
> Sent:  08/02/2011 09:16:36
> Subject:  Re: [Neo4j] Solve a problem using neo4j
>
> Hi Ori,
>
> > 1. About the iterator - if I get a large amount of results (millions)  it
> > cannot be held in memory. Does the iterator work on in-memory collection,
> or
> > there is something like JDBC fetch size?
>
> For the embedded case, iterators are lazy so you won't hurt yourself. For
> the REST API results of traversers are built up in memory so you can hurt
> yourself.
>
> > 2. Is there an example for what I'm looking for or can someone give
> pseudo
> > code example for #3?
>
> That's pretty domain specific. But I found that looking at the Social
> Network example gave me enough understanding of the simple traverser API to
> get going:
>
> http://blog.neo4j.org/2009/09/social-networks-in-database-using-graph.html
> http://components.neo4j.org/neo4j-examples/1.2-SNAPSHOT/social-network.html
>
> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Help us make Neo4j better at handling YOUR data

2011-02-05 Thread Tobias Ivarsson
Damn. That one place assumes that you don't have any empty strings.

I've uploaded a patched version. Same location:
https://github.com/downloads/thobe/neo4j-admin-store/stringstat.jar

-tobias

On Fri, Feb 4, 2011 at 6:52 PM, Rick Bullotta <
rick.bullo...@burningskysoftware.com> wrote:

> Same here.
>
> -Original Message-
> From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org]
> On
> Behalf Of Axel Morgner
> Sent: Friday, February 04, 2011 12:29 PM
> To: user@lists.neo4j.org
> Subject: Re: [Neo4j] Help us make Neo4j better at handling YOUR data
>
> Hi Tobias,
>
> just ran the utility, but got an exception:
>
> Computing character frequencies for 205895 string records
>  30%
> ... 40%
> ... 50%
> ... 60%
> ... 70%
> ... 80%
> ... 90%
> ...100%
> Matching potential encodings for 205895 string records
> ...Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
> String index out of range: 0
> at java.lang.String.charAt(String.java:694)
> at org.neo4j.admin.tool.stringstat.Numerical.matches(Numerical.java:30)
> at
>
> org.neo4j.admin.tool.stringstat.TryAssumptions.process(TryAssumptions.java:4
> 6)
> at org.neo4j.admin.tool.stringstat.Main.main(Main.java:55)
>
> Greetings
>
> Axel
>
> > I have written a small utility that analyzes the string properties stored
> by
> > Neo4j and computes some statistics about them.
> > If I could get as many of you to run this tool on your stores and send
> those
> > statistics to me as possible, that would be great.
> >
> > This tool is available for download here:
> > https://github.com/downloads/thobe/neo4j-admin-store/stringstat.jar
> >
> > To run it, all you need to do is:
> > java -jar stringstat.jar /path/to/your/neo4j/store/dir
>
> ___
> 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
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Help us make Neo4j better at handling YOUR data

2011-02-04 Thread Tobias Ivarsson
I actually got an idea on what better support for large binary data would
look like just 5 minutes ago.
I'll try to write a prototype this weekend.

I've been thinking about how to support large binary data for a few months,
as one of my background trails of thought, but I just now got the epiphany
on how it could be exposed to the user.

Cheers,
Tobias

On Fri, Feb 4, 2011 at 5:29 PM, Rick Bullotta <
rick.bullo...@burningskysoftware.com> wrote:

> Will do, Tobias.
>
> Also, I'd love to see a project start soon to help Neo4J become better at
> storing *large* strings/byte arrays, also.  I think with some creativity,
> we
> could avoid the need for the entire large string/blob to be stored in the
> transaction logs, which to me, is one of the big challenges.
>
> In any case, I'll try to get you statistics soon.
>
> Rick


-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


[Neo4j] Help us make Neo4j better at handling YOUR data

2011-02-04 Thread Tobias Ivarsson
16
= 6 bit frequencies =
  n: 874452  a: 802639  e: 790998  i: 597945
   : 524600  r: 496695  o: 462202  s: 457249
  l: 429857  d: 327564  t: 310925  .: 217419
  m: 207459  @: 203896  k: 190190  g: 180166
  u: 169502  v: 158119  S: 148109  h: 144968
  M: 118409  H: 101946  b:  93958  c:  85548
  A:  84580  E:  77119  L:  75604  y:  67204
   j:  66711  K:  63279  T:  61919  p:  60935
  f:  60589  B:  51351  J:  48471  ?:  44154
  N:  39113  O:  35251  W:  32999  F:  32734
  G:  30821  R:  30341  z:  27002  V:  25837
  ?:  25434  D:  23706  C:  22801  I:  21277
  ?:  19167  ?:  17891  ?:  14752  P:  13294
  x:  11184  2:  11011  w:   9972  U:   9556
  Y:   7486  -:   4537  Z:   4524  ?:   4496
  1:   4490  4:   3119  q:   1756  0:   1379
   6:   1379  9:   1379  8:   1379  ,:609
  ?:342  ?:294
   9107508 strings with category bitmask  0b0
   2947442 strings with category bitmask0b111
 80361 strings with category bitmask   0b1000
  8251 strings with category bitmask  0b1
 16971 strings with category bitmask  0b10001
 26235 strings with category bitmask  0b100010001
 20632 strings with category bitmask  0b100010011
 41383 strings with category bitmask  0b101010011
 86358 strings with category bitmask  0b10111
   508 strings with category bitmask  0b11000
 32973 strings with category bitmask  0b11001
 26579 strings with category bitmask  0b110010001
= Category index =
 0. NineSevenBitAscii
 1. LowerCaseHexadecimal
 2. UpperCaseHexadecimal
 3. PunctuatedNumerical
 4. AlphaNumericalName
 5. Numerical
 6. FrequencyBased:4bit
 7. FrequencyBased:5bit
 8. FrequencyBased:6bit



The information I want you to send back to me is the data between
the  and  lines.

May the source be with you,
-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


Re: [Neo4j] Choosing HTTP method for server plugins (REST API)

2011-02-04 Thread Tobias Ivarsson
I think it makes sense to expose the invocation of a plugin by GET in some
(many/most?) cases, but I don't think it makes sense to expose this to the
plugin author.
REST is not going to be the only transport layer of the server for ever, and
other transport layers don't make the same distinction between
SET/GET/POST/DELETE.

I'm happy to have a discussion about this though :-)

Cheers,
Tobias

On Fri, Feb 4, 2011 at 4:01 PM, Maximilian Schulz  wrote:

> I am wondering if it is possible to set the http method for server plugins
> which extend the REST API. The example code only exposes methods which
> respond to POST requests. But I think it would make much more sense to use
> GET in many of my (and the example) cases.
>
> Max
> ___
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson 
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user


  1   2   3   4   5   >