Cypher unwind 和嵌套的 CSV 数据只匹配第一次出现

问题描述 投票:0回答:2

我正在处理 2 组独立的 CSV 输入数据、参考列表和文档列表。 我正在构建一个 graphDB 来跟踪哪个文档依赖于哪个引用。 文档列表 CSV 文件包含需要为每个文档单独评估的引用的嵌套数据。

我当前的密码只为第一个匹配创建关系,每个文档的引用量各不相同,可能为空,因此 UNWIND 和 WHERE EXISTS。

我希望为每个成功匹配的引用创建一个新关系,而不仅仅是第一个。 第二个引用可能导致匹配失败,展开中的第三个匹配可能成功,对于 UNWIND 找到的每个引用,依此类推。

MATCH (doc:ProjectLibrary) WHERE EXISTS(doc.`References:DocumentIDValue`)
UNWIND split(doc.`References:DocumentIDValue`,';') AS reference
MATCH(n:Reference_Verified {DocumentID: reference}) 
MERGE(doc)-[:References]->(n)

匹配不成功时迭代是否停止?

我仍在考虑 for 循环,因此这些单行查询需要一些时间来使用。

[更新]

跟进评论,结果发现第二个和后面的项目包含一个前面的“#”,这将导致匹配失败。

虽然这个较新的查询解决了'#',但最终结果没有改变:

MATCH (doc:ProjectLibrary) WHERE EXISTS(doc.`References:DocumentIDValue`)
UNWIND split(doc.`References:DocumentIDValue`,';') AS reference
WITH REPLACE(reference,"#","") AS refclean 
MATCH(n:Reference_Verified {DocumentID: refclean})
MERGE(doc)-[:References]->(n)
neo4j cypher
2个回答
0
投票

你考虑过子查询吗?像...

MATCH (doc:ProjectLibrary) WHERE EXISTS(doc.`References:DocumentIDValue`)
UNWIND split(doc.`References:DocumentIDValue`,';') AS reference
call
{
with reference
MATCH(n:Reference_Verified {DocumentID: reference}) 
return n
}
MERGE(doc)-[:References]->(n)

如果您尝试链接文档,则可以嵌套子查询。


0
投票

我从Merge Nodes and Relationship

中获得一些灵感解决了这个问题(基于没有冒犯“#”的数据)

使用带有 RANGE 的 UNWIND 和迭代器提供我需要的 for 循环:

MATCH (doc:ProjectList) WHERE EXISTS(doc.ReferencesDocumentIDValue)
WITH SPLIT(doc.ReferencesDocumentIDValue,';') AS refID_split, doc
UNWIND range(0, size(refID_split)) AS i
MATCH (ref:Reflist) WHERE ref.DocumentID = refID_split[i]
MERGE (doc)-[:references]->(ref)
© www.soinside.com 2019 - 2024. All rights reserved.