使用Neo4j和rails实现标签的最佳做法是什么?

时间:2015-08-17 00:28:07

标签: ruby-on-rails-4 neo4j

拥有一个基于neo4j的rails应用程序,并希望实现标签。不确定如何去做。正在考虑为具有“标签”标签的节点创建一个新模型,但这看起来有点矫枉过正。对于基于Neo4j的应用程序,有没有像https://github.com/mbleigh/acts-as-taggable-on这样的方法?

1 个答案:

答案 0 :(得分:2)

这取决于您在性能方面的考虑要做什么;)

创建Tag模型并不是太过分,尤其是在创建标记时确保merge标记,以确保不创建重复项。然后,您可以使用Neo4j的图形遍历功能从标签跳转到其他对象,反之亦然,以及执行更复杂的查询,例如根据共享/不共享的标签数量在对象之间建议。

如果您只想拥有一个基本的字符串列表,Neo4j实际上支持在节点和关系上拥有数组属性。您可以通过在模型上声明属性来简单地使用它:

class ModelClass
  include Neo4j::ActiveNode

  property :tags
end

唯一的问题是你不能基于数组进行索引(我认为这是为未来计划的)。因此,如果性能是一个大问题,而不仅仅是显示标记列表,那么Tag节点可能是您最好的选择。

此外,为了获得最佳性能以防万一你获得大量标签,你需要索引标签名称/文本/无论你如何调用该属性。有几种方法可以做到这一点:

class Tag
  include Neo4j::ActiveNode

  property :name, index: :exact
end

或者您可以使用Neo4j约束来确保没有两个节点具有相同的名称:

class Tag
  include Neo4j::ActiveNode

  property :name, constraint: :unique
end

约束会自动在封面下创建索引以提高性能。

最后,如果您认为Tag模型不使用默认uuid列来唯一标识您的代码,而是使用您可以执行的名称:

class Tag
  include Neo4j::ActiveNode

  id_property :name
end

这也为name属性创建了约束。