根据条件克隆一些关系

时间:2016-04-14 15:36:41

标签: sql-server neo4j impact-analysis

我将两个名为Keys和Acc表的表从SQL Server导出为CSV文件,并使用以下命令将它们成功导入Neo4J。

CREATE INDEX ON :Keys(IdKey) 

USING PERIODIC COMMIT 500
LOAD CSV FROM 'file:///C:/Keys.txt' AS line
MERGE (k:Keys { IdKey: line[0] })
SET k.KeyNam=line[1], k.KeyLib=line[2], k.KeyTyp=line[3], k.KeySubTyp=line[4]

USING PERIODIC COMMIT 500
LOAD CSV FROM 'file:///C:/Acc.txt' AS line
MERGE (callerObject:Keys { IdKey : line[0] })
MERGE (calledObject:Keys { IdKey : line[1] })
MERGE (callerObject)-[rc:CALLS]->(calledObject)
SET rc.AccKnd=line[2], rc.Prop=line[3]

Keys代表源代码对象,Acc代表它们之间的关系。我为三个不同的应用程序项目导入了这两个表三次。因此,为了保持IdKey属性对于三个应用程序是唯一的,我将一个五字符前缀连接到IdKey,以便在从sql server导出时识别Application for Application,因为我无法根据手册中的数据创建基于多个字段的索引。现在我的目标是构建应用程序之间的关系。例如:

  • Node1是Application1的源代码对象
  • Node2是Application1的另一个源代码对象
  • Node3是Application2的源代码对象

由于已导入的Acc中的记录,已经存在从Node1到Node2创建的CALL关系。 Node2的名称等于Node3的名称。所以我们可以说Node2和Node3实际上是相同的源代码。所以我们应该创建一个从Node1到Node3的关系。为了实现它,我在下面写了一个命令。但我想确定它是正确的。因为我不知道它会执行多长时间。

MATCH (caller:Keys)-[rel:CALLS]->(called:Keys),(calledNew:Keys)
WHERE calledNew.KeyNam = called.KeyNam 
and calledNew.IdKey <> called.IdKey
CREATE (caller)-[:CALLS]->(calledNew)

1 个答案:

答案 0 :(得分:0)

以下查询应该有效,假设您:Keys(KeyNam)上也create an index

MATCH (caller:Keys)-[rel:CALLS]->(called:Keys) 
WITH caller, COLLECT(called.KeyNam) AS names 
MATCH (calledNew:Keys) 
WHERE calledNew.KeyNam IN names AND NOT (caller)-[:CALLS]->(calledNew) 
CREATE (caller)-[:CALLS]->(calledNew)

在属性值之间直接进行比较时,Cypher不会使用索引。因此,此查询会将每个called的所有caller名称放入names集合中,然后对calledNew.KeyNam与该集合中的项目进行比较。这会导致使用索引,并将加速识别潜在的重复称为节点。

此查询还会执行NOT (caller)-[:CALLS]->(calledNew)检查,以避免在相同节点之间创建重复关系。

相关问题