java - CREATE UNIQUE 导致与 Neo4j 和 JDBC 的重复关系

标签 java jdbc neo4j acid

我在 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 具有酸性事务,因此我假设我没有重复项,但在使用并发 bolt 时我有它们。我认为这是一种竞争情况,因为如果我使用 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());

关于java - CREATE UNIQUE 导致与 Neo4j 和 JDBC 的重复关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34635466/

相关文章:

java - stack.peek() 方法 - Java

java - 您可以使用 testng 工厂创建多个测试吗?

java - 在调车场保留括号

java - 如何使用select关键字显示oracle数据库中的记录

neo4j - 如何在 Cypher 中返回集合联盟的唯一元素?

java - 使用 Java 获取 Neo4j 嵌入式图形数据库的 Subgraph

java - Sonarqube和处理异常机制

java - 为什么即使我使用 JDBC Driver 4.0 也需要在 Tomcat Web 应用程序中调用 Class.forName?

java - 将 Java 应用程序与 SQL Server 连接

neo4j - 在 Neo4j 中基于数组值创建关系