gpt4 book ai didi

javascript - Neo4j - 浏览器中的 Cypher 查询与驱动程序之间的区别? (使用 COLLECT、apoc 等)

转载 作者:行者123 更新时间:2023-11-30 11:36:49 25 4
gpt4 key购买 nike

我在 Neo4j 浏览器和我的 JavaScript (Angular) 代码中运行相同的查询,但得到两个不同的结果。到目前为止,我对基本查询没有任何问题。我导入了 neo4j-web 驱动程序,因此可以在 Angular 中使用:
import * as neo4j_driver from 'neo4j-driver/lib/browser/neo4j-web.min.js';

我需要分层数据,所以我按照示例 here 进行操作

以下查询将在 Neo4j 浏览器中工作
匹配 p=(n:类别)-[:子类别*]->(m)
如果不是 (m)-[:subcategory]->()
WITH COLLECT(p) 作为 ps
CALL apoc.convert.toTree(ps) 屈服值
返回值;

但是,当在我的 JS 代码中执行完全相同的查询时:
const result = this.session.run(
'匹配 p=(n:类别)-[:子类别*]->(m)' +
'哪里不是 (m)-[:subcategory]->()' +
'收集(p)作为 ps' +
'CALL apoc.convert.toTree(ps) 屈服值' +
'返回值;'
);

我在浏览器控制台中收到以下错误:
错误:无效输入“a”:预期的空格、注释、“、”、ORDER、SKIP、
限制,在哪里,加载 CSV,开始,匹配,展开,合并,创建,设置,删除,
移除、FOREACH、WITH、CALL、RETURN、UNION、';'或输入结束(第 1 行,
第 100 列(偏移量:99))
“匹配 p=(n:Category)-[:subcategory*]->(m)WHERE NOT (m)-[:subcategory]->()WITH
COLLECT(p) as psCALL apoc.convert.toTree(ps) yield valueRETURN value;”
^
在新的 n (neo4j-web.min.js:17)
在 t (neo4j-web.min.js:17)
在 l.value (neo4j-web.min.js:18)
在 l._dechunker.onmessage (neo4j-web.min.js:18)
在 l.value (neo4j-web.min.js:18)
在 l.value [as _state] (neo4j-web.min.js:18)
在 l.value (neo4j-web.min.js:18)
在 l.u._ch.onmessage (neo4j-web.min.js:18)
在 WebSocket._ws.onmessage (neo4j-web.min.js:18)
在 WebSocket.wrapFn [作为 __zone_symbol___onmessage] (zone.js:1032)

考虑到插入符指向的位置,起初我认为这可能是 Apoc 的问题;但是,我检查了其他 Apoc 函数并且它们工作正常,然后我完全删除了 Apoc 行并运行:
const result = this.session.run(
'匹配 p=(n:类别)-[:子类别*]->(m)' +
'哪里不是 (m)-[:subcategory]->()' +
'收集(p)作为 ps' +
'返回 ps;'
);

如果从代码运行但在 Neo4j 浏览器中运行,这也会导致错误。来自控制台的错误:
错误:无效输入“p”:预期空格、注释、“、”、ORDER、SKIP、LIMIT、WHERE、LOAD CSV、START、MATCH、UNWIND、MERGE、CREATE、SET、DELETE、REMOVE、FOREACH、WITH、CALL、返回,联合,';'或输入结束(第 1 行,第 102 列(偏移量:101))
“匹配 p=(n:Category)-[:subcategory*]->(m)WHERE NOT (m)-[:subcategory]->()WITH COLLECT(p) as psRETURN ps;”
^
在新的 n (neo4j-web.min.js:17)
在 t (neo4j-web.min.js:17)
在 l.value (neo4j-web.min.js:18)
在 l._dechunker.onmessage (neo4j-web.min.js:18)
在 l.value (neo4j-web.min.js:18)
在 l.value [as _state] (neo4j-web.min.js:18)
在 l.value (neo4j-web.min.js:18)
在 l.u._ch.onmessage (neo4j-web.min.js:18)
在 WebSocket._ws.onmessage (neo4j-web.min.js:18)
在 WebSocket.wrapFn [作为 __zone_symbol___onmessage] (zone.js:1032)

知道这里发生了什么吗?一整天都在用头撞 table ,但我尝试的任何方法似乎都不起作用。我是 Neo4j 的新手,可能犯了一些初学者错误,但我真的很想知道为什么相同的查询有不同的行为。

最佳答案

您应该在子句之间添加空格(如空格或换行符),否则查询字符串并不总是按照您预期的方式进行解析。

试试这个(注意前 4 个字符串末尾的额外空格):

const result = this.session.run(
'MATCH p=(n:Category)-[:subcategory*]->(m) ' +
'WHERE NOT (m)-[:subcategory]->() ' +
'WITH COLLECT(p) as ps ' +
'CALL apoc.convert.toTree(ps) yield value ' +
'RETURN value;'
);

详情

您的原始查询产生以下查询字符串:

MATCH p=(n:Category)-[:subcategory*]->(m)WHERE NOT (m)-[:subcategory]->()WITH COLLECT(p) as psCALL apoc.convert.toTree(ps) yield valueRETURN value;

Cypher 解析器被 psCALLvalueRETURN 绊倒了。

关于javascript - Neo4j - 浏览器中的 Cypher 查询与驱动程序之间的区别? (使用 COLLECT、apoc 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44104346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com