Gremlin 查询优化,从“路径”步骤中删除冗余数据

问题描述 投票:0回答:1

我有

person
顶点和
book
顶点,由
owns
边连接(即
person
=>
owns
=>
book
)。一个人可以拥有多本书。

假设我有以下顶点和边,这表明汤姆拥有 2 本书,杰瑞拥有 1 本书:

{label=person, id=person_1, name=Tom, age=30}
{label=person, id=person_2, name=Jerry, age=40}
{label=book, id=book_1, name=Book1}
{label=book, id=book_2, name=Book2}
{label=book, id=book_3, name=Book3}

person_1 => owns => book_1
person_1 => owns => book_2
person_2 => owns => book_3

我可以通过以下 Gremlin 查询(在 Java 代码中)获取哪些书属于谁:

g.V("person_1", "person_2").outE("owns").inV().path().by(__.valueMap().with(WithOptions.tokens)).toStream().forEach(path -> {
    int size = path.size();
    for (int counter = 0; counter < size; counter++) {
        Map<Object, Object> object = path.get(counter);
        System.out.println(counter + ": " + object);
    }
});

输出是

0: {id=person_1, label=person, name=[Tom], age=[30]}
1: {id=123, label=owns}
2: {id=book_1, label=book, name=[Book1]}
0: {id=person_1, label=person, name=[Tom], age=[30]}   <--------- not surprise, it is same as the first row
1: {id=456, label=owns}
2: {id=book_2, label=book, name=[Book2]}
0: {id=person_2, label=person, name=[Jerry], age=[40]}
1: {id=789, label=owns}
2: {id=book_3, label=book, name=[Book3]}
对于同一个人拥有的书籍,

出站顶点(

person
顶点)始终相同。是否增加了 Neptune 检索冗余数据的开销,或者是否增加了序列化的额外成本?假设我有10个人,每个人拥有100本书。我认为 dedupe 在这里没有帮助。

如何优化查询?

gremlin graph-databases amazon-neptune
1个回答
0
投票

序列化不必要的边缘标签数据会产生一点开销。您可以通过将查询的第一部分编写为以下方式来简单地从结果中删除边缘标签:

g.V("person_1", "person_2").out("owns").path()
© www.soinside.com 2019 - 2024. All rights reserved.