Neo4j检索优化和Java项目配置

1. Neo4j 检索速度慢

通过创建索引解决。

Neo4j索引原理参考:neo4j - 查询效率的几种优化思路

1.1 python

  • 先阅读(https://blog.csdn.net/MaoziYa/article/details/114195824)
  • 代码:graph.run(‘CREATE INDEX ON : PersonTest(name)’)

钟爱python,操作方便叻!

1.2 neo4j-shell + cypher-shell

因为使用的是Linux远程服务,所有没有直接访问浏览器创建和修改索引。

  • bin/neo4j-shell:查看当前创建的索引及状态
schema

# Indexes
#   ON :企业名称(企业名称) ONLINE  
#   ON :企业名称(name) ONLINE  
# 
# No constraints

# 注意索引应当是 ONLINE 状态才生效
  • bin/cypher-shell:创建索引
# 输入密码后

# (1)创建
CREATE INDEX ON : 企业名称(登记机关);

# 返回信息:
# 0 rows available after 38 ms, consumed after another 0 ms
# Added 1 indexes

# (2)删除
DROP INDEX ON :企业名称(登记机关);

# 返回信息:
# 0 rows available after 5 ms, consumed after another 0 ms
# Removed 1 indexes

# 配合neo4j-shell查看索引是否创建成功

2. springCloud+Neo4j

2.1 检索速度慢

当使用接口访问Neo4j查询数据时,用时非常长, 大概1400+ms

我排查了几次数据库索引构建,发现索引构建正常

在本地maven一个简单的项目计算耗时时,发现driver的构建就需要1300+ms,实际检索语句run以及检索结果处理的时间只有57ms。

12:40:07.007 [main] INFO org.test.neo.App - Neo4jDao process time:1329
12:40:07.067 [main] INFO org.test.neo.App - Neo4jDao process time:57

我这该死的编码坏习惯,没有将neo4jUtil单独封装成类,而是直接写入到dao中。导致检索速度过慢……

2.3 Java Neo4j Driver&Session

  • 建立连接 Driver driver = GraphDatabase.driver()
  • 创建会话 Session session = driver.session()

项目中,Util返回session的初始化配置,接口的吞吐量相对大些。

2.2 压力测试中Neo4j报错

java.lang.IllegalStateException: Existing open connection detected
	at org.neo4j.driver.internal.NetworkSession.lambda$acquireConnection$27(NetworkSession.java:447)
	at java.util.concurrent.CompletableFuture.uniCompose(CompletableFuture.java:966)
	at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:940)
	at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
	at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1975)
	at org.neo4j.driver.internal.util.Futures.lambda$asCompletionStage$0(Futures.java:74)
	at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
	at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485)
	at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.DefaultPromise.access$000(DefaultPromise.java:33)
	at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.DefaultPromise$1.run(DefaultPromise.java:435)
	at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
	at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
	at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
	at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
	at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(Thread.java:748)

未解决。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是一个简单的 Java 项目集成 Neo4j 的示例: 1. 首先,您需要在项目中添加 Neo4j 驱动程序的依赖项。可以通过 Maven 或 Gradle 添加依赖项。如果您使用 Maven,请在 pom.xml 文件中添加以下依赖项: ```xml <dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java-driver</artifactId> <version>4.2.1</version> </dependency> ``` 如果您使用 Gradle,请在 build.gradle 文件中添加以下依赖项: ```groovy implementation 'org.neo4j.driver:neo4j-java-driver:4.2.1' ``` 2. 然后,您需要创建一个 Neo4j 驱动程序实例。您可以使用以下代码: ```java Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password")); ``` 此代码将创建一个使用 Bolt 协议连接到本地 Neo4j 数据库的驱动程序实例。请注意,您需要替换 "password" 为您自己的数据库密码。 3. 接下来,您可以使用驱动程序实例执行查询。以下是一个简单的示例: ```java try (Session session = driver.session()) { Result result = session.run("MATCH (n) RETURN n.name AS name"); while (result.hasNext()) { Record record = result.next(); System.out.println(record.get("name").asString()); } } ``` 此代码将执行一个查询,返回所有节点的名称,并将结果打印到控制台。 4. 最后,您需要关闭驱动程序实例。以下是一个示例: ```java driver.close(); ``` 这将关闭驱动程序实例并释放与数据库的连接。 完整的示例代码如下: ```java import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; import org.neo4j.driver.Record; import org.neo4j.driver.Result; import org.neo4j.driver.Session; public class Neo4jDemo { public static void main(String[] args) { Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password")); try (Session session = driver.session()) { Result result = session.run("MATCH (n) RETURN n.name AS name"); while (result.hasNext()) { Record record = result.next(); System.out.println(record.get("name").asString()); } } driver.close(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值