Friday, September 7, 2012

Neo4j 1.8.RC1 - Really Careful #ftw

As we prepare the Neo4j 1.8 series for General Availability, we’re moving to an RC model of finalizing production ready software. RC of course stands for Really Careful.

Resisting Changes

Every line of code that is committed to github is greeted with exhaustive continuous testing, earning the developer either a deep-fried twinkie or pickled herring – the reward/punishment is flipped depending on the resident country.

For milestone releases, great care is used to QA the packaged artifacts. Download, install, start/stop, go through the motions of normal use, throw sample applications against it, compare benchmarks, try out language bindings. Yet, we haven’t been entirely comfortable going directly from a milestone to general availability, because the milestone often will have introduced new features and possible breaking changes.

Now, we’re adopting a formal Release Candidate strategy: a feature complete release built from a frozen code base which will only accept bug fixes. An RC could be the GA, but introduces a longer public review before getting the final stamp of approval.

Respond Critically

Here’s where you come in: download Neo4j 1.8.RC1 and use it for your development and testing in anticipation of the GA. Please, let us know immediately about any critical concerns which would stop you from putting this candidate into production.

Read the Changes

Wait. There are changes? Yes, a collection of fixes, as noted in the change log:


  • Removed contention around allocating and moving persistence windows so that a thread won't need to await another thread doing this refresh, instead just continue knowing that the windows will be optimally placed in a very near future.
  • Removed contention around translating a key (as String) into the ID by using copy-on-write map instead of a concurrent hash map. Used in property key as well as relationship type translation.
  • Fix for Node/Relationship#getPropertyValues() sometimes returning null values from the iterator.


  • Upgraded Jackson JAXRS to version 1.9.7
  • Keeping the Cypher execution engine between calls makes it possible to re-use execution plans
  • added User-Agent header tracking to udc to determine rest-driver usage


  • Removed the /../ literal for regular expressions. Now a normal string literal is used instead
  • Concatenation handles types better
  • Changed how the graph-matching module is used, to make it safe for concurrent use
  • Better type error messages
  • Renamed iterable to collection
  • Fixed #795: so that WITH keeps parameters also for empty aggregation results
  • Fixed #772: Creating nodes/relationships goes before SET, so SET can run on already created elements
  • Added error when using != instead of <>
  • Fixed #787: Issue when comparing array properties with literal collections
  • Fixed #751: Better error message for some type errors
  • Fixed #818: Problem where properties could only have scalar values (they can be arrays as well)
  • Fixed #834: Gives relevant syntax exception when properties are entered in MATCH

Get Neo4j 1.8.RC1

Neo4j 1.8.RC1 is available for:

Be safe out there. Oh, and if out there happens to be the San Francisco bay area at the beginning of November, join us at GraphConnect.


Tuesday, September 4, 2012

The Geek5 - Books you want to read?

Hi all,
during a meeting some weeks ago some of the team discussed what 5 books geeks in the wider Neo4j community has read. We couldn't reach a final conclusion so the discussion resulted in a Google Doc and a voting round on Twitter and the Neo4j Mailing list, see below. Thanks for all the votes, it is really interesting to see what comes up here.

Not surprisingly, it seems that Fantasy and SciFi are high on the list. However, I like especially number 4 "The C Programming language" as it seems C is not forgotten yet after all ;)

Now, with the popularity of the first three books, it would be very interesting get a dataset to play around with, much like the one Michael Hunger did for his favorite, Game of Thrones.

So here is a little challenge: Whoever comes up with a similar graph for The Hitchhikers Guide to the galaxy, The Lord of The Rings or The Foundation Series, will get a personal Neo4j Community shirt for a #geek5 @neo4j tweet. Just sayin'.

Over and out.


Saturday, September 1, 2012

Cypher Webinar Follow Up


Webinar Follow-Up

Thanks to everyone for attending the webinar, I was thrilled about the attendance and the great discussions in the chat.

As promised we publish this follow-up post to address questions that were not answered and provide a convenient place to check out the resources mentioned in the webinar.

Your Questions

Oleg Okun: How easily can one migrate from a graph database to a non-graph NoSQL database?
Export your data using any of the API's (Java, REST, Cypher) and import it on the other side.

Alexandre Meynaud: Should we be concerned about performance when defining cypher patterns?
There are some concerns, cypher performance is addressed in Neo4j 1.9, right now try to focus on simple pattern with just one or two bound nodes and non-optional relationships. You might employ patterns as experessions instead of optional relationships

Oleg Okun: Can you point to Cypher implementation of some machine learning/data mining algorithms?
I don't know of any, might be an interesting topic to contribute to. There are some data modeling examples in the Neo4j Manual.

Martin: Will future versions of Cypher be backwards compatible?
Older Cypher parser versions are supported for up to two major Neo4j versions, oder parsers might be activated by prepending a CYPHER 1.7 like prefix to your query.

Alexandre Meynaud: Do you foresee a "standard" graph query language in the coming years (or decades)?
Not really, for us we focus on allowing our community users and customers to solve their problems. We've had discussions with other vendors about it, but it seems premature to agree on a standard while we are all so busy and focused on product development.

Ajinkya: Can you discuss the reasons that went into the decision to implement cypher using Scala ?
This is a longer discussion, which I covered in a talk given at Geekout Tallinn, see the resources section below.


Video Recording

0830 - Cypher and Neo4j from Neo Technology on Vimeo.

More Resources

Great Webinar Chat!

The chat during the webinars was great, thanks a lot to Andreas Kollegger for answering all the questions.

Hassan: Washington DC here
Chris Skardon: evening from Cornwall, UK
Matt Taylor: hello from Chicago
ASHISH M: wow! looks like we have an internnational crowd on today!! Anyone from Australia?
MilanSK: eveninig from Humenne, Slovakia
Harald: Frankfurt, Germany
Martin: Hi from Spain (and Gibraltar)
Alexandre Meynaud: Yes, the great thing about Cypher is that you express *what* you want to retreive from the graph, and not how
Aki Ristkari: It's easy to visualize and you don't have to explain any table-row-kill_me_now-hibernate stuff to people. That marketing term 'Whiteboard friendly' is actually very accurate
Andreas Kollegger: @Hisao you can't do sub-queries, but you can "chain" queries using a "WITH" clause to sort-of pipe the results to another query instead of returning them
Amit: is there a way to indicate in cypher to prune conditionally like we can using the traverser API
Hisao Motoyama: ok, thanks
Andreas Kollegger: @Ivan the query performance is not affected by the database size, though it is affected by an increase in "local" data
Alex Guerrieri: I love how intuitive it is
IvanTraveso: nice presentation. thanks!
Alexandre Meynaud: Great presentation Michael, thanks a lot
Wes: Thanks a lot guys.
Andreas Kollegger: thanks everyone, thanks Michael!
James Camfield: cheers
Chris Skardon: Thanks!
Mylène: Thanks. this was absolutely cool!
Aki Ristkari: Thanks for the show  

How to use Cypher from other programming languages

This topic is so broad, we will address it in a separate blog, for now here is the link to the gist.

- Thanks for watching, and see you next time