Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保在同一事务中将Neo4j节点添加到索引中?_Java_Scala_Neo4j - Fatal编程技术网

Java 如何确保在同一事务中将Neo4j节点添加到索引中?

Java 如何确保在同一事务中将Neo4j节点添加到索引中?,java,scala,neo4j,Java,Scala,Neo4j,我想将节点存储到Neo4j中,在这里我不想多次存储同一个节点。为此,我使用Neo4j索引API 但是,刚刚创建的节点不会反映在索引中 如何确保在同一事务中将Neo4j节点添加到索引中 package graph import org.neo4j.graphdb.Direction import org.neo4j.graphdb.GraphDatabaseService import org.neo4j.graphdb.Node import org.neo4j.graphdb.Path

我想将节点存储到Neo4j中,在这里我不想多次存储同一个节点。为此,我使用Neo4j索引API

但是,刚刚创建的节点不会反映在索引中

如何确保在同一事务中将Neo4j节点添加到索引中

package graph

import org.neo4j.graphdb.Direction
import org.neo4j.graphdb.GraphDatabaseService
import org.neo4j.graphdb.Node
import org.neo4j.graphdb.Path
import org.neo4j.graphdb.Relationship
import org.neo4j.graphdb.RelationshipType
import org.neo4j.graphdb.Transaction
import org.neo4j.graphdb.factory.GraphDatabaseFactory
import org.neo4j.graphdb.traversal.Evaluators
import org.neo4j.graphdb.traversal.TraversalDescription
import org.neo4j.graphdb.traversal.Traverser
import org.neo4j.kernel.Traversal
import scala.sys.ShutdownHookThread
import collection.JavaConversions._
import java.io.File
import scala.collection.mutable
import org.neo4j.graphdb.factory.GraphDatabaseSettings

object indextest extends App {

  def deleteFileOrDirectory(file: File): Unit = {
    if (!file.exists()) return ;
    if (file.isDirectory()) for (child <- file.listFiles()) deleteFileOrDirectory(child)
    else file.delete()
  }

  val GRAPHLOCATION = "/tmp/testgraph"

  // setup Graph DB
  deleteFileOrDirectory(new File(GRAPHLOCATION))
  val graphDb = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(GRAPHLOCATION)
    .setConfig(GraphDatabaseSettings.node_keys_indexable, "name")
    .setConfig(GraphDatabaseSettings.node_auto_indexing, "true")
    .newGraphDatabase()

  // register shutdown hook thread
  ShutdownHookThread {
    graphDb.shutdown()
  }

  val tx = graphDb.beginTx
  val indexManager = graphDb.index()
  val nameIdsIndex = indexManager.forNodes("nameIds", Map("type" -> "exact"))

  val node1 = createOrFetchNode("A")
  val node2 = createOrFetchNode("A")

  tx.success()
  tx.finish()

  def createOrFetchNode(nodeName: String) = {
    val hits = nameIdsIndex.get("name", nodeName)
    val node = hits.getSingle()
    println(s"search for $nodeName -> list: ${hits.iterator.toList} node: $node")

    if (node == null) {
      val node2 = graphDb.createNode()
      node2.setProperty("name", nodeName)
      node2
    } else node
  }

}
包图
导入org.neo4j.graphdb.Direction
导入org.neo4j.graphdb.GraphDatabaseService
导入org.neo4j.graphdb.Node
导入org.neo4j.graphdb.Path
导入org.neo4j.graphdb.Relationship
导入org.neo4j.graphdb.RelationshipType
导入org.neo4j.graphdb.Transaction
导入org.neo4j.graphdb.factory.GraphDatabaseFactory
导入org.neo4j.graphdb.traversal.Evaluators
导入org.neo4j.graphdb.traversal.TraversalDescription
导入org.neo4j.graphdb.traversal.Traverser
导入org.neo4j.kernel.Traversal
导入scala.sys.shutdownhookshread
导入collection.JavaConversions_
导入java.io.xml文件
导入scala.collection.mutable
导入org.neo4j.graphdb.factory.GraphDatabaseSettings
对象索引扩展应用程序{
def deleteFileOrDirectory(文件:文件):单位={
如果(!file.exists())返回;
if(file.isDirectory())for(子“精确”))
val node1=createOrFetchNode(“A”)
val node2=createOrFetchNode(“A”)
tx.成功()
完成
def createOrFetchNode(节点名称:字符串)={
val hits=nameIdsIndex.get(“name”,nodeName)
val节点=hits.getSingle()
println(s“搜索$nodeName->list:${hits.iterator.toList}节点:$node”)
if(node==null){
val node2=graphDb.createNode()
setProperty(“名称”,nodeName)
节点2
}else节点
}
}
电流输出:

search for A -> list: List() node: null search for A -> list: List() node: null 搜索->列表:列表()节点:null 搜索->列表:列表()节点:null 预期产出:

search for A -> list: List() node: null search for A -> list: List(Node[1]) node: Node[1] 搜索->列表:列表()节点:null 搜索->列表:列表(节点[1])节点:节点[1]
我做错了什么?

您实际上有两个索引:auto\u索引,当您传递到config
时创建(GraphDatabaseSettings.node\u auto\u index,“true”)
,以及您的第二个索引
nameIdsIndex
。此第二个索引是手动索引,因此您必须显式地添加和删除其中的条目。这就是为什么您在查询中找不到任何内容(但您应该在自动索引中找到节点)

在创建节点时,有一些特殊的机制可以确保唯一性:

我在本页中使用了graphDb.index().getNodeAutoIndexer().getAutoIndex(),现在可以使用了。感谢您的解释。