在Cypher中构建路径时打破关系周期

时间:2018-05-11 14:04:45

标签: neo4j cypher graph-theory

Graph layout

可以使用此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);

这是“杰克想要邻居所拥有的狗”这句话的图表。请注意,“the”一词出现两次。在该模型中,每个节点表示特定单词(不是单词的实例)。但是,我们应该能够重建单个句子,因为我们在:PRECEDES关系的属性中编码的单词中有句子的索引。

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

1 个答案:

答案 0 :(得分:1)

我同意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

中找到一个句子

我建议:将句子作为起始节点,与单词的关系。

稍后,您将遇到“过度连接的节点”问题(使用,on,on,...) 看看graphaware的NLP插件