让我们开始创建你的样品图中:
gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV("person").property("name", "Person A").as("pa").
......1> addV("person").property("name", "Person B").as("pb").
......2> addV("food").property("name", "Hamburgers").as("hb").
......3> addV("food").property("name", "Chips").as("c").
......4> addV("food").property("name", "Cheeseburgers").as("cb").
......5> addV("food").property("name", "Fries").as("f").
......6> addV("category").property("name", "Burgers").as("b").
......7> addV("category").property("name", "Appetizers").as("a").
......8> addE("most").from("pa").to("hb").
......9> addE("most").from("pb").to("cb").
.....10> addE("least").from("pa").to("c").
.....11> addE("least").from("pb").to("f").
.....12> addE("similar").from("hb").to("b").
.....13> addE("similar").from("cb").to("b").
.....14> addE("similar").from("c").to("a").
.....15> addE("similar").from("f").to("a").iterate()
查询,你要找的,是下面的(我会解释每一步后):
gremlin> g.V().has("person", "name", "Person A").as("p").
......1> outE("most","least","refuses").as("e").inV().out("similar").
......2> store("x").by(constant(1)).
......3> in("similar").inE().where(eq("e")).by(label).outV().where(neq("p")).
......4> groupCount().as("m").
......5> select("x").by(count(local)).as("c").
......6> select("m").unfold().
......7> where(select(values).as("c")).select(keys).values("name")
==>Person B
现在,当我们添加了“拒绝吃苹果”的关系:
gremlin> g.V().has("person", "name", "Person A").as("p").
......1> addV("food").property("name", "Apples").as("a").
......2> addV("category").property("name", "Fruits").as("f").
......3> addE("refuses").from("p").to("a").
......4> addE("similar").from("a").to("f").iterate()
...某乙不再是比赛:
gremlin> g.V().has("person", "name", "Person A").as("p").
......1> outE("most","least","refuses").as("e").inV().out("similar").
......2> store("x").by(constant(1)).
......3> in("similar").inE().where(eq("e")).by(label).outV().where(neq("p")).
......4> groupCount().as("m").
......5> select("x").by(count(local)).as("c").
......6> select("m").unfold().
......7> where(select(values).as("c")).select(keys).values("name")
gremlin>
让我们通过查询步步/逐行:
g.V().has("person", "name", "Person A").as("p").
这应该是很清楚的:开始在人A.
outE("most","least","refuses").as("e").inV().out("similar").
遍历出边和设置一个标记,以便我们可以稍后参考边缘。然后遍历我所谓的category
顶点。
store("x").by(constant(1)).
每category
顶点添加1
到内部集合。您也可以存储顶点本身,但这会浪费内存,因为我们不需要顶点的任何信息。
in("similar").inE().where(eq("e")).by(label).outV().where(neq("p")).
导线沿similar
边缘到food
,然后沿着那些具有相同的标签从开始时的标记边缘的边缘向另一方向。最后忽略遍历开始的人(人A)。
groupCount().as("m").
计算使它到达每个人顶点的遍历器的数量。
select("x").by(count(local)).as("c").
计数的Category
顶点(该1
或多个)的数量。
select("m").unfold().
展开的人专柜,所以按键会的人顶点和值将是它做出这个顶点traversers的数量。
where(select(values).as("c")).select(keys).values("name")
最终越过category
顶点的数量必须在person
顶点traversers的数量相匹配。如果是这样的话,我们有一场比赛。
注意,它是需要有一个similar
边缘入射到Apples
顶点。
仍在研究...也许一个匹配步骤可以工作?需要做一些实验。 – Mike
苹果没有'similarTo'边缘。这是否意味着它总是可选的? –