gpt4 book ai didi

neo4j - Tinkerpop 蓝图顶点查询

转载 作者:行者123 更新时间:2023-12-01 10:01:04 25 4
gpt4 key购买 nike

我研究 Tinkerpop 堆栈已有一段时间了。我想我很清楚它能做什么以及它适用于哪些数据库。我现在正在考虑几个不同的数据库,但还没有确定。所以我决定只为接口(interface)编写代码,现在不考虑任何实现。在我查看的数据库中,它们实现了 TransactionalGraphKeyIndexableGraph。我认为这足以满足我的需要,但我只有一个问题。

我有不同的顶点“类别”。使用蓝图,我相信通过在每个包含类名的顶点中有一个字段来最好地表示。这样做,我可以做一些类似 graph.getVertices("classname", "User") 的事情,它会给我所有的用户顶点。由于 getVertices 函数指定实现应使用索引,因此我保证可以快速查找(如果我为该字段建立索引)。

但是假设我想根据两个属性检索一个顶点。顶点必须有 className=Usersusername=admin。找到那个单一顶点的最佳方法是什么?是否可以对这两个属性进行索引,即使并非所有顶点都有 username 字段?

仅供引用 - 我目前考虑的数据库是 OrientDB、Neo4j 和 Titan,但我还没有确定。如果有帮助的话,我目前还打算使用 Gremlin。

最佳答案

对顶点使用“类”或“类型”是分割它们的好方法。正在做:

graph.createKeyIndex("classname",Vertex.class);
graph.getVertices("classname", "User");

是一种非常常见的模式,通常应该产生快速查找,尽管迭代数千万用户的索引可能不是很好(如果您打算将特定的 classname 增长到非常大尺寸)。我认为这会引出您问题的第二部分,即进行双属性查找。

从表面上看,两个元素查找类似于(使用 Gremlin):

g.V('classname',"User").has('username','admin')

因此,您将顶点缩小到仅具有键索引的“用户”顶点,然后为“管理员”过滤那些顶点。但是,我会以不同的方式建模。简单地做会更便宜:

graph.createKeyIndex("username",Vertex.class);
graph.getVertices("username", "admin");

或者在 Gremlin 中:

g.V('username','admin')

如果您知道自己想要的用户名,没有比这更好/更快的建模方法了。如果您想遍历所有“用户”顶点,您实际上只需要 classname。如果您只想找到一个(或一组具有该 username 的顶点),那么对该属性进行键索引是更好的方法。

即使我不在其上创建键索引,我仍然在所有顶点上包含一个 typeclassname 属性。我发现它对我可能关心或不关心速度但只需要一个答案的全局运营很有帮助。

关于neo4j - Tinkerpop 蓝图顶点查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com