在Orientdb 3.0 RC1(Tinkerpop / Gremlin社区版)中我有2个顶点类:
- '公司'有1个属性'地址'
- '地址'有1个房产'地址'在此属性上具有UNIQUE_HASH_INDEX
需要创建课程的边缘'位置'介于'公司'顶点到相应的地址'基于具有相同地址的顶点'财产价值。
首先,我尝试使用Gremlin,方法如下:
g.V().hasLabel("Company").as("a").
V().hasLabel("Address").as("b").
where("a", eq("b")).by("address").
addE("Location").next()
但是中间遍历没有达到指数.....我想OrientDB-Gremlin实现尚未完成或我的上述查询不好。
然后我转换了上面的内容以使用sideEffect():
g.V().hasLabel("Company").sideEffect{g.V().hasLabel("Address").has("address",it.get().property('address').value()).addE('Location').from(it.get()).next()}
但是在快速添加大约1k边后,查询突然中止,OrientDB会记录很多这样的警告:
" WARNI {db = ter1050}此数据库实例有1280个打开的命令/查询结果集,请确保使用OResultSet.close()"
关闭它们
再一次.....我的查询有问题或者我遇到了错误。
我也没有找到在OrientDB SQL中做到这一点的方法。
我知道这可以使用Java中的Tinkerpop API完成,但我希望更简单。
答案 0 :(得分:0)
试试这个:
OrientDB orientDB = new OrientDB("remote:localhost/", "<username>", "<password>", OrientDBConfig.defaultConfig());
ODatabaseDocument db = orientDB.open("<db name>","<username>", "<password>");
OResultSet result = db.command("select from Company");
OResultSet address_class = db.command("select from Address");
List<OResult> company = new ArrayList<OResult>();
List<OResult> address = new ArrayList<OResult>();
while(result.hasNext())
{
OResult record = result.next();
company.add(record);
}
while(address_class.hasNext())
{
OResult record = address_class.next();
address.add(record);
}
for(int i = 0; i < company.size(); i++)
{
String company_address = company.get(i).getProperty("address");
for(int j = 0; j < address.size(); j++)
{
String addresses = address.get(j).getProperty("address");
if(company_address.equals(addresses))
{
ORecordId company_rid = company.get(i).getProperty("@rid");
ORecordId addresses_rid = address.get(j).getProperty("@rid");
db.command("create edge Location from " + company_rid + " to " + addresses_rid);
}
}
}
db.close();
orientDB.close()
这是结果:
希望有所帮助
此致