2017-09-22 6 views
2

버텍스를 바꾸거나 병합하고 기존 가장자리를 유지/병합하는 쉬운 방법이 있습니까? 또는 정점에서 모든 속성을 수동으로 복사하고 기존 가장자리와 모든 (메타) 속성을 다시 만든 다음 불필요한 꼭지점을 드롭하면됩니까?Tinkerpop/gremlin 버텍스 (및 가장자리) 병합

+0

당신은 당신의 사용 사례에 조금 정교한? 가져 오기에 대해 이야기하고 있습니까? 그렇다면 정점을 어떻게 가져 옵니까? 어떤 그래프 DB를 사용하고 있습니까? –

+0

유스 케이스는 여러 소스의 데이터가 포함 된 지식 그래프입니다. 이 데이터는 동일한 개체의 다양한 측면을 설명 할 수 있습니다. 서로 다른 소스가 항상 이러한 엔티티에 대한 공통 식별자를 갖는 것은 아닙니다. 충분한 데이터가있을 때 어떤 꼭지점이 동일한 엔티티인지 식별 ​​할 수 있으므로 해당 꼭지점을 병합하고 싶습니다 (꼭지점 포함). 내가 사용하고있는 DB는 중요하지 않지만 JanusGraph (Cassandra와 Elasticsearch)를 사용하고 있습니다. – user3508638

+0

데이터베이스가 중요합니다. 그렇지 않은 경우 질문하지 않았을 것입니다. 각 DB는 자체 기능을 가지고 있습니다. Janus의 경우 사용자 정의 정점 프로그램을 작성하는 것이 좋습니다. 꼭지점과 어떻게 일치합니까? 오래 실행중인 OLAP 작업 또는 OLTP에서 짧은 기간 동안 사용 했습니까? –

답변

3

위의 설명에서 언급했듯이 OLTP에서는 일치를 수행합니다. 즉, 구체적인 진입 점이 있음을 의미합니다.

g = TinkerGraph.open().traversal() 

// Stackoverflow data 
g.addV("user").property("login", "user3508638").as("a"). 
    addV("user").property("login", "dkuppitz").property("age", 35).as("b"). 
    addV("question").property("title", "Tinkerpop/gremlin merge vertices (and edges)").as("c"). 
    addE("posted").from("a").to("c"). 
    addE("commented").from("b").to("c").property("time", 123).iterate() 

// Github data 
g.addV("user").property("login", "dkuppitz").property("name", "Daniel Kuppitz").as("a"). 
    addV("project").property("title", "TinkerPop").as("b"). 
    addE("contributed").from("a").to("b").iterate() 

는 로그인 dkuppitz에 따라 정점과 일치하는 단일 사용자 정점에 병합하려면 :의 간단한 샘플 그래프를 만들어 보자 내가 아는

g.V().has("login", "dkuppitz"). 
    fold().filter(count(local).is(gt(1))).unfold(). 
    sideEffect(properties().group("p").by(key).by(value())). 
    sideEffect(outE().group("o").by(label).by(project("p","iv").by(valueMap()).by(inV()).fold())). 
    sideEffect(inE().group("i").by(label).by(project("p","ov").by(valueMap()).by(outV()).fold())). 
    sideEffect(drop()). 
    cap("p","o","i").as("poi"). 
    addV("user").as("u"). 
    sideEffect(
    select("poi").select("p").unfold().as("kv"). 
    select("u").property(select("kv").select(keys), select("kv").select(values))). 
    sideEffect(
    select("poi").select("o").unfold().as("x"). 
    select("u").sideEffect { u -> 
     u.path("x").getValue().each { x -> 
     def e = u.get().addEdge(u.path("x").getKey(), x.get("iv")) 
     x.get("p").each { p -> 
      e.property(p.getKey(), p.getValue()) 
     } 
     } 
    }). 
    sideEffect(
    select("poi").select("i").unfold().as("x"). 
    select("u").sideEffect { u -> 
     u.path("x").getValue().each { x -> 
     def e = x.get("ov").addEdge(u.path("x").getKey(), u.get()) 
     x.get("p").each { p -> 
      e.property(p.getKey(), p.getValue()) 
     } 
     } 
    }).iterate() 

를 쿼리 특히 함께, 복잡한 미친 깊게 중첩 된 람다. 하지만 불행히도 람다 주변에는 방법이 없습니다. 우리는 addE(<traversal>) 오버로드를 가지고 있지 않기 때문에 (나는 ticket을 만들었습니다). 여하튼, 상기 쿼리를 실행 한 후, 그래프는 다음과 같다 : 하나 (nameage 속성이 존재)에

gremlin> g.V().valueMap() 
==>[login:[user3508638]] 
==>[title:[Tinkerpop/gremlin merge vertices (and edges)]] 
==>[title:[TinkerPop]] 
==>[name:[Daniel Kuppitz],login:[dkuppitz],age:[35]] 
gremlin> g.V().has("login", "dkuppitz").bothE() 
==>e[19][15-commented->5] 
==>e[20][15-contributed->12] 
gremlin> g.V().has("login", "dkuppitz").bothE().valueMap(true) 
==>[label:commented,time:123,id:19] 
==>[label:contributed,id:20] 

dkuppitz 두 정점 병합시키고 2 개 에지 따라서 재현 하였다.

UPDATE : TINKERPOP-1793

우리 모두 람다 제거 할 수 있습니다

g.V().has("login", "dkuppitz"). 
    fold().filter(count(local).is(gt(1))).unfold(). 
    sideEffect(properties().group("p").by(key).by(value())). 
    sideEffect(outE().group("o").by(label).by(project("p","iv").by(valueMap()).by(inV()).fold())). 
    sideEffect(inE().group("i").by(label).by(project("p","ov").by(valueMap()).by(outV()).fold())). 
    sideEffect(drop()). 
    cap("p","o","i").as("poi"). 
    addV("user").as("u"). 
    sideEffect(
    select("poi").select("p").unfold().as("kv"). 
    select("u").property(select("kv").select(keys), select("kv").select(values))). 
    sideEffect(
    select("poi").select("o").unfold().as("x").select(values). 
    unfold().addE(select("x").select(keys)).from(select("u")).to(select("iv"))). 
    sideEffect(
    select("poi").select("i").unfold().as("x").select(values). 
    unfold().addE(select("x").select(keys)).from(select("ov")).to(select("u"))).iterate()