neo4j CYPHER - 在创建时动态设置列表或地图

neo4j CYPHER - ON CREATE SET dynamically either list or map

要将 XML 数据导入 neo4j 数据库,我首先将 XML 解析为 python 字典,然后使用 CYPHER 查询:

WITH $pubmed_dict as pubmed_article
UNWIND pubmed_article as particle
    MERGE (p:Publication {pmid: particle.MedlineCitation.PMID.text})
    ON CREATE SET p.title = COALESCE (particle.MedlineCitation.Article.Journal.Title, particle.MedlineCitation.Article.ArticleTitle)
    ON MATCH SET p.title = COALESCE (particle.MedlineCitation.Article.Journal.Title, particle.MedlineCitation.Article.ArticleTitle)

FOREACH (author IN particle.MedlineCitation.Article.AuthorList.Author |
  MERGE (a:Author {last_name: COALESCE(author.LastName, 'LAST NAME MISSING!'), first_name: COALESCE(author.ForeName, 'FIRST NAME MISSING!')})
  MERGE (p)<-[:WROTE]-(a)      
)

设置 a.affiliation = author.AffiliationInfo.Affiliation 工作正常,但前提是 XML 下的 XML 中没有多个隶属关系,如下所示:

...
                <Author ValidYN="Y">
                    <LastName>Tatarsky</LastName>
                    <ForeName>Rose L</ForeName>
                    <Initials>RL</Initials>
                    <AffiliationInfo>
                        <Affiliation>Department of Zoology, University of Wisconsin, Madison, WI, 53706, USA.</Affiliation>
                    </AffiliationInfo>
                    <AffiliationInfo>
                        <Affiliation>Department of Neuroscience, University of Wisconsin, Madison, WI, 53706, USA.</Affiliation>
                    </AffiliationInfo>
                </Author>
...

这会导致错误:

neo4j.exceptions.CypherTypeError: Type mismatch: expected a map but was List{Map{Affiliation -> String("Department of Zoology, University of Wisconsin, Madison, WI, 53706, USA.")}, Map{Affiliation -> String("Department of Neuroscience, University of Wisconsin, Madison, WI, 53706, USA.")}}

有没有办法在赋值前检查 ON CREATE/MATCH SET 是地图还是列表?

如果列表被识别,我想遍历它并设置属性,如 affiliation1、affiliation2 等等,如果可能的话。

您可以设置字符串列表,因此在您的 python 代码中,您必须将这些字典列表转换为字符串列表。

为什么在这里使用 FOREACH 而不是另一个 UNWIND ? 我没看到你在哪里创建作者?

WITH $pubmed_dict as pubmed_article
UNWIND pubmed_article as particle


UNWIND particle.MedlineCitation.Article.AuthorList.Author as author
  MERGE (a:Author {last_name: COALESCE(author.LastName, 'LAST NAME MISSING!')})
  SET a.first_name = author.ForeName, a.affiliation = author.AffiliationInfo.Affiliation
  MERGE (p)<-[:WROTE]-(a)