Gremlin 查询如何比较遍历同一分支中边的属性?
Gremlin query how to compare properties of edges in same branch of my traversal?
我正在努力编写一个 gremlin 查询,该查询将我遍历的给定分支的每个边的值与彼此和提供的值进行比较。
这是一个例子 - 假设我有以下由 Schools
、Teams
和 Athletes
组成的层次结构,其中任何一个都可以连接到 Uniform
通过 wears
边。并且假设我在名为 created
的边中将每个边的创建日期记录为 属性。在任何可能的分支中,例如以蓝色突出显示的分支,我需要查询 maximum(wears.created, establishes.created, recruits.created) >= 2009
.
我如何显示运动员自 2009 年以来穿过的每一件制服以及他们开始穿着的日期?
有时,该日期是运动员被招募到团队的年份,有时是学校建立团队的年份,有时是个别运动员、团队或学校开始穿新制服的时间。
我需要一种方法来 select 分支中所有边缘的最大创建日期(如上面蓝色的那个),然后将该最大值与提供的 2009 年日期进行比较。
也许是这样的?在 gremlin 中有这样的可能吗??
g.V().hasLabel("Athlete").as("athlete").union(
__.outE("wears").has("created", P.gte(2009)).as("when").by("created"),
__.inE("recruits").as("r").by("created").outV().hasLabel("Team")
.outE("wears").as("w").by("created")
.select(max("r", "w")).as("when")
.where("when", P.gte(2009))
__.inE("recruits").as("r").by("created").outV().hasLabel("Team")
.inE("establishes").as("e").by("created").outV().hasLabel("School")
.outE("wears").as("w").by("created")
.select(max("r", "e", "w")).as("when")
.where("when", P.gte(2009))
).inV().hasLabel("Uniform").as("uniform")
.select("athlete", "uniform", "when")
<==编辑========================================= ========>
根据 Steven Mallette 的评论添加启动脚本以协助测试。
g.addV('School').property('id',1).property("name", "Duke").as('duke').
addV('School').property('id',2).property("name", "UNC").as('unc').
addV('Team').property('id',3).property("name", "Soccer").as('soccer').
addV('Team').property('id',4).property("name", "Football").as('football').
addV('Team').property('id',5).property("name", "Basketball").as('basketball').
addV('Athlete').property('id',6).property("name", "Joe").as('joe').
addV('Athlete').property('id',7).property("name", "Jane").as('jane').
addV('Athlete').property('id',8).property("name", "Alice").as('alice').
addV('Athlete').property('id',9).property("name", "Bob").as('bob').
addV('Uniform').property('id',10).property("color", "red").as('red').
addV('Uniform').property('id',11).property("color", "pink").as('pink').
addV('Uniform').property('id',12).property("color", "blue").as('blue').
addV('Uniform').property('id',13).property("color", "teal").as('teal').
addV('Uniform').property('id',14).property("color", "green").as('green').
addE('contains').property("created", 2009).from('duke').to('soccer').
addE('contains').property("created", 1960).from('unc').to('football').
addE('contains').property("created", 2007).from('duke').to('basketball').
addE('contains').property("created", 2016).from('soccer').to('bob').
addE('contains').property("created", 2008).from('basketball').to('jane').
addE('contains').property("created", 2010).from('basketball').to('alice').
addE('contains').property("created", 2015).from('football').to('joe').
addE('wears').property("created", 2009).from('duke').to('blue').
addE('wears').property("created", 1999).from('unc').to('red').
addE('wears').property("created", 2010).from('soccer').to('teal').
addE('wears').property("created", 2009).from('football').to('pink').
addE('wears').property("created", 2009).from('basketball').to('teal').
addE('wears').property("created", 2012).from('alice').to('green')
预期输出如下(根据 Daniel Kuppitz 的建议添加输出)。解释输出的第一行:Jane since teal since 2009 因为杜克大学篮球队于 2007 年成立,Jane 于 2008 年加入球队,但篮球队从 2009 年开始穿蓝绿色,因此 2009 年是 Jane 和 Jane 的最大日期这件制服。
Jane wears teal since 2009
Jane wears blue since 2009
Alice wears teal since 2010
Alice wears blue since 2010
Alice wears green since 2012
Joe wears pink since 2015
Joe wears red since 2015
Bob wears blue since 2016
Bob wears teal since 2016
希望在最近的评论之后进行最终编辑(但现在的结果符合您的预期结果,所以我认为我们很好):
gremlin> g.V().hasLabel("Athlete").as("a").
union(outE("wears").sack(assign).by("created"),
inE("contains").sack(assign).by("created").outV().
union(outE("wears").sack(max).by("created"),
inE("contains").sack(max).by("created").outV().
outE("wears").sack(max).by("created"))).
filter(sack().is(gte(2009))).
project("athlete","when","uniform").
by(select("a").by("name")).
by(sack()).
by(inV().values("color"))
==>[athlete:Joe,when:2015,uniform:pink]
==>[athlete:Joe,when:2015,uniform:red]
==>[athlete:Jane,when:2009,uniform:teal]
==>[athlete:Jane,when:2009,uniform:blue]
==>[athlete:Alice,when:2012,uniform:green]
==>[athlete:Alice,when:2010,uniform:teal]
==>[athlete:Alice,when:2010,uniform:blue]
==>[athlete:Bob,when:2016,uniform:teal]
==>[athlete:Bob,when:2016,uniform:blue]
或者,由于您的模式非常统一,您实际上可以使用 repeat()
从而摆脱不可读的嵌套 union()
:
gremlin> g.withSack(0).V().hasLabel("Athlete").as("a").
emit().
repeat(inE("contains").sack(max).by("created").outV()).
times(2).
outE("wears").sack(max).by("created").
filter(sack().is(gte(2009))).
project("athlete","when","uniform").
by(select("a").by("name")).
by(sack()).
by(inV().values("color"))
==>[athlete:Joe,when:2015,uniform:pink]
==>[athlete:Joe,when:2015,uniform:red]
==>[athlete:Jane,when:2009,uniform:teal]
==>[athlete:Jane,when:2009,uniform:blue]
==>[athlete:Alice,when:2012,uniform:green]
==>[athlete:Alice,when:2010,uniform:teal]
==>[athlete:Alice,when:2010,uniform:blue]
==>[athlete:Bob,when:2016,uniform:teal]
==>[athlete:Bob,when:2016,uniform:blue]
我正在努力编写一个 gremlin 查询,该查询将我遍历的给定分支的每个边的值与彼此和提供的值进行比较。
这是一个例子 - 假设我有以下由 Schools
、Teams
和 Athletes
组成的层次结构,其中任何一个都可以连接到 Uniform
通过 wears
边。并且假设我在名为 created
的边中将每个边的创建日期记录为 属性。在任何可能的分支中,例如以蓝色突出显示的分支,我需要查询 maximum(wears.created, establishes.created, recruits.created) >= 2009
.
我如何显示运动员自 2009 年以来穿过的每一件制服以及他们开始穿着的日期?
有时,该日期是运动员被招募到团队的年份,有时是学校建立团队的年份,有时是个别运动员、团队或学校开始穿新制服的时间。
我需要一种方法来 select 分支中所有边缘的最大创建日期(如上面蓝色的那个),然后将该最大值与提供的 2009 年日期进行比较。
也许是这样的?在 gremlin 中有这样的可能吗??
g.V().hasLabel("Athlete").as("athlete").union(
__.outE("wears").has("created", P.gte(2009)).as("when").by("created"),
__.inE("recruits").as("r").by("created").outV().hasLabel("Team")
.outE("wears").as("w").by("created")
.select(max("r", "w")).as("when")
.where("when", P.gte(2009))
__.inE("recruits").as("r").by("created").outV().hasLabel("Team")
.inE("establishes").as("e").by("created").outV().hasLabel("School")
.outE("wears").as("w").by("created")
.select(max("r", "e", "w")).as("when")
.where("when", P.gte(2009))
).inV().hasLabel("Uniform").as("uniform")
.select("athlete", "uniform", "when")
<==编辑========================================= ========>
根据 Steven Mallette 的评论添加启动脚本以协助测试。
g.addV('School').property('id',1).property("name", "Duke").as('duke').
addV('School').property('id',2).property("name", "UNC").as('unc').
addV('Team').property('id',3).property("name", "Soccer").as('soccer').
addV('Team').property('id',4).property("name", "Football").as('football').
addV('Team').property('id',5).property("name", "Basketball").as('basketball').
addV('Athlete').property('id',6).property("name", "Joe").as('joe').
addV('Athlete').property('id',7).property("name", "Jane").as('jane').
addV('Athlete').property('id',8).property("name", "Alice").as('alice').
addV('Athlete').property('id',9).property("name", "Bob").as('bob').
addV('Uniform').property('id',10).property("color", "red").as('red').
addV('Uniform').property('id',11).property("color", "pink").as('pink').
addV('Uniform').property('id',12).property("color", "blue").as('blue').
addV('Uniform').property('id',13).property("color", "teal").as('teal').
addV('Uniform').property('id',14).property("color", "green").as('green').
addE('contains').property("created", 2009).from('duke').to('soccer').
addE('contains').property("created", 1960).from('unc').to('football').
addE('contains').property("created", 2007).from('duke').to('basketball').
addE('contains').property("created", 2016).from('soccer').to('bob').
addE('contains').property("created", 2008).from('basketball').to('jane').
addE('contains').property("created", 2010).from('basketball').to('alice').
addE('contains').property("created", 2015).from('football').to('joe').
addE('wears').property("created", 2009).from('duke').to('blue').
addE('wears').property("created", 1999).from('unc').to('red').
addE('wears').property("created", 2010).from('soccer').to('teal').
addE('wears').property("created", 2009).from('football').to('pink').
addE('wears').property("created", 2009).from('basketball').to('teal').
addE('wears').property("created", 2012).from('alice').to('green')
预期输出如下(根据 Daniel Kuppitz 的建议添加输出)。解释输出的第一行:Jane since teal since 2009 因为杜克大学篮球队于 2007 年成立,Jane 于 2008 年加入球队,但篮球队从 2009 年开始穿蓝绿色,因此 2009 年是 Jane 和 Jane 的最大日期这件制服。
Jane wears teal since 2009
Jane wears blue since 2009
Alice wears teal since 2010
Alice wears blue since 2010
Alice wears green since 2012
Joe wears pink since 2015
Joe wears red since 2015
Bob wears blue since 2016
Bob wears teal since 2016
希望在最近的评论之后进行最终编辑(但现在的结果符合您的预期结果,所以我认为我们很好):
gremlin> g.V().hasLabel("Athlete").as("a").
union(outE("wears").sack(assign).by("created"),
inE("contains").sack(assign).by("created").outV().
union(outE("wears").sack(max).by("created"),
inE("contains").sack(max).by("created").outV().
outE("wears").sack(max).by("created"))).
filter(sack().is(gte(2009))).
project("athlete","when","uniform").
by(select("a").by("name")).
by(sack()).
by(inV().values("color"))
==>[athlete:Joe,when:2015,uniform:pink]
==>[athlete:Joe,when:2015,uniform:red]
==>[athlete:Jane,when:2009,uniform:teal]
==>[athlete:Jane,when:2009,uniform:blue]
==>[athlete:Alice,when:2012,uniform:green]
==>[athlete:Alice,when:2010,uniform:teal]
==>[athlete:Alice,when:2010,uniform:blue]
==>[athlete:Bob,when:2016,uniform:teal]
==>[athlete:Bob,when:2016,uniform:blue]
或者,由于您的模式非常统一,您实际上可以使用 repeat()
从而摆脱不可读的嵌套 union()
:
gremlin> g.withSack(0).V().hasLabel("Athlete").as("a").
emit().
repeat(inE("contains").sack(max).by("created").outV()).
times(2).
outE("wears").sack(max).by("created").
filter(sack().is(gte(2009))).
project("athlete","when","uniform").
by(select("a").by("name")).
by(sack()).
by(inV().values("color"))
==>[athlete:Joe,when:2015,uniform:pink]
==>[athlete:Joe,when:2015,uniform:red]
==>[athlete:Jane,when:2009,uniform:teal]
==>[athlete:Jane,when:2009,uniform:blue]
==>[athlete:Alice,when:2012,uniform:green]
==>[athlete:Alice,when:2010,uniform:teal]
==>[athlete:Alice,when:2010,uniform:blue]
==>[athlete:Bob,when:2016,uniform:teal]
==>[athlete:Bob,when:2016,uniform:blue]