为 Neo4j 的 CQL 创建 NOT MATCH 命令? [英] Create on NOT MATCH command for Neo4j's CQL?

查看:16
本文介绍了为 Neo4j 的 CQL 创建 NOT MATCH 命令?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个非唯一节点 (:Neighborhood),它唯一出现在 [:IN] 一个 (:City) 节点.我想创建一个新的邻居节点并仅在该城市中不存在该邻居节点时才建立其关系.可以有多个同名的街区,但每个街区必须在房产城市中唯一出现.

按照此处 Gil 的回答的建议:返回节点如果关系不存在,我该怎么做:

MATCH a WHERE NOT (a:Neighborhood {name : line.Neighborhood})-[r:IN]->(c:City {name : line.City})比赛集 (a)-[r]-(c)

那么它只会创建一个新的社区节点,如果它不存在于城市中.

**更新:**我对其进行了升级和分析,但仍然无法利用任何优化...

PROFILE LOAD CSV WITH HEADERS FROM "file://THEFILE" as line带行限制 0匹配 (c:City { name : line.City})MERGE (n:Neighborhood {name : toInt(line.Neighborhood)})-[:IN]->(c);+--------------+------+--------+----------------+------------------------------+|操作员 |行 |DbHits |标识符 |其他 |+--------------+------+--------+----------------+------------------------------+|空结果 |0 |0 ||||更新图 |5 |16 |anon[340], b, 邻里, 线 |合并模式 ||架构索引 |5 |10 |b、线|line.City;:城市(名称) ||列过滤器 |5 |0 |线|保持列线||过滤器 |5 |0 |匿名 [216], 行 |匿名[216] ||提取 |5 |0 |匿名 [216], 行 |匿名[216] ||切片 |5 |0 |线|{ AUTOINT0} ||加载CSV |5 |0 |线||+--------------+------+--------+----------------+------------------------------+

解决方案

我认为你可以简单地使用 MERGE :

MATCH (c:City {name: line.City})合并 c<-[:IN]-(a:Neighborhood {name : line.Neighborhood})

如果您尚未导入所有城市,您可以使用 MERGE 创建它们:

MATCH (c:City {name: line.City})合并 c<-[:IN]-(a:Neighborhood {name : line.Neighborhood})

但要注意 Eager 操作符:

http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

简而言之:您应该运行 LOAD CSV(我假设这就是您在这里所做的)两次,一次加载城市,一次加载社区.

I have a non-unique node (:Neighborhood) that uniquely appears [:IN] a (:City) node. I would like to create a new neighborhood node and establish its relationship ONLY if that neighborhood node does not exist in that city. There can be multiple neighborhoods that have the same name, but each neighborhood must appear uniquely appear in the property city.

Following the advice from the Gil's answer here: Return node if relationship is not present, how can I do something like:

MATCH a WHERE NOT (a:Neighborhood {name : line.Neighborhood})-[r:IN]->(c:City {name : line.City})
ON MATCH SET (a)-[r]-(c)

So then it would only create a new neighborhood node if it doesn't already exist in the city.

**UPDATE:**I upgraded and profiled it and still can't take advantage of any optimizations...

PROFILE LOAD CSV WITH HEADERS FROM "file://THEFILE" as line
WITH line LIMIT 0
MATCH (c:City { name : line.City})
MERGE (n:Neighborhood {name : toInt(line.Neighborhood)})-[:IN]->(c)

;


+--------------+------+--------+---------------------------+------------------------------+
|     Operator | Rows | DbHits |               Identifiers |                        Other |
+--------------+------+--------+---------------------------+------------------------------+
|  EmptyResult |    0 |      0 |                           |                              |
|  UpdateGraph |    5 |      16 | anon[340], b, neighborhood, line |                 MergePattern |
|  SchemaIndex |    5 |      10 |                   b, line | line.City; :City(name) |
| ColumnFilter |    5 |      0 |                      line |            keep columns line |
|       Filter |    5 |      0 |           anon[216], line |                    anon[216] |
|      Extract |    5 |      0 |           anon[216], line |                    anon[216] |
|        Slice |    5 |      0 |                      line |                 {  AUTOINT0} |
|      LoadCSV |    5 |      0 |                      line |                              |
+--------------+------+--------+---------------------------+------------------------------+

解决方案

I think you could simply use MERGE for this:

MATCH (c:City {name: line.City})
MERGE c<-[:IN]-(a:Neighborhood {name : line.Neighborhood})

If you haven't already imported all of the cities, you can create those with MERGE:

MATCH (c:City {name: line.City})
MERGE c<-[:IN]-(a:Neighborhood {name : line.Neighborhood})

But beware of the Eager operator:

http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

In short: You should run your LOAD CSV (I assume that's what you're doing here) twice, once to load the cities and once to load the neighborhoods.

这篇关于为 Neo4j 的 CQL 创建 NOT MATCH 命令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆