我一直在研究Tinkerpop堆栈。我想我很清楚它能做什么以及它适用的数据库。我现在有几个不同的数据库,但是还没有确定。所以我决定将我的代码纯粹写入接口,而不是立即考虑任何实现。在我正在查看的数据库中,他们实现了TransactionalGraph
和KeyIndexableGraph
。我认为这对我所需要的已经足够了,但我只有一个问题。
我有不同的'类'顶点。使用蓝图,我相信通过在每个包含类名的顶点中包含一个字段来表示最佳。这样做,我可以做graph.getVertices("classname", "User")
这样的事情,它会给我所有的用户顶点。由于getVertices
函数指定实现应该使用索引,因此我保证快速查找(如果我索引该字段)。
但是,我想说我想根据两个属性检索一个顶点。顶点必须为className=Users
和username=admin
。寻找单个顶点的最佳方法是什么?是否有可能对这两个属性进行索引,即使并非所有顶点都有username
字段?
仅供参考 - 我目前正在考虑的数据库是OrientDB,Neo4j和Titan,但我尚未确定。我现在也计划使用Gremlin,如果这有帮助的话。
答案 0 :(得分:4)
对顶点使用“类”或“类型”是分割它们的好方法。这样做的:
graph.createKeyIndex("classname",Vertex.class);
graph.getVertices("classname", "User");
是一种非常常见的模式,通常应该产生快速查找,尽管迭代数千万用户的索引可能不是那么好(如果您打算将特定classname
增长到非常大的大小)。我认为这导致了你的问题的第二部分,关于做两个属性查找。
在表面上举例,两个元素查找就像(使用Gremlin):
g.V('classname',"User").has('username','admin')
因此,您使用键索引将顶点缩小到“User”顶点,然后对“admin”进行过滤。但是,我的模型不同。简单地做它会更便宜:
graph.createKeyIndex("username",Vertex.class);
graph.getVertices("username", "admin");
或在Gremlin:
g.V('username','admin')
如果你知道你想要的用户名,那就没有更好/更快的方法来建模。如果要迭代所有“用户”顶点,则实际上只需要classname
。如果您只想找到一个(或一组带有username
的顶点),那么对该属性进行键索引是更好的方法。
即使我没有在其上创建密钥索引,我仍然在所有顶点上包含type
或classname
属性。我发现它对全球运营有帮助,我可能会或可能不关心速度,但只需要一个答案。
答案 1 :(得分:3)
graph.getVertices()
将迭代所有顶点并查找具有该属性的顶点,如果您没有在图形实现中启用自动索引。如果您已有数据并且无法启用自动索引器,则应使用index = indexableGraph.getIndex()
然后使用index.get('classname', 'User')
可以对多个对象执行query
,但没有具体细节,很难说。对于Neo4j
,他们使用Lucene,这意味着query()
将采用lucene查询,例如className:Users AND username:admin
,但我无法代替其他人。
这些数据库是否适合玩,我个人认为neo4j
是最简单的,只要您了解他们的许可结构,您就不应该使用它们。