http://blog.jongallant.com/2013/03/neo4j-azure-vs2012.html
After following the instructions on the blog of Jon, I have a cloud service running neo4j and I am ready to store some nodes over there. I have neo4j server running locally and in my Azure space. Running it locally caused some error due to "too long filenames". You can tackle this by changing the output directory of the dev fabric.
To execute CRUD actions on my Neo4j graph db I use Neo4jClient from Readify.
Example: here is a simple representation of a Geotopic and a GeotopicUser.
public class Geotopic
{
public string id { get; private set; }
public string latitude { get; set; }
public string longitude { get; set; }
public string message { get; set; }
public Geotopic(string latitude, string longitude, string message)
{
this.latitude = latitude;
this.longitude = longitude;
this.message = message;
this.id = Guid.NewGuid().ToString();
}
}
public class GeotopiaUser
{
public string id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public GeotopiaUser(string firstName, string lastName, string id)
{
this.FirstName = firstName;
this.LastName = lastName;
this.id = id;
}
}
These entities do have relationships. A user can post a geotopic. A user can follow another user. A user can like a topic. A user can recommend a topic.
First, after a user is logged in by using the Windows Azure Active Directory credentials, I make sure that the GeotopicUser exists in the neo4j graph db. The id of the user is the username that is registered in the actived directory. See the code snippet below on how users are created and how creating relationships between them is accomplished.
Using the Neo4j Client makes it quite easy to create a graph. In this example I create 2 users, one follows the other and a geotopic that is posted by the first user.
GraphClient client = new GraphClient(new Uri("http://
client.Connect();
// Create Indexes
client.CreateIndex("GeotopiaUser", new IndexConfiguration() { Provider = IndexProvider.lucene, Type = IndexType.exact }, IndexFor.Node); // exact node index
client.CreateIndex("Geotopic", new IndexConfiguration() { Provider = IndexProvider.lucene, Type = IndexType.exact }, IndexFor.Node); // exact node index
// Create Entities
// Movies
GeotopiaUser user1 = new GeotopiaUser("Riccardo", "Becker", "riccardo@geotopia.onmicrosoft.com");
var geoUser1 = client.Create(user1,
new IRelationshipAllowingParticipantNode
new[]
{
new IndexEntry("GeotopiaUser")
{
{ "Id", user1.id.ToString() }
}
});
//new topic
Geotopic topic1 = new Geotopic("0.0", "0.0", "First topic!");
var firsttopic = client.Create(topic1,
new IRelationshipAllowingParticipantNode
new[]
{
new IndexEntry("Geotopic")
{
{ "Id", topic1.id.ToString() }
}
});
client.CreateRelationship(firsttopic, new PostedBy(geoUser1));
GeotopiaUser user2 = new GeotopiaUser("John", "Doe", "johndoe@geotopia.onmicrosoft.com");
var geoUser2 = client.Create(user2,
new IRelationshipAllowingParticipantNode
new[]
{
new IndexEntry("GeotopiaUser")
{
{ "Id", user2.id.ToString() }
}
});
//john follows me
client.CreateRelationship(geoUser2, new FollowRelationship(geoUser1));
Executing this code created the following graph:
Node with id 49 is my first user (riccardo) and node 51 is the second user (John Doe). John follows me and I created one topic. This is setup by creating a "posted_by" relationship between node 50 and 49.
The following code uses the index "GeotopiaUser" and looks up every user in the graph.
List
foreach (Node
{
Console.WriteLine(user.Data.FirstName + " " + user.Data.LastName);
}
The next post will describe how to post a Geotopic on the canvas of Geotopia and how this is added to the graph DB of Neo4j.
Happy coding!
Sweet! Looking forward to next post.
ReplyDeleteWhat do you think of Neo4j so far? What operating system are you on?
Kenny, thanks for your comment. Looks great so far! I deployed it on Windows Azure :-)
ReplyDeleteThanks for the quick reply. I ask about the operating system because there is a Linux distribution version of Neo4j community on Windows Azure VM image depot. I am a Windows developer but I've found great performance improvements by running it on Linux instead of on Windows. If you want more info on that I can send it over. :)
ReplyDeleteOk good to know. This Azure deployment will suffice for now...once Geotopia has hundreds of millions of users I'll reconsider :-) It's a blog on Azure after all!
ReplyDeletehttp://www.neotechnology.com/nosql-now-talk-summary-links-polyglot-persistence-windows-azure/
ReplyDelete