Повышение производительности отношений с помощью Spring Data Neo4J - PullRequest
0 голосов
/ 07 марта 2020

Мы используем Spring Boot 2.2.5 и Spring Data Neo4J. У нас есть узлы со связями, которые мы отобразили с помощью Spring NodeEntity и RelationshipEntity. Что мы замечаем, так это наличие узлов с большим количеством отношений первого уровня (например, более 1500), для получения и обновления сущности / отношений требуется время (более 1 секунды).

Существуют ли лучшие рекомендации по как улучшить производительность для отношений. Существуют ли способы использования пагинации, ограничения и т. Д. c.?

Код:

@NodeEntity
public class Node {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Relationship(type = RelatedNode.TYPE, direction = Relationship.UNDIRECTED)
    private Set<RelatedNode> relatedNodes = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<RelatedNode> getRelatedNodes() {
        return relatedNodes;
    }

    public void setRelatedNodes(Set<RelatedNode> relatedNodes) {
        this.relatedNodes = relatedNodes;
    }

    public RelatedNode addRelatedNode(Node relatedNode, long count) {
        final RelatedNode node = this.relatedNodes.stream()
        .filter(i -> (relatedNode.getId().equals(i.getEnd().getId())) || (relatedNode.getId().equals(i.getStart().getId())))
            .findFirst()
            .orElseGet(() -> {
                RelatedNode newRelatedNode = new RelatedNode();
                newRelatedNode.setStart(this);
                newRelatedNode.setEnd(relatedNode);
                newRelatedNode.setCount(count);
                this.relatedNodes.add(newRelatedNode);
                return newRelatedNode;
            });
        return node;
    }

    public RelatedNode updateRelatedNode(Node relatedNode, long count) {
        final RelatedNode node = this.relatedNodes.stream()
        .filter(i -> (relatedNode.getId().equals(i.getEnd().getId())) || (relatedNode.getId().equals(i.getStart().getId())))
            .findFirst().get();
        if (node != null) {
            node.setCount(count);
        }
        return node;
    }

    public void deleteRelatedNode(Node relatedNode) {
        final RelatedNode node = this.relatedNodes.stream()
            .filter(i -> (relatedNode.getId().equals(i.getEnd().getId())) || (relatedNode.getId().equals(i.getStart().getId())))
            .findFirst().get();
        this.relatedNodes.remove(node);
    }
}

@RelationshipEntity(type = RelatedNode.TYPE)
public class RelatedNode {

    public static final String TYPE = "RELATED_TO";

    @Id
    @GeneratedValue
    private Long id;

    @StartNode
    private Node start;

    @EndNode
    private Node end;

    private long count;

    public Long getId() {
        return id;
    }

    public long getCount() {
        return count;
    }

    public void setCount(long count) {
        this.count = count;
    }

    public Node getEnd() {
        return end;
    }

    public void setEnd(Node end) {
        this.end = end;
    }

    public Node getStart() {
        return start;
    }

    public void setStart(Node start) {
        this.start = start;
    }

    public void setId(Long id) {
        this.id = id;
    }    
}

Примечания. Мне необходимо добавлять / обновлять связанные узлы с помощью методов addRelatedNode / updateRelatedNode. Если я создаю / обновляю отношения без этих методов, отношения дублируются, так как сущность отношения имеет атрибуты.

...