Sparql 副作用、映射和路径都没有Y键:WherePredicateStep(neq(Y))

Sparql 副作用、映射和路径都没有Y键:WherePredicateStep(neq(Y)),sparql,gremlin,tinkerpop3,Sparql,Gremlin,Tinkerpop3,我正在继续扩展Gremlinator以支持更大的SPARQL查询子集。在我们的工作中,我们经常看到如下SPARQL查询: SELECT DISTINCT ?X ?Y ?Z ?V ?NAME WHERE { ?X e:brother ?Z . ?Y e:brother ?V . ?Z v:name ?NAME . ?V v:name ?NAME . FILTER (?X

我正在继续扩展Gremlinator以支持更大的SPARQL查询子集。在我们的工作中,我们经常看到如下SPARQL查询:

SELECT DISTINCT ?X ?Y ?Z ?V ?NAME 
        WHERE { 
          ?X e:brother ?Z . 
          ?Y e:brother ?V . 
          ?Z v:name ?NAME . 
          ?V v:name ?NAME . 
          FILTER (?X != ?Y) . 
        }
基本上是这样的:找到所有具有同名兄弟的X和Y,其中X和Y不相同。这可以被认为是SQL自连接。这里的例子是使用神的图形

我提出了一个小精灵遍历,可以找到这些X和Y:

g.V().as("X").out("brother").as("Z").values("name").as("NAME1")
  .V().as("Y").out("brother").as("V").values("name").as("NAME2")
  .where("NAME1", P.eq("NAME2")).where("X", P.neq("Y")).select("X", "Y", "Z", "V", "NAME1", "NAME2");
然后,我尝试根据匹配步骤(在现有Gremlinator框架内工作)重写该步骤:

此遍历将导致:

java.lang.IllegalArgumentException: Neither the sideEffects, map, nor path has a Y-key: WherePredicateStep(X,neq(Y))
而添加了重复数据消除()步骤的同一查询工作正常:

g.V().match(
        __.as("START").V().as("X").out("brother").as("Z"),
        __.as("START").V().as("Y").out("brother").as("V"),
        __.as("Z").values("name").as("NAME"),
        __.as("V").values("name").as("NAME"))
        .dedup().where("X", P.neq("Y")).dedup("X", "Y", "Z", "V", "NAME").select("X", "Y", "Z", "V", "NAME");
我真正想做的是在匹配块中只包含where子句,而不包含任何无关的dedup()步骤

这也会引发与其他匹配变体相同的错误

我想在本页第F节中添加一个额外的重复数据消除步骤:该步骤提到了一个假定的罪魁祸首:。但由于我有最新的Tinkerpop版本,看起来这个问题的原因并不完全相同,因为这个bug已经修复了

g.V().match(
        __.as("START").V().as("X").out("brother").as("Z"),
        __.as("START").V().as("Y").out("brother").as("V"),
        __.as("Z").values("name").as("NAME"),
        __.as("V").values("name").as("NAME"))
        .dedup().where("X", P.neq("Y")).dedup("X", "Y", "Z", "V", "NAME").select("X", "Y", "Z", "V", "NAME");
g.V().match(
        __.as("START").V().as("X").out("brother").as("Z"),
        __.as("START").V().as("Y").out("brother").as("V"),
        __.as("Z").values("name").as("NAME"),
        __.as("V").values("name").as("NAME”),
    __.where("X", P.neq("Y")))
        .dedup("X", "Y", "Z", "V", "NAME").select("X", "Y", "Z", "V", "NAME");