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