Gremlin Scala Neo4j:搜索节点,添加新节点和边缘

时间:2017-08-20 00:43:02

标签: gremlin tinkerpop

我无法通过密钥找到节点,然后在它们之间添加新节点和边缘。如果电影节点已经在图表中,我使用:

case class GraphBuilder(movieId: Int, personId: Int)
// 
val Ident = Key[String]("personId")
val ItemId = Key[String]("movieId")
//
def applyToGraph(it: GraphBuilder): Unit = {
 val thisPerson = graph + ("Person", Ident -> it.personId.asInstanceOf[String])
 val movies = graph.V.hasLabel("Movie").has(ItemId, it.movieId)
 movies.headOption match {
  case Some(v) =>
   v --- "likedBy" --> thisPerson // tested with println("yay" + v)
  case None => println("youre a failure")
 }
 graph.tx.commit()
}

但是每次我以编程方式运行时,它都会通过thisPerson val正确地将人添加到图形中,根据movieId正确地找到影片顶点,但不会创建" likesBy"边缘。我也试过没有模式匹配的选项,但这也不起作用。

什么方法最好找到节点,添加节点,在添加和找到之间添加边缘?

1 个答案:

答案 0 :(得分:1)

我对您的代码段中的语法感到有点困惑,但由于您必须拥有两个顶点的标识符,因此以下查询应该可以解决这个问题:

g.V().has("Movie", "movieId", movieId).as("m").
  V().has("Person", "personId", personId).
  addE("likedBy").to("m").iterate()

如果人物顶点尚不存在:

g.V().has("Movie", "movieId", movieId).as("m").
  addV("Person").property("personId", personId).
  addE("likedBy").to("m").iterate()

如果你不知道人物顶点是否已经存在:

g.V().has("Movie", "movieId", movieId).as("m").
  coalesce(
    V().has("Person", "personId", personId)
    addV("Person").property("personId", personId)).
  addE("likedBy").to("m").iterate()