我正在使用neo4j js驱动程序(和异步实用程序模块)编写nodejs应用程序,以使用项目的源js文件数据导入neo4j数据库。
我的测试项目文件夹“testapp”中有2个文件夹,即“State”和“City”以及一个“country.js”文件。 “country.js”文件包含国家/地区的名称和ID,countryid用作“州”和“城市”文件夹中的js文件中的参数。
- 来自country.js文件的摘录
const countries= [
{ id: "1", label: "USA" },
{ id: "2", label: "Scotland" }
];
module.exports = countries;
“State”文件夹中的js文件具有如下命名约定:( Country-1-statelist.js , Country-2-statelist.js 等等上)。
- 来自“State”文件夹中的js文件的示例。
const data = {"params":{"country_id":"1"},"items":
[{"id":"1","label":"Alaska"},{"id":"2","label":"Alabama"}]
module.exports = data;
同样,“City”文件夹中的js文件具有如下命名约定:( Country-1-state-1-list.js , Country-1-state-2- list.js 等等。)
- 来自“City”文件夹
中的特定js文件的示例const data =
{"params":
{"country_id":"1","state_id":"1"},
"items":[
{"id":"1","label":"New York"},
{"id":"2","label":"Chicago"}
]
}
module.exports = data;
因此,我正在尝试添加带有标签国家/地区,州和城市的节点,以便在不改变其关系的情况下导入这些节点。但是我在尝试使用多个链承诺将其导入我的测试数据库时在nodejs中收到错误。
所以,我能够从“State”文件夹导入country.js和其他js文件中的数据。但是在尝试从“City”文件夹的js文件中执行相同操作时,我收到“ReferenceError:item is not defined”错误。
我已经在nodejs中创建了index.js文件来执行此操作,该文件包含以下代码:
const neo4j = require('neo4j-driver').v1;
const driver = neo4j.driver("bolt://localhost", neo4j.auth.basic("neo4j", "testapp"));
const session = driver.session();
const async = require('async');
const appPathway = '/Users/reactor/Documents/testapp';
const country = require(appPathway+'/country');
async.eachSeries(country, (item, callback) => {
const resPromise = session.run(
`CREATE (c:country {label: "${item.label}", id: "${item.id}"}) RETURN c.id`
);
resPromise
.then((data) => {
return insertState(item.id);
}
)
.then
(
(done) => {
callback(null);
}
)
.catch
(
(err) => {
callback(err);
}
);
},
(err) => {
console.log(err);
session.close();
driver.close();
}
);
function insertState(countryID) {
let state = require(appPathway+'/State/Country-'+countryID+'-statelist.js');
return new Promise((resolve, reject) =>{
async.eachSeries(state.items, (item1,item2, callback) => {
const resPromise = session.run(
`
CREATE (s:state {label: "${item.label}", id: "${item.id}"})
WITH s
MATCH (c:Country)
WHERE c.id = '${countryID}'
CREATE (s)-[r:LOCATED_IN]->(c)
RETURN c,s
`
);
resPromise
.then((state) => {
console.log(state);
callback(null);
})
resPromise
.then((data) => {
return insertCity(item1.id,item2.id);
})
.then((done) => {
callback(null);
}
)
.catch((err) => {
callback(err);
});
}, (err) => {
if(err) {
reject(err);
}
resolve(true);
});
}
);
}
// Problem rose when i inserted the following block of code !!
function insertCity(countryID,stateID) {
let city = require(appPathway+'/city/Country-'+countryID+'-state-'+stateID+'-list.js');
return new Promise((resolve, reject) =>
{
async.eachSeries(city.items, () => {
const resPromise = session.run(
`
CREATE (w:city {label: "${item.label}", id: "${item.id}"})
WITH w
MATCH (s:state)
WHERE s.id = '${stateID}'
/* How am I suppose to use the countryid parameter here in this cypher query ? As it doesn't have direct relation with label "country" in this query */
CREATE (w)-[r:PRESENT_IN]->(s)
RETURN w
`
);
resPromise
.then((city) => {
console.log(city);
callback(null);
})
.then((done) => {
callback(null);
})
.catch((err) => {
callback(err);
});
}, (err) => {
if(err) {
reject(err);
}
resolve(true);
});
}
);
}
我是ES6,cypher和promise功能的新手,可能导致了这个问题。虽然, 我查看了与多个承诺链相关的大多数帖子,博客和视频,但是当单个js文件中存在多个参数以及如何使用这些参数来提取数据时,我仍无法弄清楚如何执行此操作使用密码查询。
任何帮助或建议现在对我都有帮助!在此先感谢
答案 0 :(得分:0)
在insertState()
和insertCity()
中,您尝试取消引用item.label
和item.id
,但范围内没有item
。