Graph 下一个返回的结果是错误的

Graph 下一个返回的结果是错误的,graph,gremlin,janusgraph,Graph,Gremlin,Janusgraph,我想检查两个节点之间的关系是否存在。如果存在,我想更新属性,否则在指定节点之间添加新关系。groovy脚本用于从CSV文件读取数据并运行查询 g.V().has('label_A','A').outE('to').inV().has('label_B','B').hasNext() ? g.V().has('label_A','A').outE('to').as('e').inV().has('label_B','B').select('e').property('created','exist

我想检查两个节点之间的关系是否存在。如果存在,我想更新属性,否则在指定节点之间添加新关系。groovy脚本用于从CSV文件读取数据并运行查询

g.V().has('label_A','A').outE('to').inV().has('label_B','B').hasNext() ? g.V().has('label_A','A').outE('to').as('e').inV().has('label_B','B').select('e').property('created','existed') : g.V().has('label_A','A').as('fromV').V().has('label_B','B').as('toV').addE('to').from('fromV').to('toV').property('created','newAdded')

g、 V().has('label_A','A')。outE('to')。inV().has('label_B','B')。hasNext()总是返回false,即使在通过groovy脚本运行时给定的两个节点之间存在关系。 gremlin控制台上的相同命令返回预期的输出。因此,新的关系总是会产生

还尝试了以下查询

g.V().hasLabel('label_A','A').as('v').V().has('label_B','B').coalesce(__.inE('to').where(outV().as('v')),addE('to').from('v').property('created','newAdded')).property('created','existed')

上面的查询不起作用。没有添加任何关系。

从纯小精灵的角度来看,我认为您更愿意将遍历写成:

g.V().has('label_A','A').
  outE('to').where(inV().has('label_B','B')).
  fold().
  coalesce(unfold().property('created','existed'),
           addE('to').
           from(V().has('label_A','A')).
           to(V().has('label_B','B')).
           property('created','newAdded'))
这样,它将在单个请求/事务中执行,而不是在两个单独的操作中执行。您可以在以下使用TinkerGraph的Gremlin控制台会话中看到它的运行:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV().property('label_A','A').iterate()
gremlin> g.addV().property('label_B','B').iterate()
gremlin> g.V().has('label_A','A').
......1>   outE('to').where(inV().has('label_B','B')).
......2>   fold().
......3>   coalesce(unfold().property('created','existed'),
......4>            addE('to').
......5>            from(V().has('label_A','A')).
......6>            to(V().has('label_B','B')).
......7>            property('created','newAdded'))
==>e[4][0-to->2]
gremlin> g.E().elementMap()
==>[id:4,label:to,IN:[id:2,label:vertex],OUT:[id:0,label:vertex],created:newAdded]
gremlin> g.V().has('label_A','A').
......1>   outE('to').where(inV().has('label_B','B')).
......2>   fold().
......3>   coalesce(unfold().property('created','existed'),
......4>            addE('to').
......5>            from(V().has('label_A','A')).
......6>            to(V().has('label_B','B')).
......7>            property('created','newAdded'))
==>e[4][0-to->2]
gremlin> g.E().elementMap()
==>[id:4,label:to,IN:[id:2,label:vertex],OUT:[id:0,label:vertex],created:existed]

至于为什么您的方法在JanusGraph中不起作用,根据提供的信息很难说。也许你应该试着用JanusGraph重新创建我的Gremlin控制台会话,看看会发生什么。如果它仍然不适用于您,那么您可以提供一个完全失败的示例供JanusGraph专家查看。

两个建议和问题:1。您可以将outE('to').inV()替换为out('to')2。您是将标签存储为属性还是顶点标签?如果是顶点标签,则查询可能不正确。对于顶点标签,您可以将has('label_A','A')替换为hasLabel('A')(与b相同)label_A不是顶点标签。这是一种财产。由于标签是保留的,所以我使用的是标签A。我使用的是outE('to').inV(),因为可能有许多边从A到B、C等输出。但我希望选择一条边来标记B,而不是其他在我的情况下不起作用的边。注意:我使用的是一个groovy脚本,它批量加载CSV记录并执行查询。还有其他方法吗?问题是根本没有选择边缘,这导致了问题。您可以更具体地说明什么不起作用吗?你是说我和我的样本数据的精确的gremlin会话不适用于JanusGraph吗?如果您是说,您只是将我的查询粘贴到groovy脚本中,但它不起作用,那么您的脚本可能有问题,在这种情况下,我们可能需要查看一下。在最坏的情况下,您可能需要提供可在Gremlin控制台中执行的完全可再现的故障。请先用JanusGraph重新创建我的会话,看看是否有效。该测试的结果将告诉我们很多。我使用的是一个多处理groovy脚本,它批量执行CSV文件。问题在于,当在控制台上执行查询时,查询返回所需的输出,但当使用多处理groovy脚本执行时,返回错误的结果。例如,考虑查询G.V.()。(“LabelSua”,“a”)。OUTE(“to”).In()。(“LabelSub”,“b”)。HasNeX.()在控制台中返回true,但通过脚本返回false。has语句中的A'和B'通过CSV文件获取。例如g.V().has('label_A',record[0])。outE('to')。inV().has('label_B',record[1])。hasNext()record[0]包含'A',而record[1]包含'B'。个人聊天?groovy脚本有一个问题-遍历没有执行。您需要
iterate()
遍历-