当前位置:  开发笔记 > 编程语言 > 正文

如何在Java中建模社交图

如何解决《如何在Java中建模社交图》经验,为你挑选了1个好方法。

非常简单的场景

N个用户,每个用户可以有0 ... N - 1个朋友(也是用户)

我如何在Java中为AppEngine数据存储建模

需要考虑的场景

用户x和用户y成为朋友(因此两者都需要在事务中更新自己的状态

sfussenegger.. 7

我们将用户关系建模为一个简单的UserRelation实体:

class UserRelation {
  User _from;
  User _to;
  RelationState _state;
}

其中RelationState是一个枚举,描述状态(通常,不仅仅是友谊)

enum RelationState {
  BLOCKED, NONE, PENDING_FRIEND, FRIEND;
}

实际上,我们也使用此枚举来进行授权,例如在用户配置文件上.

enum RelationState implements IRole {
  BLOCKED, NONE(BLOCKED), PENDING_FRIEND(NONE), FRIEND(PENDING_FRIEND);

  private final List _impliedRoles;
  private final List _roleStrings;

  private RelationState(final IRole... impliedRoles) {
    HashSet set = new HashSet();
    for (final IRole impliedRole : impliedRoles) {
      set.add(impliedRole);
      set.addAll(impliedRole.getImpliedRoles());
    }
    _impliedRoles = Collections.unmodifiableList(new ArrayList(set));

    ArrayList list = new ArrayList(getImpliedRoles().size() + 1);
    list.add(getName());
    for (final IRole implied : getImpliedRoles()) {
      list.add(implied.getName());
    }
    _roleStrings = Collections.unmodifiableList(list);
  }

  public List getImpliedRoles() {
    return _impliedRoles;
  }

  public String getName() {
    return name();
  }

  public boolean hasRole(final IRole role) {
    return this == role || _impliedRoles.contains(role);
  }

  public List getRoleStrings() {
    return _roleStrings;
  }
}

public interface IRole {
  public List getImpliedRoles();
  public String getName();
  public boolean hasRole(final IRole role);
  public List getRoleStrings();
}

最简单的是每个(对称)关系有两个对象(例如facebook上使用的友谊),而非对称关系只有一个对象(例如Twitter上使用的关注者或被阻止的用户).虽然这可能看起来像开销,但使用两个对象肯定简化了查询.

我认为AppEngine部分本身应该非常直接.



1> sfussenegger..:

我们将用户关系建模为一个简单的UserRelation实体:

class UserRelation {
  User _from;
  User _to;
  RelationState _state;
}

其中RelationState是一个枚举,描述状态(通常,不仅仅是友谊)

enum RelationState {
  BLOCKED, NONE, PENDING_FRIEND, FRIEND;
}

实际上,我们也使用此枚举来进行授权,例如在用户配置文件上.

enum RelationState implements IRole {
  BLOCKED, NONE(BLOCKED), PENDING_FRIEND(NONE), FRIEND(PENDING_FRIEND);

  private final List _impliedRoles;
  private final List _roleStrings;

  private RelationState(final IRole... impliedRoles) {
    HashSet set = new HashSet();
    for (final IRole impliedRole : impliedRoles) {
      set.add(impliedRole);
      set.addAll(impliedRole.getImpliedRoles());
    }
    _impliedRoles = Collections.unmodifiableList(new ArrayList(set));

    ArrayList list = new ArrayList(getImpliedRoles().size() + 1);
    list.add(getName());
    for (final IRole implied : getImpliedRoles()) {
      list.add(implied.getName());
    }
    _roleStrings = Collections.unmodifiableList(list);
  }

  public List getImpliedRoles() {
    return _impliedRoles;
  }

  public String getName() {
    return name();
  }

  public boolean hasRole(final IRole role) {
    return this == role || _impliedRoles.contains(role);
  }

  public List getRoleStrings() {
    return _roleStrings;
  }
}

public interface IRole {
  public List getImpliedRoles();
  public String getName();
  public boolean hasRole(final IRole role);
  public List getRoleStrings();
}

最简单的是每个(对称)关系有两个对象(例如facebook上使用的友谊),而非对称关系只有一个对象(例如Twitter上使用的关注者或被阻止的用户).虽然这可能看起来像开销,但使用两个对象肯定简化了查询.

我认为AppEngine部分本身应该非常直接.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有