我正在将Neo4J嵌入式数据库与OGM一起使用,并通过OGM SessionFactory在目录中创建数据库服务:
Configuration configuration = new Configuration.Builder()
.uris("C:\neoEmbeddedDb")
.build();
factory = new SessionFactory(configuration, packages);
这很好,但现在我想用Neo4J浏览器工具浏览创建的数据库。当我阅读时,我必须通过Bolt公开我的数据库才能访问它。
在Neo4J Embedded留档中,他们使用GraphDatabase aseService并简单地指定一个额外的螺栓驱动程序来公开数据库:
GraphDatabaseService graphDb = new GraphDatabaseFactory()
.newEmbeddedDatabaseBuilder( DB_PATH )
.setConfig( bolt.type, "BOLT" )
.setConfig( bolt.enabled, "true" )
.setConfig( bolt.address, "localhost:7687" )
.newGraphDatabase();
但不幸的是,在使用OGM SessionFactory时,我没有这个选项。我尝试使用多个URI调用Configuration Builder:
Configuration configuration = new Configuration.Builder()
.uris(new String[]{this.databasePath.toUri().toString(), "localhost:7687"})
.build();
但它似乎忽略了第一个URI(我的文件位置),而是在临时位置创建数据库。
调试输出将相应的消息记录到控制台:
Creating temporary file store: file:/C:/Temp/neo4jTmpEmbedded.db2736315981519762299/database/
有人能解释一下我如何通过bolt公开嵌入式数据库,或者使用Neo4J浏览器访问它吗?
非常感谢!
解决方案
在meistermeier的帮助下,我能够创建一个真正的EmbeddedDatabase并将我的OGM连接到它。我添加了Bolt连接选项,因为我在留档中找到了它们。现在,数据库已通过Bolt创建并正确公开。我可以连接我的Neo4J桌面Windows浏览器。
最终代码为
BoltConnector boltConnector = new BoltConnector(_BOLT_CONNECTION_STRING);
GraphDatabaseService graphDb = new GraphDatabaseFactory()
.newEmbeddedDatabaseBuilder(databasePath.toFile())
.setConfig(boltConnector.type, "BOLT" )
.setConfig(boltConnector.enabled, "true" )
.setConfig(boltConnector.listen_address, "localhost:7687" )
.setConfig(GraphDatabaseSettings.auth_enabled, "false")
.newGraphDatabase();
registerShutdownHook(graphDb);
// connect OGM session factory to embedded database
EmbeddedDriver driver = new EmbeddedDriver(graphDb);
final String[] packages = new String[] {
"Entity domain package",
};
factory = new SessionFactory(driver, packages);
首先:Neo4j OGM除了创建与数据库的连接外,不负责任何更复杂的数据库启动。为Neo4j实例提供自定义配置将使您的应用程序负责正确设置它。
第二:你想要达到的目标是不可能的。至少不能使用为Neo4j浏览器提供服务的另一个服务器实例,该浏览器可以在启动后连接到任何bolt协议服务器。您可以启动一个嵌入式实例,如果确实需要,可以打开bolt端口。但不会部署内置的Neo4j浏览器。
但毕竟让我解释一下为什么您会看到临时DB文件夹消息:在您的设置片段中,我可以看到两个实例正在创建:一个通过创建GraphDatabase aseService
的显式实例,另一个通过配置。第一个很明显,第二个不太明显。我只是假设您没有使用最新版本的Neo4j-OGM(在撰写此答案时为3.1.8)。
方法/参数URI仅用于有关因果集群和路由的其他URI(3.1.8之前)。您必须将uri与单个uri一起使用(或者bolt://....或file:///...
)在您的情况下。对于未定义的uri,Neo4j OGM的行为是回退到临时嵌入实例。
此问题的另一个解决方案是不为会话工厂提供配置,而是提供嵌入式驱动程序实例。这可以包装已经配置的GraphDatabaseService,就像新的SessionFactory(新的EmbeddedDriver(GraphDatabaseService),…) 。然后,您将有一个暴露的bolt端口,但遗憾的是,它没有运行的浏览器。
在我的拓扑中,当元组从spout转移到bolt或从bolt转移到bolt时,我看到大约1-2 ms的延迟。我使用纳秒时间戳来计算延迟,因为整个拓扑运行在单个Worker中。拓扑是在集群中运行的,集群运行在具有生产能力的硬件中。 根据我的理解,在这种情况下,元组不需要序列化/反序列化,因为所有东西都在单个JVM中。我已经将大多数喷流和螺栓的并行性提示设置为5,并且喷流仅以每秒100的速率产生事件。我
我有一个小拓扑。它有一个Kafka喷口,一个从喷口读数的螺栓(螺栓a)。螺栓A发射到两个螺栓(螺栓B和螺栓C)。我使用了字段分组。螺栓A发出两种不同类型的数据。一个用于螺栓B,另一个用于螺栓C。 我的问题是,我是否可以这样配置storm,使用于Bolt B的数据总是流向Bolt B的实例,而用于Bolt C的数据总是流向Bolt B的实例?目前,我正在检查螺栓中接收的数据,并跳过不需要的数据。
我想知道bolts是如何与DB交互的。至于我从https://storm.apache.org/documentation/commanding-the-parallelism-of-a-storm-topology.html中了解到,像spout和bolt这样的节点实际上被分配到了不同的工作进程,并且可能运行在不同的机器上,如果是这样的话,那么不同机器上的任务在同一个bolt中是如何连接到同一个
我有一个非常简单的Storm螺栓,从Kafka喷口输入,应该只是写到标准输出。它扩展了BaseRichBolt。有关的两种方法是:
我的拓扑看起来是这样的:Bolt A向Bolt B和C发出相同的元组,每个元组都将数据持久化到Cassandra。这些操作不是幂等的,并且包括对两个不同计数器列族的更新。我只对元组失败和在Cassandra的某些异常(不是读/写超时,只是QueryConsistency或Validation异常)中重播它感兴趣。问题是,如果bolt B失败,相同的元组将从spout重播,并再次发送到bolt C,
使用1.8。2--尝试(最初)设置2节点HA群集。 以下部分“22.5.4。启动Neo4j嵌入HA模式"的 http://docs.neo4j.org/chunked/stable/ha-setup-tutorial.html 我已将以下内容添加到我的pom中。xml: 并将我的application-content.xml修改如下: 和 /etc/白兔。属性包含: 节点1(地址:192.168.