在 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 插件
上面的图表可以用这个 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 插件