我已经研究了一段时间了。我想我很清楚它能做什么,以及它能很好地处理哪些数据库。我现在正在考虑几个不同的数据库,但还没有确定。因此,我决定将我的代码完全写到接口上,而不考虑任何实现。在我正在查看的数据库中,它们实现了TransactionalGraph和KeyIndexableGraph。我认为这足以满足我的需要,但我只有一个问题。
我有不同的“类”顶点。使用蓝图,我相信在每个顶点中都有一个包含类名的字段,这是最好的表示。这样做,我可以做一些类似graph.getVertices("classname", "User")的事情,它会给我所有的用户顶点。由于getVertices函数指定实现应该使用索引,所以保证快速查找(如果我对该字段进行索引)。
但是假设我想根据两个属性检索一个顶点。顶点必须有className=Users和username=admin。找到那个单顶点最好的方法是什么?是否可以对这两个属性进行索引,即使不是所有的顶点都有一个username字段?
FYI --我目前正在考虑的数据库是OrientDB、Neo4j和土卫六,但我还没有确定。我目前还计划使用Gremlin,如果这有帮助的话。
发布于 2013-04-21 21:10:41
graph.getVertices()将遍历所有顶点,并查找具有该属性的顶点。如果您已经拥有数据,并且不能只打开自动索引器,则应该使用is index = indexableGraph.getIndex(),然后使用index.get('classname', 'User')。query是可能的,但是如果没有细节,就很难说了。对于Neo4j,他们使用Lucene,这意味着query()将接受lucene查询,例如className:Users AND username:admin,但我不能代表其他查询。是的,在这些DB中,我个人认为neo4j是最容易使用的,只要您了解它们的授权结构,就不会有任何使用它们的问题。
发布于 2013-04-22 11:24:44
对顶点使用“类”或“类型”是分割顶点的好方法。做:
graph.createKeyIndex("classname",Vertex.class);
graph.getVertices("classname", "User");这是一种非常常见的模式,通常会产生快速查找,尽管迭代数千万用户的索引可能不是很好(如果您打算将特定的classname扩展到非常大的大小)。我认为这就引出了你问题的第二部分,关于做两个属性查找。
以表面上的示例为例,两个元素查找类似于(使用Gremlin):
g.V('classname',"User").has('username','admin')因此,将顶点缩小到只有一个键索引的“用户”顶点,然后为"admin“过滤这些顶点。但是,我会用不同的方式来做这个。这样做的代价就更低了:
graph.createKeyIndex("username",Vertex.class);
graph.getVertices("username", "admin");或者在格里姆林
g.V('username','admin')如果您知道您想要的用户名,就没有更好/更快的方法来建模了。只有当您想对所有“用户”顶点进行迭代时,才真正需要classname。如果您只想找到一个(或使用该username的一组顶点),那么对该属性进行键索引是更好的方法。
即使我没有在它上创建一个关键索引,我仍然在所有顶点上包含一个type或classname属性。我发现它在全球操作中很有帮助,我可能关心速度,也可能不关心速度,但只需要一个答案。
https://stackoverflow.com/questions/16135011
复制相似问题