2016-12-07 58 views
0

我有Spark应用程序,它将数据插入到妖精的巨人中。但它会插入具有相同名称的重复顶点。测试条件'如果不是结果':'不匹配,并且我在同一个会话中。如何防止泰坦产生具有相同属性的重复记录?

def savePartition(p): 
    print ('savePartition', p) 
    from goblin import element, properties 

    class Brand(element.Vertex): 
     name = properties.Property(properties.String) 

    import asyncio 

    loop = asyncio.get_event_loop() 

    from goblin.app import Goblin 
    app = loop.run_until_complete(Goblin.open(loop)) 
    app.register(Brand) 

    async def go(app): 
     session = await app.session() 

     for i in p: 
      if i['brand']: 
       traversal = session.traversal(Brand) 
       result = await traversal.has(Brand.name, i['brand']).oneOrNone() 

       if not result: # TODO: Remove Duplicates 
        print(i) 
        brand = Brand() 
        brand.name = i['brand'] 
        session.add(brand) 
        session.flush() 

     await app.close() 

    loop.run_until_complete(go(app)) 

rdd = rdd.foreachPartition(savePartition) 

如何解决?非常感谢。

回答

1

我不知道这将如何与Goblin一起工作,但如果你想让泰坦防止基于顶点属性的重复,你可以使用Titan composite indices并指定它们必须是唯一的。例如,你可以做到以下几点:

mgmt = graph.openManagement() 
name = mgmt.makePropertyKey('name').dataType(String.class).make() 
mgmt.buildIndex('byNameUnique', Vertex.class).addKey(name).unique().buildCompositeIndex() 
mgmt.commit() 

以上将指定的name财产上的顶点必须是唯一的。

+0

谢谢!我还有一个问题。如果我想要标签唯一的名称,如何实现? – softwarevamp

+0

如果你问如何确保标签是独一无二的,那么Titan无法帮助你。标签并不意味着是唯一的。 Checkout [this](http://stackoverflow.com/a/36295205/1457059)回答更多信息。 –

+0

我希望每个标签的名称都是唯一的。 – softwarevamp