Sparql 副作用、映射和路径都没有Y键:WherePredicateStep(neq(Y))
我正在继续扩展Gremlinator以支持更大的SPARQL查询子集。在我们的工作中,我们经常看到如下SPARQL查询: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
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");