18

从关系数据库的思维方式来看,每个 neo4j 实例只有一个图形数据库似乎很奇怪。我们的想法是从 root 开始做多个子图吗?

谢谢

4

3 回答 3

12

“根”节点的概念正在消失。这有很多问题,其中大部分都围绕节点密度。

我相信您的问题的核心在于数据库设计,以及拥有多个图形数据库实例或一个具有多个子图的实例是否更聪明。

真的这取决于你,但我会采用子图的想法,因为它允许你的一些数据在同一个连接中共享,如果你这样做,Neo4j 并没有任何性能损失,只要你将它们分开,然后您最终会遇到的唯一问题是节点/关系的最大大小,但这是一个人为的限制,稍后会增加。

于 2013-07-01T04:55:57.683 回答
4

如果只是为了开发,你可以使用neo4j-instance,它可以帮助我同时处理几个 neo4j 数据库(同时,基本上每个设置在不同的端口上),它比添加标签要好得多区分不同的模式,或使用方案名称为节点添加前缀。因为,您不必更改与 neo4j 数据库交互的方式,因为它们仍然是不同端口上的独立数据库。

于 2015-06-23T18:11:28.373 回答
0

是的,我最近在 pytest session level fixture中创建了多个neo4j实例,假设你想在localhost中运行多个neo4j实例,这里假设主机是单一的(localhost),如果你看到neo4j conf文件($neo4j_home/conf/neo4j .conf) , 默认配置为 http 端口 7474 和 bolt 7687 , 假设一个 neo4j 使用 http 端口 7474 运行, 现在你不能运行另一个使用 7474 的 neo4j 实例, 你必须更改 neo4j.conf 中的端口然后你可以启动另一个实例,以解决此问题

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("", 0))
sock.listen(1)
port = sock.getsockname()[1]

它将为您提供免费端口,需要在运行时在 neo4j.conf 中更改它现在让我们看看这个 pytest 夹具

@pytest.fixture(scope="session")
def neo4j_graph_instance(csv_node_file, csv_relation_file):
    instancesDirectory = os.path.join(PATH_TEST_DIR, "neo4j_instance_acceptance")
if not os.path.exists(instancesDirectory):
    os.makedirs(instancesDirectory)

archive_file = "neo4j-community-3.2.1-unix.tar.gz"
filename = instancesDirectory + "/" + archive_file

if (os.path.isfile(filename)) == True:
    try:
        with TarFile.open(filename, "r:gz") as archive:
            archive.extractall(instancesDirectory)
            print ("successfully extracted")

    except IOError:
        print "file is not there"
else:
    try:
        uri = "http://dist.neo4j.org/neo4j-community-3.2.1-unix.tar.gz"
        urlretrieve(uri, filename)
        try:
            with TarFile.open(filename, "r:gz") as archive:
                archive.extractall(instancesDirectory)
        except IOError:
            print "file is not there"
    except IOError:
        print "Could not connect to internet to download the file"

neo4j_home = os.path.join(instancesDirectory, "neo4j-community-3.2.1")
neo4j_import_dir = os.path.join(neo4j_home, "import")
neo4j_inst = Neo4jInstance(home=neo4j_home)

neo4j_inst.set_config("dbms.connector.http.listen_address", ":%s" % get_open_port())
neo4j_inst.set_config("dbms.connector.bolt.listen_address", ":%s" % get_open_port())
neo4j_inst.set_config("dbms.security.auth_enabled", "false")
neo4j_inst.set_config("dbms.connector.https.enabled", "false")

# db loading mechanism #
# Rajib: I am getting csv files fixture and copying them in neo4j import dir  in run time.
# Then getting bolt uri for that active instance  , and executing the command 'load_db_script'.
# At the end I am returning one Graph instance with fully loaded with csv files.


neo4j_inst.start_neo4j_instance()
time.sleep(15)
#:todo need to avoid sleep , instead check socket connection to desired host and port
print "copying csv files to neo4j import direcotry"

copy_script = "cp %s %s %s" % (
    csv_node_file, csv_relation_file,  neo4j_import_dir)
call(copy_script, shell=True)
print "successfully copied to neo4j import directory "
neo4j_inst_bolt_uri = "bolt://localhost:%d" % neo4j_inst.get_bolt_port()
load_cypher_file = os.path.join(DMS_PATH, "load_csv.cypher")
load_db_script = "cat %s | %s -a %s --format verbose --debug" % (
    load_cypher_file, neo4j_inst.cypher_shell_script(), neo4j_inst_bolt_uri)
call(load_db_script, shell=True)
neo4j_inst_http_port = neo4j_inst.get_http_port()

yield Graph(host='localhost', http_port=neo4j_inst_http_port, bolt=False)

print "running teardown methods"

neo4j_inst.stop_neo4j_instance()
neo4j_inst.delete_store()

所以每次它都会给你一个带有 neo4j 实例的夹具,其中端口将在运行时分配给完全加载的数据库。

于 2017-08-15T09:42:30.967 回答