graph-databases - 有没有办法优化这个 Gremlin 查询?

标签 graph-databases gremlin amazon-neptune

我有一个图形数据库,它看起来像这个(简化的)图:

Graph diagram

每个唯一 ID 都有许多属性,这些属性表示为从 ID 到该属性的唯一值的边。基本上这意味着如果两个 ID 节点具有相同的电子邮件,那么它们的 has_email边都指向同一个节点。在图中,两个显示的 ID 共享一个名字和一个姓氏。

对于一组给定的“匹配规则”,我很难编写有效的 Gremlin 查询来查找匹配的 ID。匹配规则将由一组属性组成,这些属性必须全部相同才能将 ID 视为来自同一个人。我目前用于根据名字、姓氏和电子邮件匹配人员的查询如下所示:

g.V().match(
    __.as("id").hasId("some_id"),
    __.as("id")
        .out("has_firstName")
        .in("has_firstName")
        .as("firstName"),
    __.as("id")
        .out("has_lastName")
        .in("has_lastName")
        .as("lastName"),
    __.as("id")
        .out("has_email")
        .in("has_email")
        .as("email"),
    where("firstName", eq("lastName")),
    where("firstName", eq("email")),
    where("firstName", neq("id"))
).select("firstName")

查询返回与输入 some_id 匹配的 ID 列表.

当此查询尝试将 ID 与特别常见的名字匹配时,它会变得非常非常缓慢。我怀疑 match step 是问题所在,但到目前为止,我一直在努力寻找替代方案,但运气不佳。

最佳答案

此查询的性能将取决于图中的边缘度数。由于许多人拥有相同的名字,因此您很可能会在进入特定的 firstName 时拥有大量优势。顶点。
您可以做出假设,例如:姓氏相同的人比名字相同的人少。当然,共享同一电子邮件地址的人应该更少。有了这些知识,您就可以开始遍历具有最低度数的顶点,然后从那里进行过滤:

g.V().hasId("some_id").as("id").
  out("has_email").in("has_email").where(neq("id")).
  filter(out("has_lastName").where(__.in("has_lastName").as("id"))).
  filter(out("has_firstName").where(__.in("has_firstName").as("id")))

这样,性能将主要取决于边缘度最低的顶点。

关于graph-databases - 有没有办法优化这个 Gremlin 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58801081/

相关文章:

nosql - 可嵌入的 GraphDB?

graph-databases - 在 ArangoDB 中以编程方式创建边

Gremlin > 递归查找由边类型连接的节点

java - 有条件地中断 java-gremlin 更新遍历,并显示错误消息

java - 使用现有数据集执行 Neo4j Cypher 查询(通过 Java)

graph-databases - 用于构建JanusGraph DB的GUI

c# - 是否可以使用 C# 代码创建新的 Gremlin Graph DB 和 Graph

python - 获取边的开始节​​点和结束节点 id,没有 map step() gremline for neptune

java - gremlin中的Join查询,分组结果形成一对多关系

graph-databases - 如何添加列表作为顶点或边 gremlin 的属性