我使用arangodb tinkerpop提供程序(https://github.com/ArangoDB-Community/arangodb-tinkerpop-provider)并创建一个这样的顶点:
graph = GraphFactory.open(conf);
GraphTraversalSource g = gts.clone();
UUID userId1 = UUID.randomUUID();
Vertex vertex1 = graph.addVertex("person");
vertex1.property("uid", userId1);
一切正常,我发现可以使用此gremlin查询找到我的起始顶点:
System.out.println(g.V().has("uid", userId1).properties().toList());
现在,我有两个问题:
1)是否可以通过索引搜索所有顶点属性,或者我可以为此属性创建索引?
2)在集合中(来自ArangoDb的Web UI)我没有看到我的属性-要查看属性,我需要查看* _ELEMENT-PROPERTIES-还有另一种可能性可以查看集合视图中的属性?
感谢您的帮助。 马塞尔
答案 0 :(得分:2)
我将首先回答问题2,因为这将帮助我解决问题1。
2)从概念上讲,Tinkerpop API将顶点属性(和顶点属性的属性)视为图形顶点。因此,API希望顶点属性的行为类似于顶点,并且从顶点到其每个属性的导航都可以模拟由by和edge连接的两个顶点的顶点:
v1 ---> uuid
uuid顶点将保存uuid值的位置。因此,当前实现不将顶点属性存储在顶点文档中,而是存储在单独的文档中(在* _ELEMENT-PROPERTIES集合中)。这种方法的主要驱动力是它大大简化了实现。缺点之一是,正如您提到的,在UI中查看顶点的属性并非一帆风顺:您需要一个查询,而不仅仅是打开顶点的文档。顺便说一句,您可以使用的查询是:
WITH @@vertexlabel
FOR v, e
IN OUTBOUND @startrVertexID
@@propertiesEdge
RETURN {"name": v.key, "value": v.value}
您可以在其中提供所需的顶点标签/集合,感兴趣的顶点ID和适当的 propertiesEdge 集合名称(即* _ELEMENT-PROPERTIES)。
1)当前属性不允许为特定属性提供索引,因为属性存储为文档,因此我们不能将其用作索引。如camba1所述,ArangoDB自动在文档中为_key编制索引,因此,如果要确保基于特定属性的搜索是基于索引的,则可以使用自定义键值。通过提供自定义ID使用自定义_key值。请注意,arangodb-tinkerpop-provider仅支持字符串类型(带有一些caveats)的自定义顶点/边缘/属性ID。因此,在您的情况下,您可以使用UUID作为顶点的ID:
graph = GraphFactory.open(conf);
GraphTraversalSource g = gts.clone();
UUID userId1 = UUID.randomUUID();
Vertex vertex1 = graph.addVertex("person").properties(T.id, userId1.toString());
然后您可以通过ID(将被索引)找到该顶点;
System.out.println(g.V("*_vertex/" + userId1).properties().toList());
(请注意,您需要用我们的图形名称替换*。)
当前打开了一个用于更改属性存储的错误:Issue 38,我已经开始研究可能的解决方案,您可以在该错误注释中找到详细信息。请随时提出任何想法!
感谢您使用提供商!