簡體   English   中英

有沒有辦法優化這個 Gremlin 查詢?

[英]Is there a way to optimize this Gremlin query?

我有一個圖形數據庫,看起來像這樣(簡化)圖:

圖表圖

每個唯一 ID 都有許多屬性,這些屬性表示為從 ID 到該屬性唯一值的邊。 基本上這意味着如果兩個 ID 節點具有相同的 email,那么它們的has_email邊都將指向同一個節點。 在圖中,顯示的兩個 ID 共享名字和姓氏。

對於給定的一組“匹配規則”,我很難編寫有效的 Gremlin 查詢來查找匹配的 ID。 匹配規則將包含一組屬性,這些屬性必須全部相同,才能將 ID 視為來自同一個人。 我目前用來根據名字、姓氏和 email 匹配人的查詢如下所示:

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步驟是問題所在,但到目前為止我一直在努力尋找沒有運氣的替代方案。

此查詢的性能將取決於圖形中的邊緣度數。 由於許多人共享相同的名字,您很可能會有大量的邊進入特定的firstName頂點。 您可以做出假設,例如:同姓的人比同名的人少。 當然,共享同一個 email 地址的人應該更少。 有了這些知識,您就可以先開始遍歷度數最低的頂點,然后從那里過濾:

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")))

這樣一來,性能將主要取決於邊緣度數最低的頂點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM