合并顶点,包括属性和 incoming/outgoing 边
Merge vertices, including properties and incoming/outgoing edges
如何合并顶点,包括它们的 incoming/outgoing 边 和 它们的属性?我使用了这个 answer 并且它 几乎 正是我所希望的,但是如果两个顶点具有相同的 属性,那么只有其中一个可以得到结果联合顶点。我想将此 属性 作为列表获取,就像将 属性 添加到已经具有此类 属性.
的顶点时发生的情况
示例场景:
g.V().has("author","book_id", 987).fold().
coalesce(unfold(),
addV("author").property("book_id", 987))
g.V().hasLabel("author").has("book_id",987).property("author_id",123)
g.V().has("author","book_id", 654).fold().
coalesce(unfold(),
addV("author").property("book_id", 654))
g.V().hasLabel("author").has("book_id",654).property("author_id",123)
在这 4 个查询之后,我们将得到 2 个 author_id=123
的顶点。
使用此查询(如答案中的建议)合并它们:
g.V().has("author", "author_id", 123).fold().filter(count(local). is (gt(1))).unfold().
sideEffect(properties().group("p").by(key).by(value())).
sideEffect(outE().group("o").by(label).by(project("p", "iv").by(valueMap()).by(inV()).fold())).
sideEffect(inE().group("i").by(label).by(project("p", "ov").by(valueMap()).by(outV()).fold())).
sideEffect(drop()).
cap("p", "o", "i").as("poi").
addV("author").as("a").
sideEffect(
select("poi").select("p").unfold().as("kv").
select("a").property(select("kv").select(keys), select("kv").select(values))).
sideEffect(
select("poi").select("o").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).
from
(select("a")).to(select("iv"))).
sideEffect(
select("poi").select("i").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).
from
(select("ov")).to(select("a"))).iterate()
将按预期产生单个顶点,但 valueMap 显示它只有 book_id
之一作为 属性:
{'book_id': [654], 'author_id': [123]}
我怎样才能同时保留两者?如:
{'book_id': [654,987], 'author_id': [123]}
我找到了一个解决方案,它有点笨拙但有效(很高兴得到更好的答案):
在查询的第二行,我替换了“by”顺序,因此我不是为每个键获取单个值,而是为每个值获取一个键。
sideEffect(properties().group("p").by(value).by(key()).unfold()).
然后在将此属性分配给新顶点时,我使用键作为值,反之亦然
sideEffect(
select("poi").select("p").unfold().as("kv").
select("a").property(select("kv").select(values), select("kv").select(keys))).
完整查询:
g.V().has("author", "author_id", 123).fold().filter(count(local). is (gt(1))).unfold().
sideEffect(properties().group("p").by(value).by(key()).unfold()).
sideEffect(outE().group("o").by(label).by(project("p", "iv").by(valueMap()).by(inV()).fold())).
sideEffect(inE().group("i").by(label).by(project("p", "ov").by(valueMap()).by(outV()).fold())).
sideEffect(drop()).
cap("p", "o", "i").as("poi").
addV("author").as("a").
sideEffect(
select("poi").select("p").unfold().as("kv").
select("a").property(select("kv").select(values), select("kv").select(keys))).
sideEffect(
select("poi").select("o").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).
from
(select("a")).to(select("iv"))).
sideEffect(
select("poi").select("i").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).
from
(select("ov")).to(select("a"))).iterate()
编辑:在此处添加一个完整的查询,其中包含对边缘进行重复数据删除的另一部分
g.V().has("author","author_id", 123).
fold().filter(count(local).is(gt(1))).unfold().
sideEffect(properties().group("p").by(key).by(value())).
sideEffect(outE().group("o").by(label).by(project("p","iv").by(valueMap()).by(inV()).fold())).
sideEffect(inE().group("i").by(label).by(project("p","ov").by(valueMap()).by(outV()).fold())).
sideEffect(drop()).
cap("p","o","i").as("poi").
addV("author").as("a").
sideEffect(
select("poi").select("p").unfold().as("kv").
select("a").property(select("kv").select(keys), select("kv").select(values))).
sideEffect(
select("poi").select("o").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).from(select("a")).to(select("iv"))).
sideEffect(
select("poi").select("i").unfold().as("x").select(values).
unfold().addE(select("x").select(keys))
.from(select("ov")).to(select("a")))
.sideEffect(select("a").outE().as("e").outV().id().as("final_ov").
select("e").inV().id().as("final_iv").
select("e", "final_ov", "final_iv").
group().
by(select("final_ov", "final_iv")).
by(select("e")).
select(values)
.store("unique_e")).
select("a")
.outE()
.where(without("unique_e"))
.drop()
如何合并顶点,包括它们的 incoming/outgoing 边 和 它们的属性?我使用了这个 answer 并且它 几乎 正是我所希望的,但是如果两个顶点具有相同的 属性,那么只有其中一个可以得到结果联合顶点。我想将此 属性 作为列表获取,就像将 属性 添加到已经具有此类 属性.
的顶点时发生的情况示例场景:
g.V().has("author","book_id", 987).fold().
coalesce(unfold(),
addV("author").property("book_id", 987))
g.V().hasLabel("author").has("book_id",987).property("author_id",123)
g.V().has("author","book_id", 654).fold().
coalesce(unfold(),
addV("author").property("book_id", 654))
g.V().hasLabel("author").has("book_id",654).property("author_id",123)
在这 4 个查询之后,我们将得到 2 个 author_id=123
的顶点。
使用此查询(如答案中的建议)合并它们:
g.V().has("author", "author_id", 123).fold().filter(count(local). is (gt(1))).unfold().
sideEffect(properties().group("p").by(key).by(value())).
sideEffect(outE().group("o").by(label).by(project("p", "iv").by(valueMap()).by(inV()).fold())).
sideEffect(inE().group("i").by(label).by(project("p", "ov").by(valueMap()).by(outV()).fold())).
sideEffect(drop()).
cap("p", "o", "i").as("poi").
addV("author").as("a").
sideEffect(
select("poi").select("p").unfold().as("kv").
select("a").property(select("kv").select(keys), select("kv").select(values))).
sideEffect(
select("poi").select("o").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).
from
(select("a")).to(select("iv"))).
sideEffect(
select("poi").select("i").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).
from
(select("ov")).to(select("a"))).iterate()
将按预期产生单个顶点,但 valueMap 显示它只有 book_id
之一作为 属性:
{'book_id': [654], 'author_id': [123]}
我怎样才能同时保留两者?如:
{'book_id': [654,987], 'author_id': [123]}
我找到了一个解决方案,它有点笨拙但有效(很高兴得到更好的答案):
在查询的第二行,我替换了“by”顺序,因此我不是为每个键获取单个值,而是为每个值获取一个键。
sideEffect(properties().group("p").by(value).by(key()).unfold()).
然后在将此属性分配给新顶点时,我使用键作为值,反之亦然
sideEffect(
select("poi").select("p").unfold().as("kv").
select("a").property(select("kv").select(values), select("kv").select(keys))).
完整查询:
g.V().has("author", "author_id", 123).fold().filter(count(local). is (gt(1))).unfold().
sideEffect(properties().group("p").by(value).by(key()).unfold()).
sideEffect(outE().group("o").by(label).by(project("p", "iv").by(valueMap()).by(inV()).fold())).
sideEffect(inE().group("i").by(label).by(project("p", "ov").by(valueMap()).by(outV()).fold())).
sideEffect(drop()).
cap("p", "o", "i").as("poi").
addV("author").as("a").
sideEffect(
select("poi").select("p").unfold().as("kv").
select("a").property(select("kv").select(values), select("kv").select(keys))).
sideEffect(
select("poi").select("o").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).
from
(select("a")).to(select("iv"))).
sideEffect(
select("poi").select("i").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).
from
(select("ov")).to(select("a"))).iterate()
编辑:在此处添加一个完整的查询,其中包含对边缘进行重复数据删除的另一部分
g.V().has("author","author_id", 123).
fold().filter(count(local).is(gt(1))).unfold().
sideEffect(properties().group("p").by(key).by(value())).
sideEffect(outE().group("o").by(label).by(project("p","iv").by(valueMap()).by(inV()).fold())).
sideEffect(inE().group("i").by(label).by(project("p","ov").by(valueMap()).by(outV()).fold())).
sideEffect(drop()).
cap("p","o","i").as("poi").
addV("author").as("a").
sideEffect(
select("poi").select("p").unfold().as("kv").
select("a").property(select("kv").select(keys), select("kv").select(values))).
sideEffect(
select("poi").select("o").unfold().as("x").select(values).
unfold().addE(select("x").select(keys)).from(select("a")).to(select("iv"))).
sideEffect(
select("poi").select("i").unfold().as("x").select(values).
unfold().addE(select("x").select(keys))
.from(select("ov")).to(select("a")))
.sideEffect(select("a").outE().as("e").outV().id().as("final_ov").
select("e").inV().id().as("final_iv").
select("e", "final_ov", "final_iv").
group().
by(select("final_ov", "final_iv")).
by(select("e")).
select(values)
.store("unique_e")).
select("a")
.outE()
.where(without("unique_e"))
.drop()