从CSV导入Cypher到Neo4J-如何提高性能

时间:2019-04-13 16:13:31

标签: neo4j cypher

我正在将以下内容导入Neo4J:

categories.csv

import javax.swing.*;
import java.awt.*;

public class Player extends JComponent {

    private int posY;
    private int posX;

    public Player(int x, int y) {
        posX = x;
        posY = y;
        //repaint();
    }

    public float getMovementY() {
        return movementY;
    }

    public void setMovementY(int movementY) {
        this.movementY = movementY;
    }

    int movementY = 0;

    public void paintComponent(Graphics g) {
        Graphics2D _g2 = (Graphics2D) g;
        Rectangle rect = new Rectangle(posX, posY, 20, 150);
        _g2.fill(rect);
    }

    public void setLocation(int x, int y) {
        posY = y;
        posX = x;
        repaint();
    }

    public void move() {
        setLocation(posX, posY + movementY);
    }
}

categories_relations.csv

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;

public class mainJFrame extends JFrame implements KeyListener {

    int relativeTimeMillsec = 0;

    Player playerLeft = new Player(5, 150);
    Player playerRight = new Player(150, 150);

    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            relativeTimeMillsec++;
            refreshTimeText(relativeTimeMillsec);
            calcMovements();
        }
    };

    //components
    JLabel timeCounterLabel = new JLabel("Time: " + 0, SwingConstants.CENTER);

    public mainJFrame() {
        createComponents();

        addKeyListener(this);
    }

    public void createComponents() {
        this.setTitle("The title");
        this.setSize(800, 600);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        timer.scheduleAtFixedRate(task, 0, 10);

        JButton testButton = new JButton("Label");
        testButton.setSize(100, 25);
        testButton.setLocation(this.getWidth() / 2 - testButton.getWidth() / 2, this.getHeight() / 2 - testButton.getHeight() / 2);

        timeCounterLabel.setSize(200, 25);
        timeCounterLabel.setLocation(this.getWidth() / 2 - timeCounterLabel.getWidth() / 2, 10);

        //playerRight = new Player(this.getWidth()-45,this.getHeight()/2);

        // this.add(testButton);
        this.add(timeCounterLabel);
        this.add(playerLeft);
        this.add(playerRight);
    }

    public void paintComponent(Graphics g) {
        {
            super.repaint();
        }

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_S) {
            playerLeft.movementY = +2;
        } else if (e.getKeyCode() == KeyEvent.VK_W) {
            playerLeft.movementY = -2;
        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            playerRight.movementY = +2;
        } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            playerRight.movementY = -2;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    private double calcRealRelativeTime(int _relTime) {
        return relativeTimeMillsec / (double) 100;

    }

    private void refreshTimeText(int _relTime) {
        timeCounterLabel.setText("Time: " + Math.round(calcRealRelativeTime(_relTime)));
    }

    private void calcMovements() {
        playerLeft.move();
        playerRight.move();

    }
}

基本上,category_relations.csv显示category.csv中类别之间的父子关系。

我使用以下查询导入了第一个csv文件,该查询运行得很好并且非常快:

CategoryName1
CategoryName2
CategoryName3
...

然后我使用以下命令导入第二个csv文件:

category_parent   category_child
CategoryName3     CategoryName10
CategoryName32    CategoryName41
...

我大约有200万个节点。

我尝试执行第二个查询,这花费了很长时间。我可以使查询执行得更快吗?

1 个答案:

答案 0 :(得分:1)

  

确认您在正确的属性上匹配。您只为 Category 节点设置一个属性,即 name 在创建时   类别。但是您在第二个属性中匹配了属性 id   查询以创建类别之间的关系。

要更快地执行第二个查询,您可以在与“类别”节点匹配的属性(此处为id)上添加索引。

CREATE INDEX ON :Category(id)

如果仍然需要时间,您可以将我的答案推荐给“加载CSV here