3

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

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

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

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

4

2 回答 2

4

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

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),那么对该属性的键索引是更好的方法。

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

于 2013-04-22T11:24:44.013 回答
3
  1. graph.getVertices()如果您没有在图形实现中打开自动索引,将遍历所有顶点并查找具有该属性的顶点。如果你已经有数据并且不能只打开自动索引器,你应该使用 isindex = indexableGraph.getIndex()然后index.get('classname', 'User')

  2. 可以执行query多个对象,但没有具体细节,很难说。因为Neo4j他们使用 Lucene,这意味着query()它将接受一个 lucene 查询,例如className:Users AND username:admin,但我不能代表其他人。

是的,这些数据库很适合玩,我个人认为neo4j这是最简单的,只要您了解它们的许可结构,使用它们就不会有任何问题。

于 2013-04-21T21:10:41.023 回答