0

我们正在使用带有 Neo4j 的 jRuby on Rails,并且我们遇到了一些非常奇怪的错误。目前,我们有用户能够创建帖子。很少,他们似乎在他们的“帖子”关系中得到了展开的节点,而不是 Post 对象。例如,在控制台中,我迭代了一个用户的帖子,结果如下:

> user.posts.each{ |post| puts post }
#<Post:0x49ca112d>
#<Post:0xc9ddbea>
#<Post:0x7e706c75>
Node[438144]
#<Post:0x769dba83>

这会导致各种问题,因为每当我们尝试访问这些非发布帖子之一的属性或关系时,都会出现这样的错误:

undefined method `[any property or relationship]' for #<Java::OrgNeo4jKernelImplCore::NodeProxy:0x461784b6>

这些裸节点似乎间歇性地添加到人们的“发布”关系中,我可以手动删除该节点,但这似乎充其量只是权宜之计,因为它们一直在被创建。

所以,我的问题是,我如何(1)首先防止这些非 Post 对象被创建,我如何(2)清除我的数据库中的这些对象?

4

1 回答 1

1

这种行为的一个原因可能是您protected_keys在更新节点时使用(仅使用 neo4j-wrapper gem 时)。

我怀疑 _classname 属性由于某种原因已经消失(这可能使用protected_keysconf 发生,请参阅下面的 github 问题)。例如,您已将帖子添加到不是帖子的用户帖子关系(它没有值为“帖子”的 _classname 属性)。

例如,如果你做这样的事情,你会遇到这个问题:

user.posts << Neo4j::Node.new

我建议进行一些调试,以确保您的所有帖子对象都具有 _classname 属性。

如果它是 neo4j.rb 中的错误,您可以执行以下丑陋的解决方法来加载包装的对象。

user.posts.map{|p| p.wrapper}.each{ |post| puts post }

我添加了一个 github 问题以防万一,https://github.com/andreasronge/neo4j/issues/230 请添加更多信息如何重现它,例如neo4j 和jruby 的版本。测试用例也非常方便。

于 2012-12-19T10:09:51.080 回答