我将两个名为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,因为我无法根据手册中的数据创建基于多个字段的索引。现在我的目标是构建应用程序之间的关系。例如:
由于已导入的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)
答案 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)
检查,以避免在相同节点之间创建重复关系。