2

我有一个带有 Neo4j.rb 的 Jruby on Rails 应用程序和一个模型,比如说 Auth,定义如下:

class Auth < Neo4j::Rails::Model
  property :uid, :type => String, :index => :exact
  property :provider, :type => String, :index => :exact
  property :email, :type => String, :index => :exact
end

而这段代码:

a = Auth.find :uid => 324, :provider => 'twitter'
# a now represents a node
a.to_json
# outputs: {"auth":{"uid": "324", "provider": "twitter", "email": "email@example.com"}}

请注意,JSON 表示中缺少节点的 ID。我的应用程序中有一个 RESTful API,我需要该 id 来执行 DELETE 和 UPDATE 操作。

我试过这个看看它是否有效:

a.to_json :only => [:id]

但它返回一个空的 JSON {}

有什么方法可以在不重写整个to_json方法的情况下获取 JSON 表示中的节点 ID?

更新同样的问题也适用于该to_xml方法。

谢谢!

4

2 回答 2

3

我正在回答我自己的问题。我仍然认为有更好的方法可以做到这一点,但是,现在,我正在使用以下 hack:

/config/initializers/neo4j_json_hack.rb我输入以下代码:

class Neo4j::Rails::Model
    def as_json(options={})
        repr = super options
        repr.merge! '_nodeId' => self.id if self.persisted?
    end
end

现在我的持久Neo4j::Rails::Model对象的每个 JSON 表示都有一个_nodeId参数。

于 2012-07-24T15:35:37.007 回答
1

ID 通常不包括在内,因为它不应该暴露在 Neo4j 数据库之外。Neo4j 不保证各个实例的 ID 相同,如果在 Neo4j 的分布式企业安装中更改了 ID,我也不会感到惊讶。

您应该创建自己的 ID(GUID?),将其保存为节点上的属性,对其进行索引,并使用它来引用您的节点。不要将 Neo4j ID 暴露给您的用户或应用程序,并且绝对不要在单个请求之外依赖它(例如,不要在另一个数据库中保存对它的引用或使用它来测试是否相等)。

于 2013-04-08T20:40:43.293 回答