2013-03-15 37 views
5

Tôi đã thử ví dụ được đưa ra here sau một số sửa đổi nhỏ - chủ yếu là tôi đã thêm mệnh đề where mà không khớp - cho mục đích thử nghiệm.Neo4j cypher query slow performance

Trên hệ thống của tôi (1.9.M04 - java 6u43 - ubuntu 12.04 - AMD Phenom II 1090T -X6) truy vấn đơn giản

Chỉ với 1 nút trong cơ sở dữ liệu (cũng nhúng) mất 262 mili giây. Rõ ràng là có điều gì đó không ổn. Điều gì có thể là vấn đề ?

Cảm ơn

public void test() 
    { 
     GraphDatabaseService db = g = new GraphDatabaseFactory().newEmbeddedDatabase("./neo4j1test"); 

     long id; 
     Transaction tx = db.beginTx(); 
     try 
     { 
      Node refNode = db.createNode(); 
      id = refNode.getId(); 
      refNode.setProperty("name", "reference node"); 
      tx.success(); 
     } 
     finally 
     { 
      tx.finish(); 
     } 


     ExecutionEngine engine = new ExecutionEngine(db); 
     ExecutionResult result = engine.execute("start n=node("+id+") where (n.name = \"reference node\") return n.name"); 
     long time = System.currentTimeMillis(); 
     result = engine.execute("start n=node("+id+") where (n.name = \"reference node\") return n.name"); 
     time = (System.currentTimeMillis() - time); 
     System.out.println("Time taken : " + time + " ms."); 
    } 
+0

Có lẽ nó chỉ là chi phí neo4j bootstrapping, bạn nên cố gắng lặp lại các truy vấn nhiều lần, trong trường hợp đó tôi nghĩ rằng thời gian thực hiện nên thấp hơn đáng kể . – remigio

+0

trước tiên hãy thử làm ấm bộ đệm. chạy lệnh này vài lần: 'start n = node (*) return count (n); bắt đầu r = rel (*) return count (r)'. thứ hai, bạn đo thời gian như thế nào? nó là thời gian được đưa ra bởi đầu ra cypher hay đơn giản là thời gian trước và sau dòng mã cụ thể? trong trường hợp thứ hai độ trễ có thể nằm giữa ứng dụng của bạn và máy chủ – ulkas

+0

Ok đây là cách hoạt động của nó - Tôi đã đo thời gian thực hiện truy vấn thứ hai (dự kiến ​​thực thi đầu tiên sẽ khởi tạo bộ nhớ đệm nội bộ, v.v.). Nhưng ở đây nó khác. nó là lần thực hiện thứ ba trở đi, phải mất ít thời gian hơn đáng kể. Tôi không nhận được những gì là đặc biệt về thực hiện 3 cho cùng một truy vấn. remigio cảm ơn cho tip, ulkas, tôi đang sử dụng nó trong chế độ nhúng – Shilu

Trả lời

0

Bạn có thể muốn chỉ số bất động sản tên của bạn (xem indexing). Sau đó, bạn có thể truy vấn như sau:

START n=node:your_index_name("name:the_indexed_name") RETURN n; 

Tra cứu nút thông qua chỉ mục sẽ nhanh hơn rất nhiều so với lọc qua mệnh đề WHERE.

+0

vâng tôi biết điều đó. truy vấn chỉ dành cho mục đích thử nghiệm - để xem cách nó hoạt động. – Shilu

+0

Hi @tstorms, tôi có vấn đề tương tự với neo4j. Tôi đã tạo ra một số nút với chỉ mục và kết nối nó với các mối quan hệ. Bây giờ khi tôi cố gắng để có được số lượng lẫn nhau, Nó đang thực hiện rất chậm. Truy vấn của tôi mất gần 2-3 giây để tìm nạp khoảng 150 bản ghi từ neo4j. –

0

Tôi có vấn đề tương tự với kỹ thuật truy vấn Cypher. Hiệu suất kém do chi phí xử lý truy vấn khai báo Cypher. Tôi đồng ý với bạn rằng chi phí trên không thể chấp nhận được.

Chúng tôi nên sử dụng API lõi Java để có toàn bộ sức mạnh của neo4j.

Xem bài viết này: Get the full neo4j power by using the Core Java API

Và đây: Performance of Graph Query Languages: Comparison of Cypher, Gremlin and Native Access in Neo4j