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)
要将 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)