在 Cypher 中构建路径时打破关系循环

Breaking relationship cycles when constructing paths in Cypher

上面的图表可以用这个 Cypher 脚本创建:

CREATE
    (t1:Token {content: "Jake"}),
    (t2:Token {content: "wanted"}),
    (det:Token {content: "the"}),
    (t3:Token {content: "dog"}),
    (t4:Token {content: "neighbours"}),
    (t5:Token {content: "had"}),
    (t1)-[:PRECEDES {index: 0}]->(t2),      
    (t2)-[:PRECEDES {index: 1}]->(det),      
    (det)-[:PRECEDES {index: 2}]->(t3),      
    (t3)-[:PRECEDES {index: 3}]->(det),      
    (det)-[:PRECEDES {index: 4}]->(t4),
    (t4)-[:PRECEDES {index: 5}]->(t5);

这是句子 "Jake wanted the dog the neighbours had" 的图表。请注意 'the' 一词出现了两次。在这个模型中,每个节点代表一个特定的词(不是一个词的实例)。然而,我们应该能够重建单个句子,因为我们在 :PRECEDES 关系上的 属性 中编码的单词中有句子的索引。

有没有办法在Cypher中查询这句话作为路径,使用index 属性来避免在代表the的节点上进入循环?

我想提出一个替代模式,因为你拥有的模式会崩溃 and/or 一旦你添加更多的句子就会表现得很糟糕。

1) 对于每个句子,创建一个节点来表示该句子。

2) 创建从该节点到句子中每个单词节点的关系,并在该关系上添加索引 属性。 (您可以对第一个和最后一个元素使用 first/end 关系,或者将其添加为 属性 以简化 Cyphers)

3) 运行 Cyphers 在你的 "sentence" 节点上。按关系排序词索引

这将使您的数据更易于读取、查询和写入。

我同意 Tezra 的句子节点。

使用你的模型,我得到了一个有趣的结果

 MATCH (t2:Token) 
 WHERE NOT (t2:Token)<-[:PRECEDES]-(:Token)
 WITH t2
 MATCH (t2)-[pr:PRECEDES*..]->(t3:Token)
 WITH t2, last(pr).index AS pos, t3.content AS txt ORDER BY pos
 RETURN t2.content, pos, txt

最后两个字重复了。我认为更长的句子会产生更多的噪音 你可以在 PRECEDES

中有一个 sentenceId

我建议将 :Sentence 作为起始节点,与单词相关。

稍后,您将遇到 "over-connected node" 问题(with, the, on, ...) 看看来自 graphaware

的 NLP 插件