看似简单的Neo4j密码查询无法执行

看似简单的Neo4j密码查询无法执行,neo4j,cypher,Neo4j,Cypher,数据模型是: > (A:word {word:'word'})-[:NEXT sentence:<s-order> word:<w-order>]->(B:word) > (S:Sentence)-[:START]->(A:word) 问:为什么这个查询失败了 我想到的可能答案是: 这可能与围绕word18循环创建关系有关。如您所见,它在查询中使用了两次,创建了两个传入和两个传出,它们彼此不同: 29->18->30 32->18->33 我

数据模型是:

> (A:word {word:'word'})-[:NEXT sentence:<s-order> word:<w-order>]->(B:word)
> (S:Sentence)-[:START]->(A:word)
问:为什么这个查询失败了

我想到的可能答案是:

这可能与围绕word18循环创建关系有关。如您所见,它在查询中使用了两次,创建了两个传入和两个传出,它们彼此不同:

  • 29->18->30
  • 32->18->33
我怎样才能防止这种情况


Neo4j版本是3.0.6 CE。

是!找到答案。。。数据集减少到40个节点。这仍然让查询中断。(数据集中有31个节点有关系,9个没有关系)
经过多次跟踪查询后,发现以下工作查询:

MATCH (word8:word {word:'de'}),
(word24:word {word:'platen'}),
(word25:word {word:'halen'}),
(word26:word {word:'alles'}),
(word27:word {word:'wel'}),
(word28:word {word:'weer'}),
(word29:word {word:'voor'}),
(word18:word {word:'je'}),
(word30:word {word:'naar'}),
(word31:word {word:'boven'}),
(word32:word {word:'als'}),
(word33:word {word:'ze'}),
(word3353:word {word:'afspeelt'}), 
(PrevSentence:Sentence {order:2}) 
MERGE (PrevSentence)-[:NEXT]->
  (ThisSentence:Sentence {order:3})-[:START]->(word8)
MERGE (word8)-[nw26:NEXT {sentence:3, word:0}]->(word24)
MERGE (word24)-[nw27:NEXT {sentence:3, word:1}]->(word25)
MERGE (word25)-[nw28:NEXT {sentence:3, word:2}]->(word26)
MERGE (word26)-[nw29:NEXT {sentence:3, word:3}]->(word27)
MERGE (word27)-[nw30:NEXT {sentence:3, word:4}]->(word28)
MERGE (word28)-[nw31:NEXT {sentence:3, word:5}]->(word29)
MERGE (word29)-[nw32:NEXT {sentence:3, word:6}]->(word18)
MERGE (word18)-[nw33:NEXT {sentence:3, word:7}]->(word30)
MERGE (word30)-[nw34:NEXT {sentence:3, word:8}]->(word31)
MERGE (word31)-[nw35:NEXT {sentence:3, word:9}]->(word32)
MERGE (word32)-[nw36:NEXT {sentence:3, word:10}]->(word18)
MERGE (word18)-[nw37:NEXT {sentence:3, word:11}]->(word33)
MERGE (word33)-[nw38:NEXT {sentence:3, word:12}]->(word3353) 
正如你所看到的,它涉及到将整个关系链分解到原子级。在这种情况下,Neo4j在加工零件方面没有任何问题


虽然找到了答案,但我仍然很好奇为什么Neo4j不能处理这个查询。节点链太长?查询处理中的“辅助”数据太多?

是否尝试将单词的条件从
WHERE
子句移动到
MATCH
子句?例如
匹配(word0:word{word:'albums'}),…
。就性能而言,它应该不会有什么不同(但这一点值得使用
配置文件
进行检查)。另外,我认为它提高了可读性。谢谢Gábor!我已经完全删除了where子句。这要整洁得多。但是,我仍然无法运行某些查询。在第二个匹配中,您没有将
PrevSession
绑定到任何特定类型(例如
:Session
),只对
顺序进行筛选。在大型图形上进行计算可能很慢。另一个小建议是:在第一个
匹配
之后的
WITH
子句是不必要的。我只创建了查询所需的节点,在一个空数据库上运行良好。你能在一个空数据库上做实验吗?也许继续?谢谢@GáborSzárnyas引导我找到答案:-)
MATCH (word8:word {word:'de'}),
(word24:word {word:'platen'}),
(word25:word {word:'halen'}),
(word26:word {word:'alles'}),
(word27:word {word:'wel'}),
(word28:word {word:'weer'}),
(word29:word {word:'voor'}),
(word18:word {word:'je'}),
(word30:word {word:'naar'}),
(word31:word {word:'boven'}),
(word32:word {word:'als'}),
(word33:word {word:'ze'}),
(word3353:word {word:'afspeelt'}), 
(PrevSentence:Sentence {order:2}) 
MERGE (PrevSentence)-[:NEXT]->
  (ThisSentence:Sentence {order:3})-[:START]->(word8)
MERGE (word8)-[nw26:NEXT {sentence:3, word:0}]->(word24)
MERGE (word24)-[nw27:NEXT {sentence:3, word:1}]->(word25)
MERGE (word25)-[nw28:NEXT {sentence:3, word:2}]->(word26)
MERGE (word26)-[nw29:NEXT {sentence:3, word:3}]->(word27)
MERGE (word27)-[nw30:NEXT {sentence:3, word:4}]->(word28)
MERGE (word28)-[nw31:NEXT {sentence:3, word:5}]->(word29)
MERGE (word29)-[nw32:NEXT {sentence:3, word:6}]->(word18)
MERGE (word18)-[nw33:NEXT {sentence:3, word:7}]->(word30)
MERGE (word30)-[nw34:NEXT {sentence:3, word:8}]->(word31)
MERGE (word31)-[nw35:NEXT {sentence:3, word:9}]->(word32)
MERGE (word32)-[nw36:NEXT {sentence:3, word:10}]->(word18)
MERGE (word18)-[nw37:NEXT {sentence:3, word:11}]->(word33)
MERGE (word33)-[nw38:NEXT {sentence:3, word:12}]->(word3353)