Rails Neo4j如何在现有数据库中添加新字段

时间:2016-11-25 16:06:50

标签: ruby-on-rails ruby neo4j

class Invitation
  include Neo4j::ActiveNode
  property :email
end

这是Neo node Invitation节点我可以在图形数据库中看到它。   - 如果我在其中添加一些新字段,对于现有节点,它将不会反映在图形数据库中   - 如果我创建一个新节点,我可以在图数据库中看到它

所以问题是我是否必须添加一个字段假设

property :valid, type: Boolean, default: true

如何添加它以便我可以在图形数据库的现有节点中看到它,就像我们在活动记录迁移中一样

我在Node

中添加了字段

property :vish, type: Boolean, default: true

所以当查询

Invitation.where(vish: true).count ==>结果0

如果我添加新节点Invitation.create(email:'urvishh@gmail.com')

然后运行查询

Invitation.where(vish: true).count ==>结果1

这是我得到的确切问题

1 个答案:

答案 0 :(得分:1)

简短回答是:无法在持久化节点中搜索获取未声明的属性值。

<强>编辑:

他们为宝石添加了类似于迁移的行为,可能符合您当前的需求。

http://neo4jrb.readthedocs.io/en/latest/Migrations.html

发现回答:

节点应被视为存储其中属性的文档。我们在这里处理的是Cypher Query和public interface Product { double getPrice(); } class ProductA implements Product { public double getPrice() { // implementation } } // ...same for ProductB public class GeneralProduct { String label; Product product; public GeneralProduct(String label, Product product) { this.label = label; this.product = product; } // You might have something like this, or not public double getProductPrice() { return this.product.getPrice(); } } // Then using it: auxList.add("ProductA", new ProcuctA("ProductA")); auxList.add("ProductB", new ProcuctB("ProductB")); 的实现,它不仅忽略了属性的默认值。

这很容易测试:

Neo4j::ActiveNode

然后创建两个节点:

class User
  include Neo4j::ActiveNode

  property :name, type: String
  property :email, type: String, default: 'example@example.com'
end

我们尝试搜索未声明的属性

User.create(name: 'John', email: 'john@cena.com'
User.create(name: 'John')

我们有效地调用> User.where(title: 'Mr') => #<QueryProxy CYPHER: "MATCH (result_user:`User`) WHERE (result_user.title = {result_user_title})"> 并获得结果,这意味着Cyper

中根本没有使用模型中的属性声明

它表示仅用于设置和获取属性,但被查找程序忽略。

可能有解决方法,实际上是缺少Neo4j gem中的实现:

您可以按Cyper连接器中的值数组进行搜索,但不能正确解析值:

Neo4j::ActiveNode#where

正如您在上一个查询中所看到的,User.where(another_field: nil).count CYPHER 39ms MATCH (result_user:`User`) WHERE (result_user.another_field IS NULL) RETURN count(result_user) AS result_user => 100 User.where(another_field: ['Something', nil]).count CYPHER 12ms MATCH (result_user:`User`) WHERE (result_user.another_field IN {result_user_another_field}) RETURN count(result_user) AS result_user | {:result_user_another_field=>["Something", nil]} => 0 按字面意思传递。所以你不能这样做。

我代表您在存储库中打开了Issue,并将此问题链接起来以获得解决方案。