通过"加入"创建边缘2个班级

时间:2018-02-04 00:13:38

标签: orientdb gremlin

在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完成,但我希望更简单。

1 个答案:

答案 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()

这是结果:

enter image description here

希望有所帮助

此致