[英]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.