Несоответствие типа Neo4j

Я пытаюсь написать код JDBC в eclipse, который подключается к neo4j. Я могу заставить его подключиться к базе данных, но у меня проблемы с запуском запросов. У меня есть импортированная банка драйвера Neo4J, а также большая часть необходимых драйверов. При этом я все еще получаю ошибки в двух местах:

PreparedStatement statement = conn.prepareStatement(cypher);

дает мне ошибку:

Несколько маркеров в этой строке

- The method prepareStatement(String) is undefined for the type Connection

- Type mismatch: cannot convert from java.sql.PreparedStatement to org.neo4j.jdbc.PreparedStatement

Я не понимаю, почему включен java.sql, потому что я не импортировал его в этот класс.

Другая моя ошибка находится в строке:

Подключение conn = DriverManager.getConnection ("jdbc: neo4j: bolt: // localhost", "", "");

Ошибка, которую я получаю: не удается устранить DriverManager.

Мой код (незавершенный) ниже. У меня вопрос, что мне делать, чтобы исправить эти ошибки.

private static void runCypher(Connection conn, String cypher) {
    PreparedStatement statement = conn.prepareStatement(cypher);


}

public static void main (String[] args) {
    try {   
        Connection conn = DriverManager.getConnection("jdbc:neo4j:bolt://localhost", "", "");

        String cypher = "";
        String option = "";
        String instr = "Enter a: Show distinct sids and snames of suppliers who supply a red part or a green part." + "\n"
                + "Enter b: Show distinct sids and snames of suppliers who supply a red part and a green part."
                + "\n" + "Enter c: Insert a new supplier." + "\n"
                + "Enter d:  Quit Program.";

    while (true) {
        option = JOptionPane.showInputDialog(instr);
        if (option.equals("a")) {
            cypher = "match (s:Suppliers)-[:supplies]->(p:Parts) where p.color = ‘red’ or p.color = ‘green’ return distinct s.sid, s.sname;";
            runCypher(conn, cypher);
        } else if (option.equalsIgnoreCase("b")) {
            cypher = "match (p1:Parts)<-[:supplies]-(s:Suppliers)-[:supplies]->(p2:Parts) where p1.color = ‘red’ and p2.color = ‘green’ return distinct s.sid, s.sname;";
            runCypher(conn, cypher);
        } else if (option.equals("c")) {
            cypher = "match (p:Parts)<-[sup:supplies]-(s:Suppliers) return p.pid, p.pname, max(toInteger(sup.cost)) order by p.pid;";
            runCypher(conn, cypher);
        } else {
            break;
        }


    }}catch(Exception e ) {
        System.out.println("Program terminates due to errors");
        e.printStackTrace(); // for debugging
    }
}

Мой импорт:

import org.neo4j.driver.internal.spi.Connection;
import org.neo4j.driver.v1.StatementResult;
import org.neo4j.jdbc.PreparedStatement;
import org.neo4j.jdbc.ResultSet;
import org.neo4j.jdbc.ResultSetMetaData;

Я считаю, что ваша проблема связана с импортом ... опубликуйте соответствующие (DriverManager, Connection, ...) - пожалуйста, редактировать вопрос, чтобы добавить их

user85421 09.10.2018 17:14

@CarlosHeuberger Я отредактировал вопрос

user10380678 09.10.2018 17:18
java.sql.DriverManager отсутствует; попробуйте использовать классы java.sql вместо классов neo4j, например, import java.sql.Connection, import java.sqlPreparedStatement, ...
user85421 09.10.2018 17:20

@CarlosHeuberger Мне нужно подключиться к базе данных neo4j, хотя

user10380678 09.10.2018 17:21

@CarlosHeuberger, могу ли я использовать для этого драйвер sql

user10380678 09.10.2018 17:21

обычно вам никогда не нужно использовать классы драйверов, они автоматически используются в фоновом режиме. Просто попробуйте

user85421 09.10.2018 17:24

"Могу ли я использовать драйвер sql" такого драйвера нет, только Интерфейс. Каждая база данных имеет свой собственный драйвер, который должен реализовывать java.sql.DriverИнтерфейс. Большинство из них реализуют SQL, но я не верю, что Neo4J поддерживает SQL. (немного сбивает с толку, что пакет jdbc - это неправильно с именем java.sql)

user85421 09.10.2018 19:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
210
1

Ответы 1

Сообщение об ошибке DriverManager cannot be resolved означает, что компилятор не знает об этом классе / поле / ... поэтому, вероятно, отсутствует соответствующий импорт:

import java.sql.DriverManager;

Ошибка The method prepareStatement(String) is undefined for the type Connection означает, что этот метод не был найден, поскольку вы импортируете и, следовательно, используете неправильный класс Connection. Я не могу вспомнить, чтобы когда-либо использовал классы из JAR-файла драйвера, несмотря на то, что сам драйвер нужно было загрузить (некоторое время назад ...). Для Java используются правильные классы на основе URL-адреса, указанного для DriverManager. Вам нужно использовать только классы из пакета java.sql ....

import java.sql.Connection;
import java.sql.PreparedStatement;
...

Вот очень простой пример:

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Neo4j {

    public static void main(String[] args) throws Exception {
        try (Connection conn = DriverManager.getConnection("jdbc:neo4j:bolt://localhost", "neo4j", "test123")) {
            PreparedStatement stmt = conn.prepareStatement("MATCH (a:Aplz) RETURN *");
            ResultSet rset = stmt.executeQuery();
            while (rset.next()) {
                System.out.println(rset.getObject(1));
            }
        }
    }
}

На самом деле, без Java, вам нужен только DriverManager, компилятор хорошо с этим справляется:

import java.sql.DriverManager;

public class Neo4j {

    public static void main(String[] args) throws Exception {
        try (var conn = DriverManager.getConnection("jdbc:neo4j:bolt://localhost", "neo4j", "test123")) {
            var stmt = conn.prepareStatement("MATCH (a:Aplz) RETURN *");
            var rset = stmt.executeQuery();
            while (rset.next()) {
                System.out.println(rset.getObject(1));
            }
        }
    }

}

Я не понимаю, зачем мне использовать java.sql, когда я обращаюсь к Neo4j

user10380678 09.10.2018 18:03

так работают драйверы. Драйвер Neo4J регистрируется в DriverManager. Когда DriverManager получит URL-адрес "jdbc:neo4j...", он сотворит чудеса и найдет класс, реализующий java.sql.Connection (фактически экземпляр, возвращающий такой экземпляр). И вам просто нужно работать с интерфейсом (так же, как с List и ArrayList) - так оно и задумано, поэтому вы можете легко изменить базу данных (теоретически)

user85421 09.10.2018 18:33

еще одно преимущество, вам не нужен драйвер для компиляции вашего приложения - приложение не зависит от самого драйвера (не учитывая, что запросы могут быть специфичными для базы данных - особенно для Neo4J)

user85421 09.10.2018 18:42

Другие вопросы по теме