Neo4j 在Cypher中构造路径时中断关系循环
可以使用此密码脚本创建上图:Neo4j 在Cypher中构造路径时中断关系循环,neo4j,cypher,graph-theory,Neo4j,Cypher,Graph Theory,可以使用此密码脚本创建上图: 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)-[:PRECEDE
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”一词出现两次。在这个模型中,每个节点代表一个特定的单词(不是单词的实例)。但是,我们应该能够重建单个句子,因为我们在:prefers
关系的属性中编码了单词中的句子索引
有没有办法用Cypher查询这个句子作为路径,使用
index
属性来避免在表示的节点上输入循环?我想提出一个替代方案,因为一旦添加更多的句子,您的方案就会崩溃和/或执行得很糟糕
1) 对于每个句子,创建一个节点来表示该句子
2) 创建从该节点到句子中每个单词节点的关系,并在该关系上添加索引属性。(您可以对第一个和最后一个元素使用第一个/结束关系,或者将其添加为属性以简化密码)
3) 改为在“句子”节点上运行密码。按关系索引排序单词
这将使您的数据更易于阅读、查询和写入。我同意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
匹配(t2:令牌)
其中不包括(t2:Token)(t3:Token)
使用t2,最后一个(pr).索引为pos,t3.内容为txt,按pos排序
返回t2.content、pos、txt
最后两个词重复。我想较长的句子会产生更多的噪音
在prefers中可以有一个句子ID
我建议有:句子作为起始节点,与单词有关系
稍后,您将遇到“过度连接节点”问题(使用、打开、…)
看看graphaware的NLP插件