Во всяком случае, чтобы иметь несколько баз данных на экземпляре neo4j?

Исходя из реляционного мышления базы данных, кажется странным, что только один граф db на экземпляр neo4j. Является ли идея, что мы выполняем множественные подграфы, начиная с root?

Спасибо

Ответы

Ответ 1

Понятие "корень" node уходит. С этим связано множество проблем, большинство из которых вращаются вокруг плотности node.

Я считаю, что в основе вашего вопроса лежит дизайн базы данных, и разумнее ли иметь несколько экземпляров базы данных графа или один экземпляр с несколькими подграфами.

На самом деле это зависит от вас, но я бы пошел с идеей подграфа, поскольку он позволяет передавать некоторые ваши данные в одном и том же соединении, а Neo4j на самом деле не представляет никаких штрафных санкций за производительность, если вы это сделаете, разделенный, то единственной проблемой, с которой вы в конечном итоге столкнетесь, является максимальный размер узлов/отношений, но это искусственный лимит, который будет наложен позже.

Ответ 2

Если он предназначен только для разработки, вы можете использовать neo4j-instance, он помогает мне работать сразу с несколькими базами данных neo4j (на в то же время, в основном, установка каждого на другом порту), и он намного лучше, чем добавление метки для различения между различными схемами или префиксов узлов с именем схемы. Поскольку вам не нужно изменять способ взаимодействия с базами данных neo4j, поскольку они все еще являются отдельными базами данных на разных портах.

Ответ 3

Да, я недавно создал несколько экземпляров neo4j в финализме уровня сеанса pytest, предположим, что вы хотите запустить несколько экземпляров neo4j в localhost, здесь предполагается, что хост является одиночным (localhost), и если вы видите файл confo neo4j ($ neo4j_home/conf/neo4j.conf), конфигурации по умолчанию для http-порта 7474 и для болта 7687. Предположим, что один neo4j запущен с http-портом 7474, теперь вы не можете запустить другой экземпляр neo4j с 7474, вам нужно изменить порт в 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

@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, где порт будет назначен во время выполнения с полностью загруженной базой данных.