如何将输入值传递给 Cypher 查询?
How to Pass Input Value into Cypher Query?
我正在 运行ning nodejs 并且从一个 ejs 页面,我正在尝试将输入值发送到 Cypher 查询,这将导致 vis.js 显示图形。
注意:所有javascript操作都发生在ejs页面上,在这种情况下没有服务器联系。
当运行查询而不添加输入值的任何尝试时,我可以毫无问题地呈现 Neo4j 图。
有效 单击此按钮...
<input type="submit" onclick="displayGraph()" value='Display Graph' class="button">
...运行此函数包含 Cypher 查询(此查询中无输入)并按预期呈现 Neo4j 图。
function displayGraph() {
// Create the authorization header for the ajax request.
AUTHORIZATION = "Basic " + btoa("abc"+":"+"123");
// Post Cypher query to return node and relations and return results as graph.
restPost({
"statements": [
{
"statement": `MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: 'Pliny the Elder'})-[r2:IS_A]->(bt:BeerType)
Optional Match (b)-[r3:BREWED_WITH]->(h:Hop)
Return bry,r,b,r2,bt,r3,h`,
"resultDataContents": ["graph"]
}
]
}).done(function (data) {
// Parse results and convert it to vis.js compatible data.
var graphData = parseGraphResultData(data);
var nodes = convertNodes(graphData.nodes);
var edges = convertEdges(graphData.edges);
var visData = {
nodes: nodes,
edges: edges
};
displayVisJsData(visData);
});
}
这不起作用 如果我使用输入字段来捕获啤酒的名称...
<label>
Beer Name:<input name="inputbeer" id="inputbeer" type="text">
</label>
...然后单击相同的按钮...
<input type="submit" onclick="displayGraph()" value='Display Graph' class="button">
...我 运行 类似的函数,但是已经尝试了多种将输入值传递给 Cypher 查询的变体(一切都与上面看到的函数相同,只是修改了密码查询)...
MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: '$inputbeer'})-[r2:IS_A]->(bt:BeerType)
Optional Match (b)-[r3:BREWED_WITH]->(h:Hop)
Return bry,r,b,r2,bt,r3,h
...这个和其他变体不起作用。我试过 {name: {inputbeer}}... {name: {$inputbeer}}... {name: $inputbeer}... 有很多可能性。
我猜这是一个简单的格式问题,但我不知所措。
感谢您的帮助!
经过更多的试验,我可以将输入值传递给我的 Cypher 查询。
2 项修改是必要的:
- 我需要在我的函数中添加一个 var 来捕获输入的值:
var inputthebeer = document.getElementById("inputbeer").value;
- 我必须更新我的 Cypher 查询以允许我插入该变量:
`
MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: '`+inputthebeer+`'})-[r2:IS_A]->(bt:BeerType)
Optional Match (b)-[r3:BREWED_WITH]->(h:Hop)
Return bry,r,b,r2,bt,r3,h
`
您正在尝试使用 Javascript template literals。您正在寻找的语法是
const injectedString = 'containing a variable';
const templateString = `This is a string ${injectedString}`;
console.log(templateString);
//logs "This is a string containing a variable";
但是,
不要那样做
这会让您容易受到注入攻击,例如inputthebeer
的 'aBeerName'}) DETACH DELETE bry //
输入值将删除多个节点
使用参数
如果您使用的是 REST API
使用params
传递参数,让Neo4j安全转义注入查询
{
"query" : "MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: {inputthebeer}})-[r2:IS_A]->(bt:BeerType) Return bry,r,b,r2,bt,r3,h",
"params" : {
"inputthebeer" : "aBeerName",
}
}
不清楚您的 restPost()
是如何工作的,但请参阅 REST API documentation 以获取示例。
重要的部分是您的查询字符串应包含 {name: {inputthebeer}}
并且您应该添加 inputthebeer
作为参数。
使用 Javascript 驱动程序
更好的解决方案可能是使用 Neo4j Javascript Driver.
使用 npm
安装
npm install neo4j-driver
或者,如果您不使用 npm 或捆绑您的源代码,请将其包含在您的 HTML
中
<script src="https://unpkg.com/neo4j-driver@X.Y.Z/lib/browser/neo4j-web.min.js"></script>
您需要初始化驱动程序并打开一个会话,然后
session
.run(
'MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: $inputthebeer})-[r2:IS_A]->bt:BeerType) Return bry,r,b,r2,bt,r3,h',
{
inputthebeer: 'aBeerName'
}
)
在此示例中需要注意的重要一点是,这 不是 Javascript 模板文字。值$inputthebeer
字面意思在字符串中,驱动传递参数,Neo4j安全转义变量(防止注入攻击)
警告
看起来 Neo4j REST API 可能会公开暴露 - 如果是这种情况,上面的注入攻击可能没有实际意义,因为攻击者可以通过直接向 REST 发送请求来直接执行任何查询 API
我正在 运行ning nodejs 并且从一个 ejs 页面,我正在尝试将输入值发送到 Cypher 查询,这将导致 vis.js 显示图形。 注意:所有javascript操作都发生在ejs页面上,在这种情况下没有服务器联系。
当运行查询而不添加输入值的任何尝试时,我可以毫无问题地呈现 Neo4j 图。
有效 单击此按钮...
<input type="submit" onclick="displayGraph()" value='Display Graph' class="button">
...运行此函数包含 Cypher 查询(此查询中无输入)并按预期呈现 Neo4j 图。
function displayGraph() {
// Create the authorization header for the ajax request.
AUTHORIZATION = "Basic " + btoa("abc"+":"+"123");
// Post Cypher query to return node and relations and return results as graph.
restPost({
"statements": [
{
"statement": `MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: 'Pliny the Elder'})-[r2:IS_A]->(bt:BeerType)
Optional Match (b)-[r3:BREWED_WITH]->(h:Hop)
Return bry,r,b,r2,bt,r3,h`,
"resultDataContents": ["graph"]
}
]
}).done(function (data) {
// Parse results and convert it to vis.js compatible data.
var graphData = parseGraphResultData(data);
var nodes = convertNodes(graphData.nodes);
var edges = convertEdges(graphData.edges);
var visData = {
nodes: nodes,
edges: edges
};
displayVisJsData(visData);
});
}
这不起作用 如果我使用输入字段来捕获啤酒的名称...
<label>
Beer Name:<input name="inputbeer" id="inputbeer" type="text">
</label>
...然后单击相同的按钮...
<input type="submit" onclick="displayGraph()" value='Display Graph' class="button">
...我 运行 类似的函数,但是已经尝试了多种将输入值传递给 Cypher 查询的变体(一切都与上面看到的函数相同,只是修改了密码查询)...
MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: '$inputbeer'})-[r2:IS_A]->(bt:BeerType)
Optional Match (b)-[r3:BREWED_WITH]->(h:Hop)
Return bry,r,b,r2,bt,r3,h
...这个和其他变体不起作用。我试过 {name: {inputbeer}}... {name: {$inputbeer}}... {name: $inputbeer}... 有很多可能性。 我猜这是一个简单的格式问题,但我不知所措。
感谢您的帮助!
经过更多的试验,我可以将输入值传递给我的 Cypher 查询。
2 项修改是必要的:
- 我需要在我的函数中添加一个 var 来捕获输入的值:
var inputthebeer = document.getElementById("inputbeer").value;
- 我必须更新我的 Cypher 查询以允许我插入该变量:
`
MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: '`+inputthebeer+`'})-[r2:IS_A]->(bt:BeerType)
Optional Match (b)-[r3:BREWED_WITH]->(h:Hop)
Return bry,r,b,r2,bt,r3,h
`
您正在尝试使用 Javascript template literals。您正在寻找的语法是
const injectedString = 'containing a variable';
const templateString = `This is a string ${injectedString}`;
console.log(templateString);
//logs "This is a string containing a variable";
但是,
不要那样做
这会让您容易受到注入攻击,例如inputthebeer
的 'aBeerName'}) DETACH DELETE bry //
输入值将删除多个节点
使用参数
如果您使用的是 REST API
使用params
传递参数,让Neo4j安全转义注入查询
{
"query" : "MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: {inputthebeer}})-[r2:IS_A]->(bt:BeerType) Return bry,r,b,r2,bt,r3,h",
"params" : {
"inputthebeer" : "aBeerName",
}
}
不清楚您的 restPost()
是如何工作的,但请参阅 REST API documentation 以获取示例。
重要的部分是您的查询字符串应包含 {name: {inputthebeer}}
并且您应该添加 inputthebeer
作为参数。
使用 Javascript 驱动程序
更好的解决方案可能是使用 Neo4j Javascript Driver.
使用 npm
npm install neo4j-driver
或者,如果您不使用 npm 或捆绑您的源代码,请将其包含在您的 HTML
中<script src="https://unpkg.com/neo4j-driver@X.Y.Z/lib/browser/neo4j-web.min.js"></script>
您需要初始化驱动程序并打开一个会话,然后
session
.run(
'MATCH (bry:Brewery)-[r:BREWS]->(b:Beer {name: $inputthebeer})-[r2:IS_A]->bt:BeerType) Return bry,r,b,r2,bt,r3,h',
{
inputthebeer: 'aBeerName'
}
)
在此示例中需要注意的重要一点是,这 不是 Javascript 模板文字。值$inputthebeer
字面意思在字符串中,驱动传递参数,Neo4j安全转义变量(防止注入攻击)
警告
看起来 Neo4j REST API 可能会公开暴露 - 如果是这种情况,上面的注入攻击可能没有实际意义,因为攻击者可以通过直接向 REST 发送请求来直接执行任何查询 API