创建边缘会导致线程挂起

时间:2014-04-14 18:45:47

标签: java neo4j cypher

我有一个包含会员和产品SKU的图表数据库。我想创建一个从成员到SKU集合的“看见”边缘。

但是,在对Node.createRelationshipTo的API调用和使用cypher查询时,创建边缘操作偶尔会挂起。

另外,我尝试创建一个新的虚拟成员来绘制边缘,如果这是某种锁定问题。

以下是我就此问题所做的各种尝试。

使用java API:

    for (Node node : nodes) {
        Transaction tx = graphDb.beginTx();
        Node memberNode = graphDb.createNode(DynamicLabel.label("Member"));
        // The following line is to use the same user.
        //Node memberNode = 
        //graphDb.findNodesByLabelAndProperty(DynamicLabel.label("Member"), "id",    
        //member_id).iterator().next();

        System.out.println("Marking sku as seen...");

        memberNode.createRelationshipTo(node, new RelationshipType() {
            @Override
            public String name() {
                return "seen";
            }
        });

        tx.success();
    }

使用Cypher:

    for (Node node : nodes) {
        Transaction tx = graphDb.beginTx();
        Object skuId = node.getProperty("id");
        if (skuId instanceof Integer){
            Integer iSkuId = (Integer) skuId;
            skuId = new Long(iSkuId);
        }
        String cypher = "MATCH (s:SKU {id:{sku_id}}), (m:Member {id:{member_id}})\n" +
                "CREATE (m)-[:seen]->(s)\n";

        HashMap<String, Object> params = new HashMap();
        params.put("member_id", member_id);
        params.put("sku_id", skuId);

        engine.execute(cypher, params);
        tx.success();
    }

我也在cypher中尝试过MERGE而不是CREATE。

这段代码的行为是我可以运行它几次就可以了,但是偶尔“将SKU标记为看到...”将被写入日志然后没有其他内容(它在绘制之前挂起)所有的边缘。)

此外,当我在此问题之后停止我的图表时,我会收到日志消息,例如:

  

14:16:55.882 [Thread-32] WARN oejutil.thread.QueuedThreadPool - qtp364159521 {STOPPING,8&lt; = 1&lt; = 80,i = 0,q = 0}无法停止线程[qtp364159521-57 ,如图5所示,主]   2014-04-14 18:17:18.099 + 0000 INFO [API]将启动超时设置为:120000ms,基于-1   检测到错误地关闭了数据库,执行恢复..

FIXED:

我需要用tx.close()关闭我的交易。

许多java示例都使用以下事务进行try-catch:

    try (Transaction tx = graphDb.beginTx())
    {

        tx.success();
    }

这会为你调用tx.close()。

但是,如果您没有使用最新的java,则必须使用旧样式try-catch,其中必须显式调用tx.close()。

疯狂道具让Andy Rosenbaum为我解决这个问题。

0 个答案:

没有答案
相关问题