我在Storm中的一个插件是一个在Neo4j上增加优势的模块。 如果我使用并行性,我有重复。这是代码:
try {
Connection connection = getNeo4jConnection();
try {
Trip trip = (Trip) tuple.getValueByField("trip");
try (Statement stmt = connection.createStatement()) {
String query = "MATCH (u:Airport {name:'" +
trip.getOutgoingAirport() + "'}), (r:Airport {name:'" +
trip.getIngoingAirport() + "'})" +
" CREATE UNIQUE (u)-[:FLIGHT_TO { amount: '"+ 1 +"' }]->(r)";
System.out.println("QUERY " + query);
stmt.execute(query);
}
} finally {
connection.close();
}
} catch (SQLException e) {
System.out.println(e.getMessage());
}
collector.ack(tuple);
我正在尝试,所以不要介意丑陋的try catch
,它不是生产代码。
使用以下命令创建连接:
private static Connection getNeo4jConnection() throws SQLException {
Driver driver = new org.neo4j.jdbc.Driver();
Properties properties = new Properties();
properties.put("user", "neo4j");
properties.put("password", "neo4j");
String url = "jdbc:neo4j://localhost:7474/";
return driver.connect(url, properties);
}
正如您所看到的,查询类似于:MATCH (u:Airport {name:'CIA'}), (r:Airport {name:'STN'}) CREATE UNIQUE (u)-[:FLIGHT_TO { amount: '1' }]->(r)
。
现在我已经预料到,正如你可以在文档上看到的那样,neo4j有酸交易所以我会假设我没有重复,但是在使用并发螺栓时我有它们。我认为这是一个竞赛条件,因为如果我使用1个线程,它就不会发生。
你能帮我弄清楚我做错了吗?
答案 0 :(得分:0)
每个线程可以使用一个连接,因此您不必为每个语句重新创建它们。
实际上,多线程CREATE UNIQUE
操作没有唯一性保证。
您必须锁定有问题的两个节点。 例如。通过删除不存在的财产。
MATCH (u:Airport {name:{1}}), (r:Airport {name:{2}})
REMOVE u._lock_, r._lock_
MERGE (u)-[:FLIGHT_TO]->(r) ON CREATE SET f.amount = {3}
PS:您还希望使用机场名称和金额的参数。使用预准备语句和pst.setString(1,trip.getOutgoingAirport());