2012-03-28 76 views
0

模型的一些伪代码,我正在使用一个特定的Neo4j节点:我怎样才能使用Neo4jClient

User { int Id, string Username } 
Activity { int Id, string Name } 
Place { int Id, string Name } 

基本上我有一堆用户,他们属于某个地方(多对多在RDBMS世界中的关系)。现在我已经创建了所有节点,现在要创建它们之间的关系。为此,我相信我需要获得每个节点的引用,然后简单地创建它们之间的关系。

注意:到目前为止没有关系存在。它看起来像在一些例子中,他们添加了一个指向RootNode的关系的用户节点,但我不知道为什么。我不确定是否需要这样做。

更多的伪代码:

var userRef = _graphClient...GetUserNodeWhereIdEquals(user.Id); 
// or something like _graphClient.OutV<User>("[[id={0}]]", user.Id) 
// or even just _graphClient.V<User>(id == user.Id) 
var placeRef = _graphClient...GetPlaceNodeWhereIdEquals(place.Id); 

_graphClient...CreateRelationshipBetween(userRef, placeRef, "belongs_to"); 

不幸的是,文件开始了非常伟大的,然后南下当你到的关系。

更新12年3月29日

这里是我到目前为止的代码:

 foreach (var a in _activityTasks.GetAll()) 
     { 
      _graphClient.Create(a, new ActivityBelongsTo(_graphClient.RootNode)); 
     } 
     foreach (var p in _placeTasks.GetAll().Take(1)) 
     { 
      var placeNode = _graphClient.Create(p, new PlaceBelongsTo(_graphClient.RootNode)); 
      foreach (var activity in p.Activities) 
      { 
       Activity activity1 = activity; 
       var activityNode = _graphClient.RootNode.In<Activity>(ActivityBelongsTo.TypeKey, a => a.Id == activity1.Id).SingleOrDefault(); 
       _graphClient.CreateRelationship(placeNode, new PlaceHasActivity(activityNode.Reference)); 
      } 
     } 

活动节点创建的罚款。地方节点创建正常。尝试获取activityNode时,现在正在抛出一个错误。这是一个相当大的堆栈跟踪,所以我会尝试在这里解释:

执行请求时收到异常。

查询是:GV(P0)。在(P1).filter {它[P2] == P3 } .drop(P4)。取(P5)._()

唯一的例外是:值不能为空。参数名称:密钥 System.ArgumentNullException:值不能为null。参数名称:密钥 位于System.Collections.Generic.Dictionary`2.Insert(TKey key,TValue value,Boolean add)...原始响应正文为:[0129] [0121] [0121] [0416] [0411] [04] [0129] [0411] [0411]“名称”:“有氧运动”,“身份证”:2 },“all_typed_relationships”: “http:// localhost:7474/db/data/node/2/relationships/all/{-list | & | types}”, “遍历”: “http:// localhost :7474/db/data/node/2/traverse/{returnType}“,”self“ :”http:// localhost:7474/db/data/node/2“,”property“: ”http: /本地主机:7474 /分贝/数据/点头e/2/properties/{key}“, ”outgoing_typed_relationships“: ”http:// localhost:7474/db/data/node/2/relationships/out/{-list | “http:// localhost:7474/db/data /”,“ | types}”,“ node/2/relationships/in“,”extensions“ :{},”create_relationship“: ”http:// localhost:7474/db/data/node/2/relationships“, ”paged_traverse“: ”http ://本地主机:7474 /分贝/数据/节点/ 2 /寻呼/横向移动/ {返回类型} {?pageSize,leaseTime}“, ”all_relationships“: ”http:// localhost:7474/db/data/node/2/relationships/all“, ”incoming_typed_relationships“: ”http:// localhost:7474/db /数据/节点/ 2 /关系/中/ { - 列表| & |。类型}” }]

东西添加项目时,一个词典时,该键为null做的问题是,我没有看到任何空当我调试我的结束,活动1是有,RootNode在那里,TypeKey是一个常量字符串

我几乎想知道如果我应该只保留创建的节点在一个数组或字典我自己,然后只是与NodeReference一起工作这就是我要尝试的

当天晚些时候

这似乎一切都装入精美的图形数据库:

var activityNodes = _activityTasks.GetAll().ToDictionary(a => a.Id, a => _graphClient.Create(a, new ActivityBelongsTo(_graphClient.RootNode))); 

     foreach (var p in _placeTasks.GetAll()) 
     { 
      var placeNode = _graphClient.Create(p, new PlaceBelongsTo(_graphClient.RootNode)); 
      foreach (var activity in p.Activities) 
      { 
       _graphClient.CreateRelationship(placeNode, new PlaceHasActivity(activityNodes[activity.Id])); 
      } 
     } 

     foreach (var u in _userTasks.GetAllUserGraph()) 
     { 
      var userNode = _graphClient.Create(u, new UserBelongsTo(_graphClient.RootNode)); 
      foreach(var activity in u.Activities) 
      { 
       _graphClient.CreateRelationship(userNode, new UserParticipatesIn(activityNodes[activity.Id])); 
      } 
     } 

现在的问题是相似,我收到。现在,我想拥有的根节点的关系的活动:

Node<Activity> activity = _graphClient 
          .RootNode 
          .In<Activity>(ActivityBelongsTo.TypeKey, a => a.Id == 1) 
          .SingleOrDefault(); 

投掷键值不能再为空例外。我想我需要更多地研究gremlin语法。我猜猜问题就在那里。

今天下午

入门的Gremlin查询进行实验:

GV(0){.inE.filter it.label == “ACTIVITY_BELONGS_TO”} {outV.filter = it.Id = 1}。名称

正常工作。我试图复制,使用neo4jClient语法:

_graphClient.RootNode.InE(ActivityBelongsTo.TypeKey).OutV(B => b.Id == 1).SingleOrDefault();

相同的空值例外,它吐出:

g.v(p0).inE.filter{ it[p1].equals(p2) }.outV.filter{ it[p3] == p4 }.drop(p5).take(p6)._() 

看起来我的权利,除了结束。然而,尽管如此:

g.v(0).inE.filter{it.label=="ACTIVITY_BELONGS_TO"}.outV.filter{it.Id==1}.drop(0).take(1)._() 

而且工作正常。这里有些臭味......也许我应该试试其他库,尽管我喜欢de/serialization支持。叹...

想到也许原始查询会起作用。不!这个方法不再接受一个字符串和所需的GremlinQuery,我不知道该如何去做。 Grooooooooooooooooan。

var users = graphClient.ExecuteGetAllNodesGremlin<IsCustomer>("g.v(0).out('IsCustomer'){it.'Name' == 'BobTheBuilder'}"); 

更新12年3月30日

创建一个新的项目,下面的一切工作正常。超级困惑,为什么会在这里工作... :(也许版本差异,我不知道。

 var client = new GraphClient(new Uri("http://localhost:7474/db/data")); 
     client.Connect(); 

     client.Create(new User { Id = 1, Username = "joe" }, new UserBelongsTo(client.RootNode)); 
     client.Create(new User { Id = 2, Username = "cloe" }, new UserBelongsTo(client.RootNode)); 
     client.Create(new Activity { Id = 1, Name = "Bocce Ball" }, new ActivityBelongsTo(client.RootNode)); 
     client.Create(new Activity { Id = 2, Name = "Programming" }, new ActivityBelongsTo(client.RootNode)); 

     var user = client.RootNode.In<User>(UserBelongsTo.TypeKey, u=>u.Id == 1).SingleOrDefault(); 
     var activity = client.RootNode.In<Activity>(ActivityBelongsTo.TypeKey, a=>a.Id == 1).SingleOrDefault(); 
     client.CreateRelationship(user.Reference, new Plays(activity.Reference)); 

     user = client.RootNode.In<User>(UserBelongsTo.TypeKey, u => u.Id == 1).SingleOrDefault(); 
     activity = client.RootNode.In<Activity>(ActivityBelongsTo.TypeKey, a => a.Id == 1).SingleOrDefault(); 

回答

1

我刚刚开始了。我建议你看看这个博客: http://romikoderbynew.com/2011/07/30/neo4jclient-primer/

此外,检查http://frictionfree.org及其源代码(在约节)更多的例子。

  • 创建现有的关系 - 据我所知,这是可能的。但是,在创建节点时,关联节点似乎更容易。来自博客:

您还可以在现有节点之间创建关系。 graphClient.CreateRelationship(customerNodeReference,new Speaks(languageNode.Reference));

  • 根节点 - 我相信你需要从一个节点开始查询,我不认为你可以做一个

    SELECT * FROM ... WHERE 
    

    因此,它会使你需要附加感节点到根节点。这是从FrictionFreeApp一个例子:

    var node = graphClient.Create(
         user, 
         new UserBelongsTo(rootNode)); 
    
+0

我找到了摩擦空源,并试图复制这一点,但得到一个空的错误这是奇怪的。我会更新我的问题。 – rball 2012-03-29 15:13:36