2016-03-28 1 views
0
public void updateTopCallers(){ 
String queryString1 = "MATCH(a:Account) WHERE a.name='" + key + "' MATCH(p:Person)-[:USED_BY]->(a) RETURN p.id as personId LIMIT 1"; 
try { 
    ResultSet resultSet = getQueryResult(queryString1);//in debugging, process didn't continue after this line. 
    if (resultSet.next()){ 
     ownerId = resultSet.getString("personId"); 
     System.out.println("ownerId:"+ownerId); 
     //In here also I'm executing few other cypher queries 
     //using same Neo4jUtil instance. 
    } 
}catch (Exception e){ 
    e.printStackTrace(); 
} 

}Cypher Abfrage ohne resultset in Neo4j Jdbc

Rückkehr stecken ausführt. Ich verwende auch viele Threads für diese Aufgabe gleichzeitig. Wie ich beobachtet habe, tritt dies auf, wenn ich eine einzelne Instanz meiner Neo4jUtil-Klasse verwende (wie im Single-Design-Muster).

Hier ist meine Neo4jUtil-Klasse.

public class Neo4jUtil { 
private Neo4jConnection neo4jConnection = null; 
private String restUrl = null; 
private String driver = null; 
private String userName = null; 
private String passWord = null; 
private static PropertiesUtility propertiesUtility = null; 

private Neo4jUtil(){ 
    try { 
     restUrl = getPropertiesCache().getCofigProperty("neo4j_url"); 
     driver = getPropertiesCache().getCofigProperty("neo4j_driver"); 
     userName = getPropertiesCache().getCofigProperty("neo4j_user"); 
     passWord = getPropertiesCache().getCofigProperty("neo4j_pwd"); 
     createDbConnection(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void createDbConnection(){ 
    try { 
     Class.forName(driver); 
     neo4jConnection = (Neo4jConnection) DriverManager.getConnection(restUrl,userName,passWord); 
     System.out.println("neo4jConnection:"+neo4jConnection.toString()); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

private static PropertiesUtility getPropertiesCache() throws Exception { 
    if(propertiesUtility==null){ 
     propertiesUtility = PropertiesUtility.getInstance(); 
     return propertiesUtility; 
    } 
    else { 
     return propertiesUtility; 
    } 
} 

private static class Neo4jHolder{ 
    private static final Neo4jUtil NEO4J_INSTANCE = new Neo4jUtil(); 
} 

public static Neo4jUtil getInstance() { 
    return Neo4jHolder.NEO4J_INSTANCE; 
} 

// Querying 
public ResultSet getQueryResult(String queryString){ 
    try{ 
     Neo4jStatement stmt = (Neo4jStatement) neo4jConnection.createStatement(); 
     ResultSet rs = stmt.executeQuery(queryString); 
     return rs; 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

}

Wenn ich folgende Methode bin mit Ergebnis für bestimmte Chiffre gesetzt bekommen es funktioniert gut.

Ich benutze neo4j-jdbc 2.3.2 als meine neo4j Java-Client.

+0

Wenn ich neo4j-rest-graphdb Client verwendet, funktioniert es gut. Ich hatte ein Problem mit diesem Client, wenn ich Threads bin. – Hasitha

+0

was meinst du mit "stecken geblieben" –

+0

Kannst du den Code vereinfachen, ist dieser Code ein Chaos und es ist zu schwer, um über die Beantwortung dieser Frage nachzudenken. –

Antwort

0

Es kommt zwei Möglichkeiten mir Zuerst Dieses

final List<String> keyList = keyScanCursor.getKeys(); 

Könnte Rückkehr nicht alle Schlüssel, aber etwas zu begrenzen. Die Standardabfrage neo4j gibt 25 Ergebnisse zurück.

Zweite Sie könnten eine Menge Personen zu einem Schlüssel haben und Sie verlieren sie einschränkende Rückkehr Aussage.

MATCH(person:Person)-[:USED_BY]->(a) RETURN person LIMIT 1" 
+0

Ich bekomme Schlüssel von einer Redis-Datenbank, die 15000 Schlüssel enthält. Weil der Schlüssel msisdn ist, sollte es mindestens eine ähnliche Anzahl von Personen geben. – Hasitha