我可以有一个 temporary/alternative neo4j 图表来测试吗?
Can I have a temporary/alternative neo4j graph for testing?
我在项目中使用 Py2neo。大多数时候,neo4j 服务器 运行s 在本地主机上,所以为了连接到图表,我只是这样做:
g = Graph()
但是当我 运行 测试时,我想连接到另一个图表,最好是我可以丢弃而不会产生任何后果的图表。
我想要一个 "production" 图表,可能设置为即使它也在本地主机上 运行,测试也无法访问它。
这可以做到吗?
更新 0 - 提出这个问题的更好方法可能是如何让我的本地主机 Neo4J 在两个不同的端口上提供 2 个数据库?一旦我开始工作,使用 REST 客户端连接到一个或另一个就很简单了。我正在 运行 在 Ubuntu 工作站上安装 Neo4J 的最新 .deb 版本(如果重要的话)。
你可以运行不同机器上的neo4j服务器并通过REST服务访问它。
在 neo4j-server.properties 中,您可以取消注释 IP 地址为 0.0.0.0 的行
这将允许从任何地方访问该服务器。现在我不知道 Python 是什么,但是 Java 我正在使用 Java Rest 库来访问使用 Neo4j 的 Java Rest 库的服务器。看这里
更新0:三种方式完成你的愿望
方法一:在单独的机器上启动neo4j实例。然后使用一些 REST API 访问该实例。这样做的方法是进入 conf/neo4j-server.properties,然后找到这一行并取消注释。
#org.neo4j.server.webserver.address=0.0.0.0
方法二:在同一台机器上启动两个不同端口的neo4j实例,并使用REST服务来访问它们。为此,将 neo4j 发行版复制到两个单独的文件夹中。然后在 conf/neo4j-server.properties 中更改此行,并至少更改其中一个端口。
First Instance - org.neo4j.server.webserver.port=7474
org.neo4j.server.webserver.https.port=7473
Second Instance - org.neo4j.server.webserver.port=8484
org.neo4j.server.webserver.https.port=8483
方法 3: 从您的评论来看,您似乎想要这样做,而且确实这是最简单的方法。在同一个 Neo4J 实例上有两个独立的数据库。 要执行此操作,您无需更改任何配置文件,只需更改代码中的一行即可。我在 python 中没有完全这样做,但我已经这样做了在 Java。让我给你 Java 代码,你可以看到它是多么容易。
生产代码:
package rash.experiments.neo4j;
import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
public class Neo4JEmbedded
{
public static void main(String args[])
{
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory().newEmbeddedDatabase("db/productiondata/");
ExecutionEngine executionEngine = new ExecutionEngine(graphDatabaseService);
try(Transaction transaction = graphDatabaseService.beginTx())
{
executionEngine.execute("create (node:Person {userId: 1})");
transaction.success();
}
ExecutionResult executionResult = executionEngine.execute("match (node) return count(node)");
System.out.println(executionResult.dumpToString());
}
}
测试代码:
package rash.experiments.neo4j;
import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
public class Neo4JEmbedded
{
public static void main(String args[])
{
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory().newEmbeddedDatabase("db/testdata/");
ExecutionEngine executionEngine = new ExecutionEngine(graphDatabaseService);
try(Transaction transaction = graphDatabaseService.beginTx())
{
executionEngine.execute("create (node:Person {userId: 1})");
transaction.success();
}
ExecutionResult executionResult = executionEngine.execute("match (node) return count(node)");
System.out.println(executionResult.dumpToString());
}
}
注意行的区别:
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory().newEmbeddedDatabase("db/testdata/");
这将创建两个单独的文件夹 db/productiondata 和 db/testdata。这两个文件夹都包含单独的数据,您的代码可以根据您的要求使用其中一个文件夹。
我很确定,在您的 python 代码中,您必须做几乎相同的事情。类似(注意此代码可能不正确):
g = Graph("/db/productiondata")
g = Graph("/db/testdata")
您可以在同一台机器上拥有多个 Neo4j 运行 实例,方法是将它们配置为使用不同的端口,即 7474 用于开发,7473 用于测试。
Graph()
默认为 http://localhost:7474/db/data/
但您也可以显式传递连接 URI:
dev = Graph()
test = Graph("http://localhost:7473/db/data/")
prod = Graph("https://remotehost.com:6789/db/data/")
不幸的是,这是一个目前没有完美解决方案的问题。但是,有一些选项可能足以满足您的需求。
首先,看一下py2neo构建脚本:https://github.com/nigelsmall/py2neo/blob/release/2.0.5/bau
这是一个 bash 脚本,它为每个需要测试的版本生成一个新的数据库实例,预先从一个空存储开始,然后关闭。它使用默认端口 7474,但在属性文件中自动调整它应该是一个简单的更改。具体来说,您可能需要查看 test
、neo4j_start
和 neo4j_stop
函数。
此外,py2neo 提供了一个名为 neobox 的扩展:
http://py2neo.org/2.0/ext/neobox.html
这是一种在空闲端口上设置新数据库实例 运行 的快速简单方法,在这种情况下可能会有所帮助。
请注意,一般来说,在测试之间清除数据存储不是一个好主意,因为这是一个缓慢的操作,并且会严重影响测试套件的 运行 时间。出于这个原因,一个适用于所有测试的测试数据库是一个更好的主意,尽管在编写测试时需要稍微考虑一下,以免它们重叠。
展望未来,Neo4j 将获得 DROP
功能来帮助完成此类工作,但可能需要几个版本才能出现。
我在项目中使用 Py2neo。大多数时候,neo4j 服务器 运行s 在本地主机上,所以为了连接到图表,我只是这样做:
g = Graph()
但是当我 运行 测试时,我想连接到另一个图表,最好是我可以丢弃而不会产生任何后果的图表。
我想要一个 "production" 图表,可能设置为即使它也在本地主机上 运行,测试也无法访问它。
这可以做到吗?
更新 0 - 提出这个问题的更好方法可能是如何让我的本地主机 Neo4J 在两个不同的端口上提供 2 个数据库?一旦我开始工作,使用 REST 客户端连接到一个或另一个就很简单了。我正在 运行 在 Ubuntu 工作站上安装 Neo4J 的最新 .deb 版本(如果重要的话)。
你可以运行不同机器上的neo4j服务器并通过REST服务访问它。
在 neo4j-server.properties 中,您可以取消注释 IP 地址为 0.0.0.0 的行 这将允许从任何地方访问该服务器。现在我不知道 Python 是什么,但是 Java 我正在使用 Java Rest 库来访问使用 Neo4j 的 Java Rest 库的服务器。看这里
更新0:三种方式完成你的愿望
方法一:在单独的机器上启动neo4j实例。然后使用一些 REST API 访问该实例。这样做的方法是进入 conf/neo4j-server.properties,然后找到这一行并取消注释。
#org.neo4j.server.webserver.address=0.0.0.0
方法二:在同一台机器上启动两个不同端口的neo4j实例,并使用REST服务来访问它们。为此,将 neo4j 发行版复制到两个单独的文件夹中。然后在 conf/neo4j-server.properties 中更改此行,并至少更改其中一个端口。
First Instance - org.neo4j.server.webserver.port=7474
org.neo4j.server.webserver.https.port=7473
Second Instance - org.neo4j.server.webserver.port=8484
org.neo4j.server.webserver.https.port=8483
方法 3: 从您的评论来看,您似乎想要这样做,而且确实这是最简单的方法。在同一个 Neo4J 实例上有两个独立的数据库。 要执行此操作,您无需更改任何配置文件,只需更改代码中的一行即可。我在 python 中没有完全这样做,但我已经这样做了在 Java。让我给你 Java 代码,你可以看到它是多么容易。
生产代码:
package rash.experiments.neo4j;
import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
public class Neo4JEmbedded
{
public static void main(String args[])
{
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory().newEmbeddedDatabase("db/productiondata/");
ExecutionEngine executionEngine = new ExecutionEngine(graphDatabaseService);
try(Transaction transaction = graphDatabaseService.beginTx())
{
executionEngine.execute("create (node:Person {userId: 1})");
transaction.success();
}
ExecutionResult executionResult = executionEngine.execute("match (node) return count(node)");
System.out.println(executionResult.dumpToString());
}
}
测试代码:
package rash.experiments.neo4j;
import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
public class Neo4JEmbedded
{
public static void main(String args[])
{
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory().newEmbeddedDatabase("db/testdata/");
ExecutionEngine executionEngine = new ExecutionEngine(graphDatabaseService);
try(Transaction transaction = graphDatabaseService.beginTx())
{
executionEngine.execute("create (node:Person {userId: 1})");
transaction.success();
}
ExecutionResult executionResult = executionEngine.execute("match (node) return count(node)");
System.out.println(executionResult.dumpToString());
}
}
注意行的区别:
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory().newEmbeddedDatabase("db/testdata/");
这将创建两个单独的文件夹 db/productiondata 和 db/testdata。这两个文件夹都包含单独的数据,您的代码可以根据您的要求使用其中一个文件夹。
我很确定,在您的 python 代码中,您必须做几乎相同的事情。类似(注意此代码可能不正确):
g = Graph("/db/productiondata")
g = Graph("/db/testdata")
您可以在同一台机器上拥有多个 Neo4j 运行 实例,方法是将它们配置为使用不同的端口,即 7474 用于开发,7473 用于测试。
Graph()
默认为 http://localhost:7474/db/data/
但您也可以显式传递连接 URI:
dev = Graph()
test = Graph("http://localhost:7473/db/data/")
prod = Graph("https://remotehost.com:6789/db/data/")
不幸的是,这是一个目前没有完美解决方案的问题。但是,有一些选项可能足以满足您的需求。
首先,看一下py2neo构建脚本:https://github.com/nigelsmall/py2neo/blob/release/2.0.5/bau
这是一个 bash 脚本,它为每个需要测试的版本生成一个新的数据库实例,预先从一个空存储开始,然后关闭。它使用默认端口 7474,但在属性文件中自动调整它应该是一个简单的更改。具体来说,您可能需要查看 test
、neo4j_start
和 neo4j_stop
函数。
此外,py2neo 提供了一个名为 neobox 的扩展: http://py2neo.org/2.0/ext/neobox.html
这是一种在空闲端口上设置新数据库实例 运行 的快速简单方法,在这种情况下可能会有所帮助。
请注意,一般来说,在测试之间清除数据存储不是一个好主意,因为这是一个缓慢的操作,并且会严重影响测试套件的 运行 时间。出于这个原因,一个适用于所有测试的测试数据库是一个更好的主意,尽管在编写测试时需要稍微考虑一下,以免它们重叠。
展望未来,Neo4j 将获得 DROP
功能来帮助完成此类工作,但可能需要几个版本才能出现。