[英]Opening existing embedded neo4j database
我試圖在嵌入式jave Neo4j api上使用scala。 我在打開數據庫以便以后讀取時遇到麻煩。 下面的代碼應在每次運行時創建兩個節點和一個邊緣,但在每次運行開始時將其全部返回。 因此,第一次0節點,第二次2節點,第三次4等等。
import org.neo4j.tooling.GlobalGraphOperations
import org.neo4j.graphdb.factory.GraphDatabaseFactory
import org.neo4j.graphdb.RelationshipType
object tester extends App{
val DB_PATH = "data/neo4j"
object KNOWS extends RelationshipType {
override def name(): String = "KNOWS"
}
val graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH) //seems to reset the whole directory
println(graphDb)
try {
println("Begin")
val tx = graphDb.beginTx() // Database operations go here
println(GlobalGraphOperations.at(graphDb).getAllNodes.iterator)
val nodes = GlobalGraphOperations.at(graphDb).getAllNodes.iterator
while (nodes.hasNext()) {
println(nodes.next())
}
nodes.close()
val relT = GlobalGraphOperations.at(graphDb).getAllRelationships.iterator
while (relT.hasNext()) {
println(relT.next())
}
println("Success - Begin")
tx.success()
}
try {
val tx = graphDb.beginTx() // Database operations go here
val firstNode = graphDb.createNode
val secondNode = graphDb.createNode
val relationship = firstNode.createRelationshipTo(secondNode, KNOWS)
println(firstNode)
println(secondNode)
println(relationship)
println(relationship.getType.name)
tx.success()
println("Success")
}
println("End")
try {
val tx = graphDb.beginTx() // Database operations go here
println(GlobalGraphOperations.at(graphDb).getAllNodes.iterator)
val nodes = GlobalGraphOperations.at(graphDb).getAllNodes.iterator
while (nodes.hasNext()) {
println(nodes.next())
}
nodes.close()
val relT = GlobalGraphOperations.at(graphDb).getAllRelationships.iterator
while (relT.hasNext()) {
println(relT.next())
}
println("Success - End")
tx.success()
}
graphDb.shutdown()
}
但是,每次似乎只是給一個空數據庫,然后是兩個新節點。 這里發生了什么?
EmbeddedGraphDatabase [data/neo4j]
Begin
org.neo4j.tooling.GlobalGraphOperations$1$1@74c49a90
Success - Begin
Node[2]
Node[3]
Relationship[1]
KNOWS
Success
End
org.neo4j.tooling.GlobalGraphOperations$1$1@2ec0df08
Node[2]
Node[3]
Relationship[1]
Success - End
Process finished with exit code 0
發生這種情況是因為您沒有關閉事務 。 您可以通過調用tx.close()
。 我也認為在try
中實例化tx
並不完全應該如此。 這是程序的工作版本:
import org.neo4j.tooling.GlobalGraphOperations
import org.neo4j.graphdb.factory.GraphDatabaseFactory
import org.neo4j.graphdb.RelationshipType
object tester extends App{
val DB_PATH = "data/neo4j"
object KNOWS extends RelationshipType {
override def name(): String = "KNOWS"
}
val graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH)
println(graphDb)
val tx1 = graphDb.beginTx() // Database operations go here
try {
println("Will list all nodes")
println("1 - Begin")
println("GlobalGraphOperations.at(graphDb).getAllNodes.iterator")
val nodes = GlobalGraphOperations.at(graphDb).getAllNodes.iterator
while (nodes.hasNext()) {
println(nodes.next())
}
nodes.close()
val relT = GlobalGraphOperations.at(graphDb).getAllRelationships.iterator
while (relT.hasNext()) {
println(relT.next())
}
println("1 - Success - Begin")
tx1.success()
}
finally {
tx1.close()
}
val tx2 = graphDb.beginTx() // Database operations go here
try {
val firstNode = graphDb.createNode
val secondNode = graphDb.createNode
val relationship = firstNode.createRelationshipTo(secondNode, KNOWS)
println(firstNode)
println(secondNode)
println(relationship)
println(relationship.getType.name)
tx2.success()
println("2 - Success")
}
finally {
tx2.close()
}
println("2 - End")
val tx3 = graphDb.beginTx() // Database operations go here
try {
println(GlobalGraphOperations.at(graphDb).getAllNodes.iterator)
val nodes = GlobalGraphOperations.at(graphDb).getAllNodes.iterator
while (nodes.hasNext()) {
println(nodes.next())
}
nodes.close()
val relT = GlobalGraphOperations.at(graphDb).getAllRelationships.iterator
while (relT.hasNext()) {
println(relT.next())
}
println("3 - Success - End")
tx3.success()
}
finally {
tx3.close()
}
graphDb.shutdown()
}
我試圖使您的程序更接近“ scala風格”。 另外,我嘗試刪除樣板並重復代碼。 為此,我:
JavaConverters
來處理Java集合和Iterables,就像我們在Scala中處理它們一樣 withTransaction
的方法來為我們在Scala中的交易獲取自動資源管理 。 結果如下:
import org.neo4j.tooling.GlobalGraphOperations
import org.neo4j.graphdb.factory.GraphDatabaseFactory
import org.neo4j.graphdb.RelationshipType
import org.neo4j.graphdb.Transaction
import scala.collection.JavaConverters._
object tester extends App{
val DB_PATH = "data/neo4j"
object KNOWS extends RelationshipType {
override def name(): String = "KNOWS"
}
def withTransaction (doWithTransaction: Transaction => Unit) {
val tempTx = graphDb.beginTx()
try {
doWithTransaction(tempTx)
}
finally {
tempTx.close()
}
}
val graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH)
println(graphDb)
withTransaction { tx =>
println("1 - Begin")
val nodes = GlobalGraphOperations.at(graphDb).getAllNodes
for (node <- nodes.asScala)
println(node)
val relTs = GlobalGraphOperations.at(graphDb).getAllRelationships
for (irelT <- relTs.asScala)
println(irelT)
println("1 - Success - Begin")
tx.success()
}
withTransaction { tx =>
val firstNode = graphDb.createNode
val secondNode = graphDb.createNode
val relationship = firstNode.createRelationshipTo(secondNode, KNOWS)
println(firstNode)
println(secondNode)
println(relationship)
println(relationship.getType.name)
tx.success()
println("2 - Success")
}
println("2 - End")
withTransaction { tx =>
println(GlobalGraphOperations.at(graphDb).getAllNodes.iterator)
val nodes = GlobalGraphOperations.at(graphDb).getAllNodes
for (node <- nodes.asScala)
println(node)
val relTs = GlobalGraphOperations.at(graphDb).getAllRelationships
for (irelT <- relTs.asScala)
println(irelT)
println("3 - Success - End")
tx.success()
}
graphDb.shutdown()
}
問題是您要指定相對路徑。 可能是因為每次運行清理並構建時都清空目標目錄(或dist,或任何其他想法,開發框架用作分發目錄),所以數據庫為空,因為它是從頭開始創建的。 嘗試使用絕對路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.