Исходя из реляционного мышления базы данных, кажется странным, что только один граф db на экземпляр neo4j. Является ли идея, что мы выполняем множественные подграфы, начиная с root?
Спасибо
Исходя из реляционного мышления базы данных, кажется странным, что только один граф db на экземпляр neo4j. Является ли идея, что мы выполняем множественные подграфы, начиная с root?
Спасибо
Понятие "корень" node уходит. С этим связано множество проблем, большинство из которых вращаются вокруг плотности node.
Я считаю, что в основе вашего вопроса лежит дизайн базы данных, и разумнее ли иметь несколько экземпляров базы данных графа или один экземпляр с несколькими подграфами.
На самом деле это зависит от вас, но я бы пошел с идеей подграфа, поскольку он позволяет передавать некоторые ваши данные в одном и том же соединении, а Neo4j на самом деле не представляет никаких штрафных санкций за производительность, если вы это сделаете, разделенный, то единственной проблемой, с которой вы в конечном итоге столкнетесь, является максимальный размер узлов/отношений, но это искусственный лимит, который будет наложен позже.
Если он предназначен только для разработки, вы можете использовать neo4j-instance, он помогает мне работать сразу с несколькими базами данных neo4j (на в то же время, в основном, установка каждого на другом порту), и он намного лучше, чем добавление метки для различения между различными схемами или префиксов узлов с именем схемы. Поскольку вам не нужно изменять способ взаимодействия с базами данных neo4j, поскольку они все еще являются отдельными базами данных на разных портах.
Да, я недавно создал несколько экземпляров 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, где порт будет назначен во время выполнения с полностью загруженной базой данных.