[Neo] Groovy and Neo4J - A working example

Mattias Persson mattias at neotechnology.com
Fri Dec 12 11:57:21 CET 2008


Nice,

That would actually be my next question :)

Cool things indeed.

2008/12/12 Guillaume Laforge <glaforge at gmail.com>:
> You can also do some fun things like:
>
> def myNodeName = "firstName"
> assert person."${myNodeName}" == "firstName"
>
> :-)
>
> On Fri, Dec 12, 2008 at 11:41 AM, Mattias Persson
> <mattias at neotechnology.com> wrote:
>> Awesome,
>>
>> that takes care of that then, thanks!
>>
>> 2008/12/12 Guillaume Laforge <glaforge at gmail.com>:
>>> In Groovy, you can "quote" method names and properties.
>>>
>>> So when you have weirdo characters, you can do that instead:
>>>
>>> myNode."super - funky + node / name" = "something.
>>>
>>>
>>> On Fri, Dec 12, 2008 at 11:36 AM, Mattias Persson
>>> <mattias at neotechnology.com> wrote:
>>>> Hmm, this thread is probably dead?
>>>>
>>>> But, I just thought about the:
>>>>
>>>> myNode.name = "Mattias"
>>>> myNode.someProperty = "Something else"
>>>>
>>>> Keep in mind that property keys have no restrictions as to length or
>>>> content which means a property key can contain spaces and '='
>>>> characters and what not. f.ex.
>>>>
>>>> myNode.a property with spaces in it = "Hello there"
>>>>
>>>> Wouldn't work, right?
>>>>
>>>> Could you use the real methods (setProperty/getProperty/hasProperty)
>>>> for such keys instead?
>>>>
>>>> 2008/12/7 Stig Lau <stig.lau at gmail.com>:
>>>>> I've tossed up a demo of Neo4J vs Groovy which shows Neo4J running in
>>>>> Groovy with the help of some Maven magic. Sadly nough, I didn't get
>>>>> Guillaume's propositions working, so I'm leaving the ball over to the
>>>>> guys who know Groovy a little better than me.
>>>>> The project is packaged as a Maven Archetype, as a test of improving
>>>>> deployment of sourcecode. Instructions are posted on the blog. The
>>>>> source code is hosted on Mercurial, so feel free to move it to a VCS
>>>>> of choice, as I consider it property of the Neo4J community.
>>>>>        -Stig,
>>>>>
>>>>> http://stigl.wordpress.com/groovy-does-neo4j-thanks-to-maven-simplicity
>>>>>
>>>>>> From: "Guillaume Laforge"
>>>>>> Subject: [Neo] Groovy and Neo4J
>>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I had an email exchange with Emil this morning about what Groovy could
>>>>>> bring to using Neo4J. I think using a dynamic language with a graph
>>>>>> database can make a lot of sense, as it's easier to work with a "less
>>>>>> strict" language with semi structured data not requiring heavyweight
>>>>>> set-in-stone schemas.
>>>>>>
>>>>>> ---------------%<--------------------------------------
>>>>>>
>>>>>> I haven't downloaded and tried Neo yet, but if I find some time, I'd
>>>>>> be happy to give it a try.
>>>>>> As you were mentioning that Groovy should probably work well with Neo,
>>>>>> yes, I'm pretty certain it does, and I'm sure we could bring some
>>>>>> Groovyisms into the loop to make using Neo even more seamless and
>>>>>> nice.
>>>>>>
>>>>>> For instance, if I look at your quick start example:
>>>>>>
>>>>>> Node firstNode = neo.createNode();
>>>>>> Node secondNode = neo.createNode();
>>>>>> Relationship relationship = firstNode.createRelationshipTo(
>>>>>> secondNode, MyRelationshipTypes.KNOWS );
>>>>>>
>>>>>> firstNode.setProperty( "message", "Hello, " );
>>>>>> secondNode.setProperty( "message", "world!" );
>>>>>> relationship.setProperty( "message", "brave Neo " );
>>>>>>
>>>>>> Groovy handles the setProperty/getProperty methods in a particular
>>>>>> fashion, and without doing anything special, you should be able to
>>>>>> directly use this nicer syntax in Groovy:
>>>>>>
>>>>>> firstNode.message = "Hello"
>>>>>> secondNode.message = "world!"
>>>>>> relationship.message = "brave Neo"
>>>>>>
>>>>>> It really gives people the impression of working with real objects,
>>>>>> with real properties or methods.
>>>>>>
>>>>>> With maps or expandos in Groovy, you can already manipulate
>>>>>> quasi-beans with that syntax, and people may potentially not need to
>>>>>> manipulate Node or Relationship directly, but could use these maps /
>>>>>> expandos instead, and it would only be when storing these in the graph
>>>>>> database that you could "coerce" the type to Node or Relationship.
>>>>>>
>>>>>> More concretely:
>>>>>>
>>>>>> def firstNode = [:]
>>>>>> firstNode.message = "Hello"
>>>>>>
>>>>>> And you could then just call some store() method in your APIs --
>>>>>> although it seems in the tutorial, there's no need to "store", just
>>>>>> creating the nodes and relationships are enough.
>>>>>>
>>>>>> Also for relationships, we could imagine using Groovy's native list
>>>>>> syntax for representing such triples (and using static import for
>>>>>> KNOWS):
>>>>>>
>>>>>> def relationship = [ firstNode, KNOWS, secondNode ]
>>>>>>
>>>>>> Combining everything:
>>>>>>
>>>>>> [
>>>>>>   [name: "Neo"],
>>>>>>   [KNOWS: [since: someDate],
>>>>>>   [name: "Trinity"]
>>>>>> ]
>>>>>>
>>>>>> I was also mentioning coercion, as you can create custom type coercion
>>>>>> in Groovy (kind of a cast, if you wish, but you can transform
>>>>>> something into some other type):
>>>>>>
>>>>>> [name: "Neo"] as Node
>>>>>> [ firstNode, KNOWS, secondNode ] as Relationship
>>>>>>
>>>>>> Or simply at declaration time:
>>>>>>
>>>>>> Node neo = [name: "Neo"]
>>>>>> Relationship rel =  [ firstNode, KNOWS, secondNode ]
>>>>>>
>>>>>> Anyway... enough brainstorming for now, but a graph database like Neo
>>>>>> and a dynamic language like Groovy, and you can really really have
>>>>>> fun.
>>>>>> Congratulations for a great graph database project!
>>>>>> Keep up the good work.
>>>>>>
>>>>>> --
>>>>>> Guillaume Laforge
>>>>>> Groovy Project Manager
>>>>>> Head of Groovy Development at SpringSource
>>>>>> http://www.springsource.com/g2one
>>>>>
>>>>> _______________________________________________
>>>>> Neo mailing list
>>>>> User at lists.neo4j.org
>>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Mattias Persson, [mattias at neotechnology.com]
>>>> Neo Technology, www.neotechnology.com
>>>> _______________________________________________
>>>> Neo mailing list
>>>> User at lists.neo4j.org
>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>>
>>>
>>>
>>>
>>> --
>>> Guillaume Laforge
>>> Groovy Project Manager
>>> Head of Groovy Development at SpringSource
>>> http://www.springsource.com/g2one
>>> _______________________________________________
>>> Neo mailing list
>>> User at lists.neo4j.org
>>> https://lists.neo4j.org/mailman/listinfo/user
>>>
>>
>>
>>
>> --
>> Mattias Persson, [mattias at neotechnology.com]
>> Neo Technology, www.neotechnology.com
>> _______________________________________________
>> Neo mailing list
>> User at lists.neo4j.org
>> https://lists.neo4j.org/mailman/listinfo/user
>>
>
>
>
> --
> Guillaume Laforge
> Groovy Project Manager
> Head of Groovy Development at SpringSource
> http://www.springsource.com/g2one
> _______________________________________________
> Neo mailing list
> User at lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Mattias Persson, [mattias at neotechnology.com]
Neo Technology, www.neotechnology.com


More information about the User mailing list