我有一个包含会员和产品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为我解决这个问题。