为什么 tinkerpop gremlin 查询中没有返回元素?

Why isn't a element returned in tinkerpop gremlin query?

为什么在 tinkerpop gremlin 查询中没有返回元素 7?

我有一个连接节点和具有状态字段的边的图。

状态是

在我的查询中,我想获取所有连接的节点

这是我样本中的节点和边:

红色边缘被否认(2),虚线未知(0)。

下面是在 gremlin 控制台中创建此图的脚本。

以下查询适用于节点 0:

g.V().
    has('name', eq('0')).
    as('l1').
    repeat(__.
        outE().
        has('State', 1).
        otherV().
        simplePath()
    ).
    emit().
    dedup().
    optional(__.
        as('l2').
        union(
            __.identity(),
            __.select('l1')
        ).
        outE().
        has('State', 2).
        otherV().
        optional(__.
            as('l3').
            repeat(__.
                bothE().
                has('State', 1).
                otherV().
                simplePath()
            ).
            emit().
            dedup().
            union(
                __.identity(),
                __.select('l3')
            )
        ).
        union(
            __.identity(),
            __.select('l2')
        )
    ).
    dedup().
    properties('name')

它给了我节点 7, 1, 3, 4, 5, 2.

但是当我从节点 1 开始时,它只给我 30245。我不明白为什么缺少 7。 (与上面的查询相同,但在第 2 行中使用了另一个名称)

g.V().
    has('name', eq('1')).
    as('l1').
    repeat(__.
        outE().
        has('State', 1).
        otherV().
        simplePath()
    ).
    emit().
    dedup().
    optional(__.
        as('l2').
        union(
            __.identity(),
            __.select('l1')
        ).
        outE().
        has('State', 2).
        otherV().
        optional(__.
            as('l3').
            repeat(__.
                bothE().
                has('State', 1).
                otherV().
                simplePath()
            ).
            emit().
            dedup().
            union(
                __.identity(),
                __.select('l3')
            )
        ).
        union(
            __.identity(),
            __.select('l2')
        )
    ).
    dedup().
    properties('name')

这里是在 gremlin 控制台中创建图形的脚本

graph = TinkerGraph.open()
g = traversal().withEmbedded(graph)

g.addV('InquiryEntity').property(single, 'name', '0')
g.addV('InquiryEntity').property(single, 'name', '1')
g.addV('InquiryEntity').property(single, 'name', '2')
g.addV('InquiryEntity').property(single, 'name', '3')
g.addV('InquiryEntity').property(single, 'name', '4')
g.addV('InquiryEntity').property(single, 'name', '5')
g.addV('InquiryEntity').property(single, 'name', '6')
g.addV('InquiryEntity').property(single, 'name', '7')
g.addV('InquiryEntity').property(single, 'name', '8')


g.V().hasLabel('InquiryEntity').has('name', '0').as('l1').V().hasLabel('InquiryEntity').has('name', '1').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '0').as('l1').V().hasLabel('InquiryEntity').has('name', '2').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '0').as('l1').V().hasLabel('InquiryEntity').has('name', '3').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '0').as('l1').V().hasLabel('InquiryEntity').has('name', '4').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '0').as('l1').V().hasLabel('InquiryEntity').has('name', '5').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '0').as('l1').V().hasLabel('InquiryEntity').has('name', '6').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '0').as('l1').V().hasLabel('InquiryEntity').has('name', '7').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '0').as('l1').V().hasLabel('InquiryEntity').has('name', '8').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '1').as('l1').V().hasLabel('InquiryEntity').has('name', '2').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '1').as('l1').V().hasLabel('InquiryEntity').has('name', '3').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '1').as('l1').V().hasLabel('InquiryEntity').has('name', '4').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '1').as('l1').V().hasLabel('InquiryEntity').has('name', '5').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '1').as('l1').V().hasLabel('InquiryEntity').has('name', '6').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '1').as('l1').V().hasLabel('InquiryEntity').has('name', '7').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '1').as('l1').V().hasLabel('InquiryEntity').has('name', '8').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '2').as('l1').V().hasLabel('InquiryEntity').has('name', '3').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '2').as('l1').V().hasLabel('InquiryEntity').has('name', '4').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '2').as('l1').V().hasLabel('InquiryEntity').has('name', '5').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '2').as('l1').V().hasLabel('InquiryEntity').has('name', '6').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '2').as('l1').V().hasLabel('InquiryEntity').has('name', '7').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '2').as('l1').V().hasLabel('InquiryEntity').has('name', '8').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '3').as('l1').V().hasLabel('InquiryEntity').has('name', '4').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '3').as('l1').V().hasLabel('InquiryEntity').has('name', '5').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '3').as('l1').V().hasLabel('InquiryEntity').has('name', '6').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '3').as('l1').V().hasLabel('InquiryEntity').has('name', '7').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '3').as('l1').V().hasLabel('InquiryEntity').has('name', '8').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '4').as('l1').V().hasLabel('InquiryEntity').has('name', '5').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '4').as('l1').V().hasLabel('InquiryEntity').has('name', '6').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '4').as('l1').V().hasLabel('InquiryEntity').has('name', '7').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '4').as('l1').V().hasLabel('InquiryEntity').has('name', '8').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '5').as('l1').V().hasLabel('InquiryEntity').has('name', '6').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '5').as('l1').V().hasLabel('InquiryEntity').has('name', '7').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '5').as('l1').V().hasLabel('InquiryEntity').has('name', '8').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '6').as('l1').V().hasLabel('InquiryEntity').has('name', '7').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '6').as('l1').V().hasLabel('InquiryEntity').has('name', '8').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')
g.V().hasLabel('InquiryEntity').has('name', '7').as('l1').V().hasLabel('InquiryEntity').has('name', '8').addE('CompareEntity').property('State', 0).to('l1').outV().addE('CompareEntity').property('State', 0).from('l1')

g.V().hasLabel('InquiryEntity').has('name', eq('0').or(eq('1'))).outE('CompareEntity').where(__.otherV().hasLabel('InquiryEntity').has('name', eq('1').or(eq('0')))).property('State', 1)
g.V().hasLabel('InquiryEntity').has('name', eq('1').or(eq('2'))).outE('CompareEntity').where(__.otherV().hasLabel('InquiryEntity').has('name', eq('2').or(eq('1')))).property('State', 1)
g.V().hasLabel('InquiryEntity').has('name', eq('1').or(eq('3'))).outE('CompareEntity').where(__.otherV().hasLabel('InquiryEntity').has('name', eq('3').or(eq('1')))).property('State', 2)
g.V().hasLabel('InquiryEntity').has('name', eq('0').or(eq('4'))).outE('CompareEntity').where(__.otherV().hasLabel('InquiryEntity').has('name', eq('0').or(eq('4')))).property('State', 1)
g.V().hasLabel('InquiryEntity').has('name', eq('4').or(eq('5'))).outE('CompareEntity').where(__.otherV().hasLabel('InquiryEntity').has('name', eq('4').or(eq('5')))).property('State', 1)
g.V().hasLabel('InquiryEntity').has('name', eq('0').or(eq('5'))).outE('CompareEntity').where(__.otherV().hasLabel('InquiryEntity').has('name', eq('0').or(eq('5')))).property('State', 1)
g.V().hasLabel('InquiryEntity').has('name', eq('3').or(eq('7'))).outE('CompareEntity').where(__.otherV().hasLabel('InquiryEntity').has('name', eq('3').or(eq('7')))).property('State', 1)

您需要将 emit 移动到 repeat 之前,否则节点“1”将不会成为起始集合的一部分,而到达“7”的唯一途径是通过“1” ”。这当然意味着起始顶点包含在结果中。要从结果中删除起始顶点,您可以在查询末尾的 dedup 之后添加 where(neq('l1'))

gremlin>     g.V().
......1>     has('name', '1').
......2>     as('l1').
......3>     emit().
......4>     repeat(__.
......5>         outE().
......6>         has('State', 1).
......7>         otherV().
......8>         simplePath()
......9>     ).
.....10>     dedup().
.....11>     optional(__.
.....12>         as('l2').
.....13>         union(
.....14>             __.identity(),
.....15>             __.select('l1')
.....16>         ).
.....17>         outE().
.....18>         has('State', 2).
.....19>         otherV().
.....20>         optional(__.
.....21>             as('l3').
.....22>             repeat(__.
.....23>                 bothE().
.....24>                 has('State', 1).
.....25>                 otherV().
.....26>                 simplePath()
.....27>             ).
.....28>             emit().
.....29>             dedup().
.....30>             union(
.....31>                 __.identity(),
.....32>                 __.select('l3')
.....33>             )
.....34>         ).
.....35>         union(
.....36>             __.identity(),
.....37>             __.select('l2')
.....38>         )
.....39>     ).
.....40>     dedup().
.....41>     properties('name')
==>vp[name->7]
==>vp[name->1]
==>vp[name->3]
==>vp[name->0]
==>vp[name->2]
==>vp[name->5]
==>vp[name->4]       

       

我通过在 simplepath() 之后添加 from 找到了解决方案 您可以在两个语句上添加 .from('l3') ,这将使路径从那里开始。否则简单路径将始终从头开始。

g.V().
has('name', eq('1')).
as('l1').
repeat(__.
    outE().
    has('State', 1).
    otherV().
    simplePath()
).
emit().
dedup().
optional(__.
    as('l2').
    union(
        __.identity(),
        __.select('l1')
    ).
    outE().
    has('State', 2).
    otherV().
    optional(__.
        as('l3').
        repeat(__.
            bothE().
            has('State', 1).
            otherV().
            simplePath().from('l3')
        ).
        emit().
        dedup().
        union(
            __.identity(),
            __.select('l3')
        )
    ).
    union(
        __.identity(),
        __.select('l2')
    )
).
dedup().
properties('name')
 ==>vp[name->7]
 ==>vp[name->0]
 ==>vp[name->3]
 ==>vp[name->2]
 ==>vp[name->4]
 ==>vp[name->5]