簡體   English   中英

Gremlin - 在節點和邊屬性上查找具有多個 boolean 條件的連接節點

[英]Gremlin - finding connected nodes with several boolean conditions on both nodes and edges properties

我想找到應該鏈接到給定節點的節點,其中鏈接由一些邏輯定義,該邏輯使用節點和現有邊的屬性,邏輯如下:

A)(該對具有相同的 zip(節點屬性)和 name_similarity(邊緣屬性)> 0.3 或

B) 該對具有不同的 zip 並且 name_similarity > 0.5 或

C)該對具有邊緣類型“external_info”,值為“connect”)

D)AND(該對沒有帶有“external info”的邊緣類型,值為“disconnect”)

簡而言之:(A | B | C) & (~D)

我仍然是 gremlin 的新手,所以我不確定如何在邊和節點上組合多個條件。

以下是創建圖表的代碼,以及該圖表的預期結果:

# creating nodes

(g.addV('person').property('name', 'A').property('zip', '123').
addV('person').property('name', 'B').property('zip', '123').
addV('person').property('name', 'C').property('zip', '456').
addV('person').property('name', 'D').property('zip', '456').
addV('person').property('name', 'E').property('zip', '123').
addV('person').property('name', 'F').property('zip', '999').iterate())

node1 = g.V().has('name', 'A').next()
node2 = g.V().has('name', 'B').next()
node3 = g.V().has('name', 'C').next()
node4 = g.V().has('name', 'D').next()
node5 = g.V().has('name', 'E').next()
node6 = g.V().has('name', 'F').next()

# creating name similarity edges

g.V(node1).addE('name_similarity').from_(node1).to(node2).property('score', 1).next() # over threshold
g.V(node1).addE('name_similarity').from_(node1).to(node3).property('score', 0.2).next() # under threshold
g.V(node1).addE('name_similarity').from_(node1).to(node4).property('score', 0.4).next() # over threshold
g.V(node1).addE('name_similarity').from_(node1).to(node5).property('score', 1).next() # over threshold
g.V(node1).addE('name_similarity').from_(node1).to(node6).property('score', 0).next() # under threshold

# creating external output edges

g.V(node1).addE('external_info').from_(node1).to(node5).property('decision', 'connect').next() 
g.V(node1).addE('external_info').from_(node1).to(node6).property('decision', 'disconnect').next() 

預期的 output - 對於輸入節點 A - 是節點 B(由於條件 A)、D(由於條件 B)和 F(由於條件 C)。 由於條件 D,節點 E 不應鏈接。

我正在尋找將檢索這些結果的 Gremlin 查詢。

鑒於您期望的 output,您的數據似乎有問題,因此我不得不進行更正:

  • 頂點 D 不會出現在結果中,因為“分數”小於 0.5
  • “external_info”邊緣似乎顛倒了

這是我使用的數據:

g.addV('person').property('name', 'A').property('zip', '123').
addV('person').property('name', 'B').property('zip', '123').
addV('person').property('name', 'C').property('zip', '456').
addV('person').property('name', 'D').property('zip', '456').
addV('person').property('name', 'E').property('zip', '123').
addV('person').property('name', 'F').property('zip', '999').iterate()
node1 = g.V().has('name', 'A').next()
node2 = g.V().has('name', 'B').next()
node3 = g.V().has('name', 'C').next()
node4 = g.V().has('name', 'D').next()
node5 = g.V().has('name', 'E').next()
node6 = g.V().has('name', 'F').next()
g.V(node1).addE('name_similarity').from(node1).to(node2).property('score', 1).next() 
g.V(node1).addE('name_similarity').from(node1).to(node3).property('score', 0.2).next() 
g.V(node1).addE('name_similarity').from(node1).to(node4).property('score', 0.6).next() 
g.V(node1).addE('name_similarity').from(node1).to(node5).property('score', 1).next() 
g.V(node1).addE('name_similarity').from(node1).to(node6).property('score', 0).next() 
g.V(node1).addE('external_info').from(node1).to(node6).property('decision', 'connect').next() 
g.V(node1).addE('external_info').from(node1).to(node5).property('decision', 'disconnect').next() 

我采用了以下方法:

gremlin> g.V().has('person','name','A').as('a').
......1>   V().as('b').
......2>   where('a',neq('b')).
......3>   or(where('a',eq('b')).                                                    // A
......4>        by('zip').
......5>      bothE('name_similarity').has('score',gt(0.3)).otherV().where(eq('a')), 
......6>      bothE('name_similarity').has('score',gt(0.5)).otherV().where(eq('a')), // B
......7>      bothE('external_info').                                                // C
......8>        has('decision','connect').otherV().where(eq('a'))).
......9>   filter(__.not(bothE('external_info').                                     // D
.....10>                 has('decision','disconnect').otherV().where(eq('a')))).
.....11>   select('a','b').
.....12>    by('name')
==>[a:A,b:B]
==>[a:A,b:D]
==>[a:A,b:F]

我認為這包含您正在尋找的所有邏輯,但我沒有花很多時間優化它,因為我認為任何優化都不會解決V().as('b')的全圖掃描的痛苦V().as('b') ,所以要么你的情況涉及一個相對較小的圖(也許在內存中),這個查詢將起作用,或者你需要一起找到另一種方法。 也許您有進一步限制“b”的方法,這可能會有所幫助? 如果沿着這些思路可行,我可能會嘗試更好地定義邊緣遍歷的方向性以避免bothE()而是限制為outE()inE() ,這將擺脫otherV() 希望您使用允許以頂點為中心的索引的圖形,這也可以加快“分數”上的邊緣查找(不確定這是否會對“決策”有很大幫助,因為它的選擇性很低)。

暫無
暫無

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

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