private void assertSameConcept(Concept expected, Concept actual, List<String> traversedUrns) {
    String errMsg = String.format("%1$s != %2$s", expected, actual);

    Assert.assertEquals(errMsg, expected, actual);
    Assert.assertEquals(errMsg, expected.getLabel(), actual.getLabel());
    Assert.assertEquals(errMsg, expected.getPreferredLabel(), actual.getPreferredLabel());
    Assert.assertEquals(errMsg, expected.isHref(), actual.isHref());
    Assert.assertEquals(errMsg, expected.getDefinition(), actual.getDefinition());

    // To deal with cycles in the hierarchy
    if (traversedUrns.contains(expected.getUrn())) {
      return;
    } else {
      traversedUrns.add(expected.getUrn());
    }

    assertSameConcept(expected.getBroader(), actual.getBroader(), traversedUrns);
    assertSameConcept(expected.getNarrower(), actual.getNarrower(), traversedUrns);
    assertSameConcept(expected.getRelated(), actual.getRelated(), traversedUrns);
  }