遍历时使用Gremlin查询深度信息

pra*_*tha 3 graph-databases gremlin tinkerpop tinkerpop3 janusgraph

我有一个用例,其中用户位于诸如

user1 --HAS_CHILD-> user2 --HAS_CHILD-> user3 --HAS_CHILD-> user4

对于给定的用户,我需要获得该用户拥有的所有汽车以及该用户的孩子拥有的所有汽车。对于汽车,我需要拥有用户(所有者)以及该用户与给定用户的深度。

例如 给定的用户为user2,则user3的深度为1,user4的深度为2。

我可以使用以下查询获取汽车的详细信息和所有者信息,但如何获取childDepth呢?

g.V().has("User", "id", "user2")
 .union(
    __.out("OWNS").hasLabel("Car"),
    __.repeat(
       __.out("HAS_CHILD").hasLabel("User")
    ).emit().out("OWNS").hasLabel("Car")
 )
 .project("plateNumber", "owner", "model", "year", "childDepth")
 .by(__.values("plateNumber").fold())
 .by(__.in("OWNS").values("owner").fold())
 .by(__.values("model").fold())
 .by(__.values("year").fold())
 .by(???)
Run Code Online (Sandbox Code Playgroud)

noa*_*621 6

您可以使用withSack

g.withSack(0).V().has("User", "id", "user2")
 .union(
    __.out("OWNS").hasLabel("Car"),
    __.repeat(
         __.sack(sum).by(constant(1))
       .out("HAS_CHILD").hasLabel("User")
    ).emit().out("OWNS").hasLabel("Car")
 )
 .project("plateNumber", "owner", "model", "year", "childDepth")
 .by(__.values("plateNumber").fold())
 .by(__.in("OWNS").values("owner").fold())
 .by(__.values("model").fold())
 .by(__.values("year").fold())
 .by(__.sack())
Run Code Online (Sandbox Code Playgroud)