【问题标题】:CREATE UNIQUE causes duplicate relationships with Neo4j and JDBCCREATE UNIQUE 导致与 Neo4j 和 JDBC 的重复关系
【发布时间】:2016-01-06 14:24:55
【问题描述】:

我在 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 个线程,它就不会发生。

你能帮我弄清楚我做错了什么吗?

【问题讨论】:

    标签: java jdbc neo4j acid


    【解决方案1】:

    每个线程可以使用一个连接,因此不必为每个语句重新创建它们。

    实际上对于多线程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());

    【讨论】:

    • 嗯...所以我通过 REMOVE 获得了锁? (感谢您的建议)
    • 我的意思是删除不存在的东西??认真的吗?
    • 抱歉 :( cypher 中没有明确的 lock 语句(还)
    • 我尝试使用"MATCH (u:Airport {name:{1}}), (r:Airport {name:{2}}) " + "REMOVE u._lock_, r._lock_ " + "MERGE (u)-[f:FLIGHT_TO]->(r) ON CREATE SET f.amount = {3}",但仍然有一些重复。我认为这是错误的做法。我应该直接使用 Java API 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多