Пример сценария, предоставленный neo4j для JavaScript, не запускается - PullRequest
1 голос
/ 17 июня 2020

Я новичок в экосистеме графических баз данных и для начала экспериментирую с neo4j. Очень бы хотелось поработать с node и neo4j. Итак, после быстрого поиска я нашел neo4j-driver , который является официально поддерживаемым драйвером для JavaScript, и приведенный пример:

const neo4j = require('neo4j-driver')

const driver = neo4j.driver(uri, neo4j.auth.basic(user, password))
const session = driver.session()
const personName = 'Alice'

try {
  const result = await session.run(
    'CREATE (a:Person {name: $name}) RETURN a',
    { name: personName }
  )

  const singleRecord = result.records[0]
  const node = singleRecord.get(0)

  console.log(node.properties.name)
} finally {
  await session.close()
}

// on application exit:
await driver.close()

Теперь, когда я запускаю этот код, я немедленно получаю следующую ошибку:

SyntaxError: await is only valid in async function

Теперь я подумал, что понял ошибку, что мне придется обернуть блок try-catch анонимной функцией asyn c, чтобы избавиться от ошибки. Измененное тело кода:

const config = {
    "neo4j": {
        "url": "neo4j://localhost",
        "authUser": "neo4j",
        "authKey": "adminPassword"
    }
}

const neo4j = require("neo4j-driver");

const driver = neo4j.driver(
    config.neo4j.url,
    neo4j.auth.basic(config.neo4j.authUser, config.neo4j.authKey)
);

const session = driver.session();

(async () => {
    try {
        const result = await session.run('CREATE (a:Person {name: $name}) RETURN a', { name: 'Alice' });

        const singleRecord = result.records[0];
        const node = singleRecord.get(0);

        console.log(node.properties.name);
    } catch (error) {
        console.log("Error Body: ", error);
    } finally {
        await session.close();
    }
})();

await driver.close();

Но, к моему ужасу, я столкнулся с другой ошибкой, которая очень криптографическая c:

{ Neo4jError: Could not perform discovery. No routing servers available. Known routing table: RoutingTable[database=Sample database, expirationTime=0, currentTime=1592397056399, routers=[], readers=[], writers=[]]

    at captureStacktrace (/Users/pc/node_modules/neo4j-driver/lib/result.js:263:15)
    at new Result (/Users/pc/node_modules/neo4j-driver/lib/result.js:68:19)
    at Session._run (/Users/pc/node_modules/neo4j-driver/lib/session.js:174:14)
    at Session.run (/Users/pc/node_modules/neo4j-driver/lib/session.js:135:19)
    at /Users/pc/neoNode.js:20:38
    at Object.<anonymous> (/Users/pc/neoNode.js:31:3)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12) code: 'ServiceUnavailable', name: 'Neo4jError' }

Ответы [ 2 ]

1 голос
/ 16 июля 2020

У меня тоже были проблемы с этим.

Во-первых, Натам Оливейра прав. Вам необходимо использовать протокол bolt, а обещания await должны находиться в функции async. По какой-то причине протокол neo4j используется в некоторых примерах в документации. Вдобавок может показаться, что оба примера, которые в настоящее время предоставляются Neo4j - в руководстве по драйверам и в разделе javascript -driver, - вызывают ошибки, если вы используете их вне какой-то неопределенной среды. npmjs страница pagckage, так что, вставив их в существующий код, я, по крайней мере, смог выплюнуть некоторые данные. Однако мне также интересно, как вы могли бы заставить эту работу работать в функции async, поэтому было бы очень полезно объяснение того, как это может работать с этим драйвером.

Вот что сработало для меня:

const neo4j = require('neo4j-driver')

const cnx = {
    user: 'neo4j',
    password: 'some passphrase',
    uri: 'bolt://localhost:7687'
}

const driver = neo4j.driver(cnx.uri, neo4j.auth.basic(cnx.user, cnx.password))

driver.verifyConnectivity()
    .then((cnxMsg) => {
        console.log(cnxMsg)
    })

const session = driver.session({ database: 'neo4j' })

session.run('MATCH (n:Movie) RETURN n LIMIT 5')
    .subscribe({
        onKeys: keys => {
            console.log(keys)
        },
        onNext: record => {
            console.log(record.get('n').properties.title)
        },
        onCompleted: () => {
            session.close()
        },
        onError: error => {
            console.error(error) 
        }
    })

Это выводит некоторые фильмы с использованием потокового API , как показано в документации NPM. (Примечание: он будет работать только в том случае, если вы запустили / установили базу данных Mov ie, поэтому дважды проверьте, не удалили ли вы ее, поскольку ее удаление также является частью учебника Neo4j.) Теперь просто измените MATCH Cypher. запросите все, что вам нравится, и поиграйте с выводом, например, подключив его к Express.

Источники:

0 голосов
/ 22 июня 2020

в первую очередь, я думаю, ваш URL-адрес должен быть "url": "bolt://localhost:7687" И вы все еще используете await driver.close() вне асинхронной c функции

Если вы начинаете использовать neo4j, ищите OGM (Object Graph Model), чтобы помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...