【问题标题】:ArangoDb Tinkerpop created vertex - how to index custom propertiesArangoDb Tinkerpop 创建了顶点 - 如何索引自定义属性
【发布时间】:2019-03-04 22:58:52
【问题描述】:

我使用 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 - 还有其他可能查看集合视图中的属性?

感谢您的帮助。 马塞尔

【问题讨论】:

  • Arango 默认在 _key 上创建一个索引,可用于查找,但您可以根据需要创建自己的索引。您可以直接在 web ui 中执行此操作。在数字 2 上,您应该能够在 web ui 中看到您的数据。您的程序是否可能正在缓存数据并且需要执行额外的步骤来将数据提交到 dB?
  • 感谢您的回答。对于第一个,我使用 ArangoDBConfigurationBuilder 并且无法为图形“数据库”创建索引。数据已提交,我可以在集合 graph_ELEMENT-PROPERTIES 中看到属性,但在集合 graph_person 中看不到。

标签: arangodb


【解决方案1】:

我将首先回答问题 2,因为这将帮助我解决问题 1。

2) 从概念上讲,Tinkerpop API 将顶点属性(和顶点属性的属性)视为图顶点。因此,API 期望顶点属性的行为类似于顶点,并且从顶点到其每个属性的导航模拟通过边连接的两个顶点:

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 仅支持字符串类型的自定义顶点/边/属性 ID(带有一些 caveats)。因此,在您的情况下,您可以使用 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,我已经开始研究可能的解决方案,您可以在错误 cmets 中找到详细信息。请随时提出任何想法!

感谢您使用提供者!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2017-04-25
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多