簡體   English   中英

TinkerPop / Graph:遍歷邊緣,然后按結果頂點和遍歷的邊緣分組

[英]TinkerPop/Graph: Traverse edge and then group by resulting vertex and traversed edge

給出以下示例:

marko = graph.addVertex(label, "person", id, 1, "name", "marko", "age", 29);
vadas = graph.addVertex(label, "person", id, 2, "name", "vadas", "age", 27);
josh = graph.addVertex(label, "person", id, 4, "name", "josh", "age", 32);
peter = graph.addVertex(label, "person", id, 5, "name", "peter", "age", 35);
lop = graph.addVertex(label, "software", id, 6, "name", "lop", "lang", "java");
ripple = graph.addVertex(label, "software", id, 7, "name", "ripple", "lang", "java");
tripple = graph.addVertex(label, "software", id, 8, "name", "tripple", "lang", "java");

marko.addEdge("created", lop, id, 9, "weight", 0.4f);
josh.addEdge("created", ripple, id, 10, "weight", 1.0f);
josh.addEdge("created", lop, id, 11, "weight", 0.4f);
peter.addEdge("created", lop, id, 12, "weight", 0.2f);
peter.addEdge("created", tripple, id, 13, "weight", 0.2f);
vadas.addEdge("created", tripple, id, 14, "weight", 0.2f);

我想從軟件頂點lop和漣漪開始,找到所有創建lop和漣漪且年齡大於32的人。然后我要按人分組並在lop和漣漪上創建體重。

因此,我創建了一些可以給我帶來結果的東西,但是看起來卻很復雜:

g.V(6,7).as('soft').
in('created').has('age',gte(32)).
group()
by()
by(
  outE().where(
    inV().where(eq('soft'))
  ).fold())
.unfold()

==>v[4]=[e[11][4-created->6], e[10][4-created->7]]
==>v[5]=[e[12][5-created->6]]

另外,我希望最終結果具有與此類似的結構(對不起,如果我沒有正確使用語法):

==>v[4,person,josh,32]=[lop=0.4, ripple=1.0]
==>v[5,person,peter,35]=[lop=0.2]

因此,我需要一個完整的人頂點及其所有內容以及所有導致垂落和波紋的邊的列表。

json表示形式如下:

[{
        "id": 4,
        "label": "person",
        "name": "josh",
        "age": "32",
        "software": [{
                "name": "lop",
                "weigth": 0.4
            },
            {
                "name": "ripple",
                "weigth": 1.0
            }
        ]
    },
    {
        "id": 5,
        "label": "person",
        "name": "peter",
        "age": "35",
        "software": [{
            "name": "lop",
            "weigth": 0.2
        }]
    }
]

有趣的問題。 我認為更復雜的部分是轉換為所需的形式,而不是實際的數據檢索。 您的檢索方法很好,盡管我這樣寫:

gremlin> g.V(6,7).
......1>   inE('created').as('e').outV().has('age',gte(32)).as('p').
......2>   group().
......3>    by(select('p')).
......4>    by(select('e').fold()).
......5>   unfold()
==>v[4]=[e[11][4-created->6], e[10][4-created->7]]
==>v[5]=[e[12][5-created->6]]

我認為這更容易閱讀,因為很明顯,您是從遍歷路徑中選擇這些元素然后對它們進行操作,而不是使用遍歷路徑中的元素進行過濾。 但是,是否更好還值得商bat。 看到另一種獲得此初始輸出的方法並不令我感到驚訝,但這是我首先想到的。

真正的問題是如何將輸出轉換為您要求的預期形式,為此,我采用了這種方法:

gremlin> g.V(6,7).
......1>   inE('created').as('e').outV().has('age',gte(32)).as('p').
......2>   group().
......3>    by(select('p')).
......4>    by(select('e').fold()).
......5>   unfold().
......6>   project('id','label','name','age','software').
......7>     by(select(keys).id()).
......8>     by(select(keys).label()).
......9>     by(select(keys).values('name')).
.....10>     by(select(keys).values('age')).
.....11>     by(select(values).
.....12>        unfold().
.....13>        project('name','weight'). 
.....14>          by(inV().values('name')).
.....15>          by('weight').
.....16>        fold())
==>[id:4,label:person,name:josh,age:32,software:[[name:lop,weight:0.4],[name:ripple,weight:1.0]]]
==>[id:5,label:person,name:peter,age:35,software:[[name:lop,weight:0.2]]]

我只是使用project()將“人”頂點和邊列表的展開Map轉換為所需的結構。 請注意該project()的最終by() ,因為它需要其自己的嵌入式project()來處理原始Map值中展開的邊列表。 關鍵是將fold()轉換后的邊放回List以便它們全部被考慮(否則by()將只處理第一個)。

您可以在Gremlin食譜中閱讀有關集合操作的更多信息。

暫無
暫無

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

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