在Neo4j服务器模式下缓慢的密码查询 - jersey-REST

时间:2015-04-08 09:15:20

标签: java rest neo4j jersey cypher

我正在通过REST访问和查询图形数据库,使用Jersey和我正在获取带有结果的Json文件,但它比通过嵌入式查询它要慢。我的图表有350.000个节点和1.500.000个关系。当用户通过嵌入式访问数据库时,我不知道是否有办法不阻止数据库...谢谢

  • DOMAIN模型: 300.000个节点,1.500.000个关系(40种类型,包括IS_A类型)。大约有15个大的层次结构(每个层次结构在1.000到100.000个节点之间),这些层次结构(它的节点)与其他层次结构的节点相关。

  • QUERY:

MATCH (a: Concept{conceptid : '123456'}) <- [:RELCL] - (b: Concept) - [:REL {reltype: '112233'}] -> (c: Concept) - [:RELCL] -> (av: Concept {conceptid: '654321'}) RETURN DISTINCT b.conceptid AS CONCEPTID

请注意RELCL是IS_A关系。

请注意

MATCH (a: Concept{conceptid : '123456'}) <- [:RELCL] - (b: Concept) 

b返回300.000个节点。

请注意

(c: Concept)  - [:RELCL] -> (av: Concept {conceptid: '654321'}) 

c返回300.000个节点。

通过(Neo4j嵌入式)执行的时间:

GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
ExecutionEngine engine = new ExecutionEngine(graphDb);
ExecutionResult result = engine.execute(query));

= 12 s。

通过(Neo4j服务器模式(Neo4j Community 2.1.5) - jersey-REST)执行的时间:

final String txUri = SERVER_ROOT_URI + "transaction/commit";        
WebResource resourceQuery = Client.create().resource( txUri );
String payload = "{\"statements\" : [ {\"statement\" : \"" +query + "\"} ]}";
 ClientResponse responseQuery= resourceQuery
.accept( MediaType.APPLICATION_JSON )
.type( MediaType.APPLICATION_JSON )
.entity( payload )
.post( ClientResponse.class );

String res = String.format("POST [%s] to\n [%s], \nstatus code [%d %s], returned data: "+ System.getProperty( "file.separator" ) + "%s\n",
payload, txUri, responseQuery.getStatus(),
responseQuery.getClientResponseStatus(), responseQuery.getEntity( String.class ) );

= 240秒。

在Eclipse中执行这两个代码时,我输入运行配置 -Xms12G -Xmx16G 作为 VM Arguments。我看到,在执行嵌入式版本时,在javaw进程中RAM增加超过8GB。但是在执行Server-REST版本时,它只能达到130MB。 (我执行代码的PC有16GB的RAM)。

Neo4j GUI设置数据库配置,服务器配置和Java VM选项文件中,具有默认值。

再次感谢你。

0 个答案:

没有答案