neo4j cypher:如何确定节点是否在关系集合中?

时间:2015-11-10 16:36:24

标签: neo4j cypher

我对路径有这个MATCH查询:

MATCH p=(a)-[sp1:CF*]->(b)-[sp2:CF*]->(c)-[sp3:CF*]->(d)

现在我想仅匹配那些在“子路径”中不包含某个节点的路径,例如良好的路径不应该从(a)(b)越过(avoid1)。我试过了:

MATCH p=(a)-[sp1:CF*]->(b)-[sp2:CF*]->(c)-[sp3:CF*]->(d)
WHERE NOT EXISTS ( (a)-[:CF*]->(avoid1)-[:CF*]->(b) )

没有返回任何路径。我想这是因为只是检查(a)(avoid1)以及(avoid1)(b)之间是否存在关系 - 就是这种情况。然后我尝试了

MATCH p=(a)-[sp1:CF*]->(b)-[sp2:CF*]->(c)-[sp3:CF*]->(d)
WHERE NOT ( (avoid1) IN nodes(sp1) )

这不起作用,因为sp1Collection<Relationship>而不是路径。因此我得到了错误:

  

类型不匹配:预期路径但是Collection<Relationship>

如何检查节点是否在关系集合中?

或许,有没有更聪明的方法来实现我的目标?

1 个答案:

答案 0 :(得分:2)

如果您不希望repositories { jcenter() mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } } 位于路径中的任何位置,您只需使用此(查询片段):

avoid1

[EDITED]

如果您只想在MATCH p=(a)-[sp1:CF*]->(b)-[sp2:CF*]->(c)-[sp3:CF*]->(d) WHERE NOT avoid1 IN NODES(p) avoid1之间避免a,则可以执行以下操作:

b

最后,如果您希望将MATCH p1=(a)-[sp1:CF*]->(b) WHERE NOT avoid1 IN NODES(p1) MATCH p2=(b)-[sp2:CF*]->(c)-[sp3:CF*]->(d) a的完整路径作为单一路径,则可以执行以下操作。

d