2013-12-16 26 views
0

我想實現一個查詢和圖形可視化框架,允許用戶輸入一個Gremlin查詢,返回一個D3圖形的結果。 D3圖形使用JSON構建 - 這是使用獨立的頂點邊緣從Gremlin查詢輸出創建的。對於簡單的查詢,如:複雜的Gremlin查詢輸出節點/邊

g.V.filter{it.attr_a == "foo"} 

這工作正常。然而,當我嘗試執行更復雜的查詢,如下列:

g.E.filter{it.attr_a == 'foo'}.groupBy{it.attr_b}{it.outV.value}.cap.next().findAll{k,e->e.size()<=3} 

- Find all instances of *value* 
- Grouped by unique *attr_b* 
- Where *attr_a* = foo 
- And *attr_b* is paired with no more than 2 other instances of *value* 

相反,輸出如下形式:

attr_b1: {value1, value2, value3} 
attr_b2: {value4} 
attr_b3: {value6, value7} 

我想知道是否有一種方法Gremlin將結果輸出爲節點和邊的列表,以便我可以將結果顯示爲圖形。我知道我可以編輯我的D3代碼來接受這個新的輸出,但是目前對查詢的類型/複雜性沒有限制,所以每次鍵/值對不一定是相同的。

謝謝。

回答

1

你已經達到了我認爲可視化Gremlin結果的關鍵問題之一。他們可以是任何東西。 Gremlin結果可能不只是頂點和邊的列表。沒有辦法真正控制這個我能想到的。在一天結束的時候,你只能看到符合D3預期模式的結果。我首先嚐試檢測該模式並僅在這些情況下進行可視化(可能只是將不可識別的模式顯示爲JSON)。你的具體的例子

思維導致這樣的:

attr_b1: {value1, value2, value3} 
attr_b2: {value4} 
attr_b3: {value6, value7} 

,你會想什麼D3可視化呢?遍歷過的頂點/邊緣以獲得結果?如果是這樣,你可能會被卡住。 Gremlin並沒有給你一種反思管道的方式來看看傳遞過來的東西。換句話說,除非用戶明確收集被觸摸的管道內的頂點和邊緣,否則您將無法訪問它們。能夠以這種方式「窺探」管道是很好的事情,但目前情況並非如此。 TinkerPop內部已經進行了內部討論,以創建一種新的管道實現方式,以幫助實現這一目標,但目前尚不存在。

所以,沒有「間諜」的能力,我認爲你唯一的解決方法將是:

  1. 檢測到您的客戶端頂點/邊列表,只渲染那些D3。這會迫使用戶總是編寫以這種格式返回數據的gremlin,如果他們想要可視化的話。把它放在用戶手中。
  2. 可能爲頂點/邊的列表提供服務器端綁定,如果用戶的結果不符合您的可視化引擎的預期效果,那麼用戶可以明確地將它們的頂點/邊進行副作用。再次,如果他們想要可視化,這將迫使用戶根據您的需要適當地編寫他們的gremlin。
+0

感謝您的回覆。在回答你的問題時,我的「值」是節點的屬性,而我的「attr_a」和「attr_b」是邊的屬性,所以本質上我希望D3顯示一個包含所有節點和邊的圖,屬性匹配Gremlin的輸出。我同意Gremlin沒有辦法轉換這個內置的輸出,所以我可能會設計我的查詢,所以「value」的類型總是相同的,並且編寫第二個Gremlin腳本來拉出相關的頂點/第一個輸出的邊緣。 我會發布更新,如果我有任何進展,歡呼聲。 – adaml288