Neo4j通配符搜索现有关系?

时间:2017-03-19 02:22:24

标签: neo4j

如何仅在节点指定的特定关系尚不存在的情况下在节点之间创建关系?

我能得到的最接近的是:

MATCH (d1:Document),(d2:Document), (d1)-[r]-()
WHERE d1.acct  = d2.acct 
AND d1.doc_type = 'ID' AND d2.doc_type = 'PA' 
AND d1.DD_sd = d2.DD_sd
AND NOT TYPE (r) =~ ':IDRelated*.' 
CREATE (d1) -[:IDRelated_SameDD]-> (d2)

但这不如列出要排除的特定关系那么准确。

我想要像:

MATCH (d1:Document),(d2:Document)
WHERE d1.acct  = d2.acct 
AND d1.doc_type = 'ID' AND d2.doc_type = 'PA' 
AND d1.DD_sd = d2.DD_sd
AND NOT ( (d1) -[':IDRelated*.']- () ) 
CREATE (d1) -[:IDRelated_SameDD]-> (d2)

我可以使用正则表达式(或STARTS WITH)指定一个模式来排除与该模式匹配的多个关系。

谢谢!

1 个答案:

答案 0 :(得分:4)

目前没有这种方式可以在一个模式中内联。

但是,您可能想要查询您的查询,并将其与您将匹配保存到d2的查询进行比较,直到您完成对正确d1匹配的过滤。像这样:

MATCH (d1:Document)-[r]-()
WHERE d1.doc_type = 'ID' 
WITH d1, COLLECT(r) as rels
WHERE NONE(r in rels WHERE type(r) STARTS WITH 'IDRelated')
MATCH (d2:Document)
WHERE d1.acct  = d2.acct 
AND d1.DD_sd = d2.DD_sd
AND d2.doc_type = 'PA'
CREATE (d1) -[:IDRelated_SameDD]-> (d2)