我正在通过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选项文件中,具有默认值。
再次感谢你。