Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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
在一个neo4j实例上有多个数据库?_Neo4j - Fatal编程技术网

在一个neo4j实例上有多个数据库?

在一个neo4j实例上有多个数据库?,neo4j,Neo4j,从关系数据库的角度来看,neo4j的每个实例只有一个graph db似乎很奇怪。我们从根开始做多个子图的想法是什么 谢谢根节点的概念正在消失。这有很多问题,其中大部分都与节点密度有关 我相信您问题的核心是数据库设计,以及拥有多个图形数据库实例或一个实例包含多个子图是否更明智 实际上,这取决于您,但我会同意子图的想法,因为它允许在同一连接中共享您的一些数据,并且Neo4j实际上不会有任何性能损失如果您这样做,只要将它们分开,那么您最终会遇到的唯一问题是节点/关系的最大大小,但这是一个人为的限制,以

从关系数据库的角度来看,neo4j的每个实例只有一个graph db似乎很奇怪。我们从根开始做多个子图的想法是什么

谢谢

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

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


实际上,这取决于您,但我会同意子图的想法,因为它允许在同一连接中共享您的一些数据,并且Neo4j实际上不会有任何性能损失如果您这样做,只要将它们分开,那么您最终会遇到的唯一问题是节点/关系的最大大小,但这是一个人为的限制,以后会被抬高

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

是的,我最近在pytest会话级别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.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实例的fixture,其中端口将在运行时使用完全加载的数据库进行分配

我看这仍然是唯一的答案。你对设计有什么问题吗?没有,我现在清楚了。子图非常有意义,没有根节点也很有帮助。糟糕的是,我不能同时处理多个项目,因为我只有一个数据库。不过,我认为只要它们不相关,我就可以拥有我想要的任意多个节点。是的,不会有任何性能下降,因为Neo4j在磁盘上以长度分隔数组的形式保留了大部分内容,因此访问节点1与访问节点1000000的成本相同。这对我来说非常奇怪。如果你想在两个项目上工作,两者之间没有任何关系,那么在MySQL中,我可以创建另一个模式,为我想要的任何东西赋予不同的权限。我不能在neo4j中做同样的事情?奇怪的是,多租户应用程序中的子图的问题是,你不能给用户运行密码查询的权限,因为这样他们就可以看到属于其他租户的子图中的数据,除非你进入对他们的查询执行手术的混乱行业。每个用户运行一个单独的实例将意味着设置数千个实例,这实际上是不可行的相关问题虽然这个链接可能会回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会变得无效。奇怪的是,我给出了程序的名称、链接、它为用户做了什么,以及它与neo4j建议在其系统中设置多个模式的方式有何不同。这不仅仅是一个链接式的答案。@NiteRain我的解释是,不,你没有-这篇文章,以其当前的形式,总结为“这是一个工具的名称,我发现它很有用,因为它比这两种其他方式更好”,但没有详细说明它实际上是什么或它有什么不同(我相信这是一个bash脚本,它允许在数据库实例之间快速切换,但我不确定它是否允许它们并发运行,否则它会快速关闭/启动例如)。编辑:只注意发布后的计时。