Lucene导致的Neo4j错误(打开的文件太多)

Lucene导致的Neo4j错误(打开的文件太多),lucene,neo4j,Lucene,Neo4j,我刚刚开始评估Neo4j,看看它有多适合我们的用例。 我正在使用嵌入式JavaAPI将边和节点插入到图形中。 在创建了大约5000个节点之后,我得到了以下错误(在OS X Yosemite上使用Neo4j 2.1.6和2.1.7) 我在网上看过许多类似的StackOverFlow问题和其他相关的帖子。他们都建议提高最大打开文件数限制。 我试过这么做 以下是我的设置: kern.maxfiles:65536 kern.maxfilesperproc:65536 但是,这并没有修复错误 当Neo

我刚刚开始评估Neo4j,看看它有多适合我们的用例。 我正在使用嵌入式JavaAPI将边和节点插入到图形中。 在创建了大约5000个节点之后,我得到了以下错误(在OS X Yosemite上使用Neo4j 2.1.6和2.1.7)

我在网上看过许多类似的StackOverFlow问题和其他相关的帖子。他们都建议提高最大打开文件数限制。 我试过这么做

以下是我的设置:

  • kern.maxfiles:65536

  • kern.maxfilesperproc:65536

但是,这并没有修复错误

当Neo4j代码运行时,我尝试使用
lsof | wc-l
命令。当打开大约10000个文件时,代码总是会中断

以下是处理Neo4j的主要类:

import java.io.File;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.neo4j.cypher.internal.compiler.v1_9.commands.True;
import org.neo4j.cypher.internal.compiler.v2_0.ast.False;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.schema.Schema;
import org.neo4j.graphdb.schema.IndexDefinition;
import org.neo4j.graphdb.index.UniqueFactory;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.index.IndexHits;

public class Neo4jDB implements  Serializable {

    private static final String DB_PATH = "target/neo4j-hello-db-spark";
    IndexDefinition indexDefinition;

    private static GraphDatabaseFactory dbFactory;
    public static GraphDatabaseService db;

    public void main(String[] args) {
        System.out.println("Life is a disease, sexually transmitted and irrevocably fatal. Stop coding and read some Neil Gaiman.");
    }



    public void startDbInstance() {
        db =new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
    }

    public  Node createOrGetNode ( LabelsUser360 label , String key, String nodeName ,Map<String,Object> propertyMap)
    {
        System.out.println("Creating/Getting node");
        try ( Transaction tx = db.beginTx() ) {
            Node node;

            if (db.findNodesByLabelAndProperty(label, key, nodeName).iterator().hasNext()) {
                node = db.findNodesByLabelAndProperty(label, key, nodeName).iterator().next();
            } else {
                node = db.createNode(label);
                node.setProperty(key, nodeName);

            }
            for (Map.Entry<String, Object> entry : propertyMap.entrySet()) {
                node.setProperty(entry.getKey(), entry.getValue());
            }
            tx.success();
            return node;
        }

    }

    public  void createUniquenessConstraint(LabelsUser360 label , String property)
    {
        try ( Transaction tx = db.beginTx() )
        {
            db.schema()
                    .constraintFor(label)
                    .assertPropertyIsUnique(property)
                    .create();
            tx.success();
        }
    }

    public void createOrUpdateRelationship(RelationshipsUser360 relationshipType ,Node startNode, Node endNode, Map<String,Object> propertyMap)
    {
        try ( Transaction tx = db.beginTx() ) {
            if (startNode.hasRelationship(relationshipType, Direction.OUTGOING)) {
                Relationship relationship = startNode.getSingleRelationship(relationshipType, Direction.OUTGOING);
                for (Map.Entry<String, Object> entry : propertyMap.entrySet()) {
                    relationship.setProperty(entry.getKey(), entry.getValue());
                }
            } else {
                Relationship relationship = startNode.createRelationshipTo(endNode, relationshipType);
                for (Map.Entry<String, Object> entry : propertyMap.entrySet()) {
                    relationship.setProperty(entry.getKey(), entry.getValue());
                }
            }
            tx.success();
        }

    }

    public void registerShutdownHook( final GraphDatabaseService graphDb )
    {
        Runtime.getRuntime().addShutdownHook( new Thread()
        {
            @Override
            public void run()
            {
                db.shutdown();
            }
        } );
    }

}

其中“a”是一个json字符串,linesEnriched是一个Spark RDD(基本上是一组字符串)

ulimit-n给出了什么?是同一个65K吗?@Pang谢谢你的编辑!这是我的第一个问题。也许你可以分享你用来创建数据的代码?也许有什么东西漏了?可能是交易。@MichaelHunger嘿,我已经添加了所有相关的代码。如果需要更多信息/上下文,请告诉我。我已经在这上面呆了很长时间了。
import java.io.File;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.neo4j.cypher.internal.compiler.v1_9.commands.True;
import org.neo4j.cypher.internal.compiler.v2_0.ast.False;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.schema.Schema;
import org.neo4j.graphdb.schema.IndexDefinition;
import org.neo4j.graphdb.index.UniqueFactory;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.index.IndexHits;

public class Neo4jDB implements  Serializable {

    private static final String DB_PATH = "target/neo4j-hello-db-spark";
    IndexDefinition indexDefinition;

    private static GraphDatabaseFactory dbFactory;
    public static GraphDatabaseService db;

    public void main(String[] args) {
        System.out.println("Life is a disease, sexually transmitted and irrevocably fatal. Stop coding and read some Neil Gaiman.");
    }



    public void startDbInstance() {
        db =new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
    }

    public  Node createOrGetNode ( LabelsUser360 label , String key, String nodeName ,Map<String,Object> propertyMap)
    {
        System.out.println("Creating/Getting node");
        try ( Transaction tx = db.beginTx() ) {
            Node node;

            if (db.findNodesByLabelAndProperty(label, key, nodeName).iterator().hasNext()) {
                node = db.findNodesByLabelAndProperty(label, key, nodeName).iterator().next();
            } else {
                node = db.createNode(label);
                node.setProperty(key, nodeName);

            }
            for (Map.Entry<String, Object> entry : propertyMap.entrySet()) {
                node.setProperty(entry.getKey(), entry.getValue());
            }
            tx.success();
            return node;
        }

    }

    public  void createUniquenessConstraint(LabelsUser360 label , String property)
    {
        try ( Transaction tx = db.beginTx() )
        {
            db.schema()
                    .constraintFor(label)
                    .assertPropertyIsUnique(property)
                    .create();
            tx.success();
        }
    }

    public void createOrUpdateRelationship(RelationshipsUser360 relationshipType ,Node startNode, Node endNode, Map<String,Object> propertyMap)
    {
        try ( Transaction tx = db.beginTx() ) {
            if (startNode.hasRelationship(relationshipType, Direction.OUTGOING)) {
                Relationship relationship = startNode.getSingleRelationship(relationshipType, Direction.OUTGOING);
                for (Map.Entry<String, Object> entry : propertyMap.entrySet()) {
                    relationship.setProperty(entry.getKey(), entry.getValue());
                }
            } else {
                Relationship relationship = startNode.createRelationshipTo(endNode, relationshipType);
                for (Map.Entry<String, Object> entry : propertyMap.entrySet()) {
                    relationship.setProperty(entry.getKey(), entry.getValue());
                }
            }
            tx.success();
        }

    }

    public void registerShutdownHook( final GraphDatabaseService graphDb )
    {
        Runtime.getRuntime().addShutdownHook( new Thread()
        {
            @Override
            public void run()
            {
                db.shutdown();
            }
        } );
    }

}
import org.apache.lucene.index.IndexWriter;
import org.codehaus.jackson.map.ObjectMapper;
import org.json.*;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.schema.IndexDefinition;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


public class Neo4jAdapter implements Serializable {

    static Neo4jDB n4j = new Neo4jDB();
    public static GraphDatabaseService db = Neo4jDB.db ;

    public void begin() {
        n4j.startDbInstance();
    }


    public static void main(String[] args) {}



    public String graphPut(String jsonString) {

        System.out.println("graphput called");

        HashMap<String, Object> map = jsonToMap(jsonString); //Json deserializer

        Node startNode = n4j.createOrGetNode(...);
        Node endNode = n4j.createOrGetNode(...);

        propertyMap = new HashMap<String, Object>();
        propertyMap.put(....);

        try (Transaction tx = Neo4jDB.db.beginTx()) {
            Relationship relationship = startNode.getSingleRelationship(...);
            if (relationship != null) {
                Integer currentCount = (Integer) relationship.getProperty("count");
                Integer updatedCount = currentCount + 1;
                propertyMap.put("count", updatedCount);
            } else {
                Integer updatedCount = 1;
                propertyMap.put("count", updatedCount);
            }
            tx.success();
        }


        n4j.createOrUpdateRelationship(RelationshipsUser360.BLAH, startNode, endNode, propertyMap);

                }
            }
        }
        return "Are you sponge worthy??";
    }
} 
val graphdb : Neo4jAdapter = new Neo4jAdapter()
graphdb.begin() 
linesEnriched.foreach(a=>graphdb.graphPutMap(a))