Sesam DTL-查找具有重复属性的实体

时间:2018-07-30 12:15:59

标签: sesam

是否可以在Sesam中的同一数据集中找到重复的实体?

例如,如果两个或多个实体具有相同的电子邮件属性:

输入

[{
        _id: "1",
        "email": "foo@bar.baz"
    }, {
        _id: "2",
        "email": "foo@bar.baz"
    }
]

输出

[{
        _id: "1",
        "email": "foo@bar.baz",
        "duplicate-ids": ["2"]
    }
]

或仅将它们合并为一个实体。 感谢您的建议

2 个答案:

答案 0 :(得分:1)

您可以在Sesam中使用以下配置进行此操作。我添加了一个额外的实体来表明它可以正常工作:

mydomain:port/api/v1/example1

我们遍历这些实体并跳回同一数据集以查找重复项(我还添加了一个过滤器,仅保留具有重复项的过滤器,但是可以将其删除):

{
  "_id": "customers",
  "type": "pipe",
  "source": {
    "type": "embedded",
    "entities": [{
      "_id": "1",
      "email": "foo@bar.baz"
    }, {
      "_id": "2",
      "email": "foo@bar.baz"
    }, {
      "_id": "3",
      "email": "foo@example.org"
    }]
  }
}

这将产生以下两个实体:

{
  "_id": "duplicate-emails",
  "type": "pipe",
  "source": {
    "type": "dataset",
    "dataset": "customers"
  },
  "transform": {
    "type": "dtl",
    "rules": {
      "default": [
        ["copy", "email"],
        ["add", "duplicate-ids",
          ["filter",
            ["neq", "_.", "_S._id"],
            ["hops", {
              "datasets": ["customers c"],
              "where": [
                ["eq", "_S.email", "c.email"]
              ],
              "return": "c._id"
            }]
          ]
        ],
        ["filter",
          ["gte",
            ["count", "_T.duplicate-ids"], 1]
        ]
      ]
    }
  }
}

答案 1 :(得分:1)

为避免在重复项时获得多个实体,您可以按您要检查的属性(在这种情况下为email)对它进行分组。首先,我们为电子邮件生成一个新的数据集:

{
  "_id": "customer-emails",
  "type": "pipe",
  "source": {
    "type": "dataset",
    "dataset": "customers"
  },
  "transform": {
    "type": "dtl",
    "rules": {
      "default": [
        ["add", "_id", "_S.email"]
      ]
    }
  }
}

然后,我们使用这个新数据集作为替代重复检测器的来源:

{
  "_id": "duplicate-emails2",
  "type": "pipe",
  "source": {
    "type": "dataset",
    "dataset": "customer-emails"
  },
  "transform": {
    "type": "dtl",
    "rules": {
      "default": [
        ["add", "customer_ids",
          ["hops", {
            "datasets": ["customers c"],
            "where": [
              ["eq", "_S._id", "c.email"]
            ],
            "return": "c._id"
          }]
        ],
        ["filter",
          ["gt",
            ["count", "_T.customer_ids"], 1]
        ]
      ]
    }
  }
}

这将为您提供以下单个输出实体:

{
  "_id": "foo@bar.baz",
  "customer_ids": [
    "1",
    "2"
  ]
}