【问题标题】:Neo4j.rb: how to search from serialize property having arrayNeo4j.rb:如何从具有数组的序列化属性中搜索
【发布时间】:2017-09-28 20:49:52
【问题描述】:
class Picture

  property :name
  property :user_ids

  serialize :user_ids
end

Picture.create(name: '1', user_ids: [1,4,5])

如何在 user_ids 属性中查找用户 id 为 1 的所有图片

我正在尝试这种方式:

Picture.as(:p).where('ALL(x IN [1] WHERE x IN p.user_ids)')

Neo4j.rb 版本 - neo4j (8.0.13) Neo4j - 3.1.1 Enterprise

但它不起作用。或者有任何更好的方法来存储数组并查询它,任何帮助都会非常可观


编辑:上面显示了布鲁诺的示例和我的节点描述我使用了示例节点

@Bruno 示例运行良好。

这是我的 Neo4j 节点视图

match (p:Place) where ALL(x IN [14] WHERE x IN p.from_airport_ids) return p

这在我的情况下不起作用

class Place
  include Neo4j::ActiveNode
  property :name
  property :from_airport_ids
  serialize :from_airport_ids
end

通过 API 创建地点

{  
  "place":{  
    "name":"Name",
    "from_airport_ids":[14,44,67]
  }
}

是否与我的数组值在节点中的存储方式以及@Bruno 示例值的存储方式有关?

【问题讨论】:

  • Bruno 的解决方案可能是最好的,但我怀疑您的解决方案不起作用的原因是因为您使用的是ALL。我认为ANY 会更好
  • @BrianUnderwood 我用create(:Picture{name: '1', user_ids: [1,4,5]}) 创建了一个节点,执行了查询MATCH (p) where ALL(x IN [1] WHERE x IN p.user_ids) return p 并工作了。但我同意你的观点,使用 IN 运算符的方法至少更具可读性。
  • @BrianUnderwood 也许有一些错误消息没有通知
  • 我编辑了问题并提供了更多信息,我可以看到@bruno 给出的示例运行良好。但在我的情况下,数组值存储在节点 [1,2,3] 与 1,23 中的方式有​​所不同
  • @BrianUnderwood 我认为问题出在 Neo4j.rb 中,当我使用序列化存储数组时,它在 neo4j 中存储为字符串。所以我无法查询它。如果我删除序列化然后保存,它将作为数组存储在 Neo4j 中,但是当我发现它像 Place.find(uuid) 时,它在 Neo4j 库中给出错误 TypeError: no implicit conversion of Array into String

标签: ruby-on-rails neo4j cypher neo4j.rb


【解决方案1】:

尝试将您的查询更改为:

Picture.as(:p).where('1 IN p.user_ids)')

即:匹配所有ps,其中p.user_ids包含1。

另外,我相信您应该将:User:Picture 节点之间的关系而不是ID 数组存储到:Picture 中。这是一种更图形方式来做事。

类似

            -[:CONNECTED_TO]->(:User {id:1})
          /
(:Picture)-[:CONNECTED_TO]->(:User {id:2})
          \
            -[:CONNECTED_TO]->(:User {id:3})

【讨论】:

  • 我已经编辑了这个问题,上面的查询也不起作用,你的例子(在评论中)效果很好,我也给出了真正的节点描述。图片,用户只是示例,但感谢您的解释
  • @V.G I created a node with create (:Place { name:"Name", from_airport_ids:[14,44,67]}) 并运行查询 match (p:Place) where ALL(x IN [14] WHERE x IN p.from_airport_ids) return p 它返回我节点。这不是期望的行为?
  • 当我直接从 neo4j 控制台创建节点时,查询效果很好,但是当我通过 Active::Node 创建节点时,同样的查询不起作用,我在聊天室中上传了快照
猜你喜欢
  • 2021-10-28
  • 2014-12-20
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多