首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Neo4j Cypher删除重复值

Neo4j Cypher删除重复值
EN

Stack Overflow用户
提问于 2022-07-11 16:04:31
回答 1查看 61关注 0票数 1

在我的Cypher查询中,我返回2列:

代码语言:javascript
运行
复制
RETURN  node.name, rootNode.name

这是列的值:

如果该列的值存在于任何一个Neo4j列值中,如何从node.name列中删除使用rooNode.name Cypher的所有记录?

更新

这是我的整个查询:

代码语言:javascript
运行
复制
@Query("CALL db.index.fulltext.queryNodes(\"skillAndTranslationLowerNames\", $namePattern) YIELD node, score " +
        "WHERE node.deleted = false " +
        "OPTIONAL MATCH (node)-[:ALIAS_FOR*]->(rootAliasOwner:Skill {deleted: false}) " +
        "WHERE NOT (rootAliasOwner)-[:ALIAS_FOR*]->(:Skill) " +
        "OPTIONAL MATCH (node)<-[:CONTAINS]-(translationOwner:Skill {deleted: false}) " +

        "OPTIONAL MATCH (translationOwner)-[:ALIAS_FOR*]->(rootTranslationOwner:Skill {deleted: false}) " +
        "WHERE NOT (rootTranslationOwner)-[:ALIAS_FOR*]->(:Skill) " +
        "WITH node, score, rootAliasOwner, coalesce(rootTranslationOwner, translationOwner) as rootTranslationOwner " +
        "WITH node, score, coalesce(rootAliasOwner, rootTranslationOwner) as rootNode " +

        "OPTIONAL MATCH (node)-[rNodeT:CONTAINS]->(nodeT:Translation {deleted: false}) WHERE ($iso6391 IS NOT null AND nodeT.iso6391 = $iso6391) " +
        "OPTIONAL MATCH (rootNode)-[rRootNodeT:CONTAINS]->(rootNodeT:Translation {deleted: false}) WHERE ($iso6391 IS NOT null AND rootNodeT.iso6391 = $iso6391) " +

        "RETURN DISTINCT node, rNodeT, nodeT, rootNode, rRootNodeT, rootNodeT, score " +
        "SKIP $page LIMIT $size")

例如,我有以下结果集:

代码语言:javascript
运行
复制
"ecmascript-harmony"       null 
"ecmascript-8"             "ecmascript-2017"    
"ecmascript-2017"          null 
"ecmascript-next"          null 
"ecmascript-7"             "ecmascript-2016"    
"ecmascript-2016"          null 
"ecmascript-5"             null

我需要删除结果集中rootNode存在于node列(任何行)中的记录。在上面的示例中,这是"ecmascript-2016""ecmascript-2017"。因此,我需要收到以下信息:

代码语言:javascript
运行
复制
"ecmascript-harmony"       null 
"ecmascript-2017"          null 
"ecmascript-next"          null     
"ecmascript-2016"          null 
"ecmascript-5"             null
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-12 06:10:27

这不是小事一桩,但这应该是可行的:

代码语言:javascript
运行
复制
CALL db.index.fulltext.queryNodes("skillAndTranslationLowerNames", $namePattern) YIELD node, score
WHERE node.deleted = false
OPTIONAL MATCH (node)-[:ALIAS_FOR*]->(rootAliasOwner:Skill {deleted: false})
WHERE NOT (rootAliasOwner)-[:ALIAS_FOR*]->(:Skill)
OPTIONAL MATCH (node)<-[:CONTAINS]-(translationOwner:Skill {deleted: false})
OPTIONAL MATCH (translationOwner)-[:ALIAS_FOR*]->(rootTranslationOwner:Skill {deleted: false})
WHERE NOT (rootTranslationOwner)-[:ALIAS_FOR*]->(:Skill)
WITH node, score, rootAliasOwner, coalesce(rootTranslationOwner, translationOwner) as rootTranslationOwner
WITH node, score, coalesce(rootAliasOwner, rootTranslationOwner) as rootNode
OPTIONAL MATCH (node)-[rNodeT:CONTAINS]->(nodeT:Translation {deleted: false}) WHERE ($iso6391 IS NOT null AND nodeT.iso6391 = $iso6391)
OPTIONAL MATCH (rootNode)-[rRootNodeT:CONTAINS]->(rootNodeT:Translation {deleted: false}) WHERE ($iso6391 IS NOT null AND rootNodeT.iso6391 = $iso6391)
WITH DISTINCT node, rNodeT, nodeT, rootNode, rRootNodeT, rootNodeT, score SKIP $page LIMIT $size
WITH COLLECT({n: node, rNt: rNodeT, nT: nodeT, rN: rootNode, rRNT: rRootNodeT, rNet: rootNodeT, score: score}) AS data
WITH data, reduce(map = {}, record IN data | apoc.map.setEntry(map, record.n.name, true)) AS map
UNWIND data AS rec
WITH rec.n AS node, rec.rNt AS rNodeT, rec.nT AS nodeT, rec.rN AS rootNode, rec.rRNT AS rRootNodeT, rec.rNet AS rootNodeT, rec.score AS score, map WHERE apoc.map.get(map, rootNode.name, null) IS NULL
RETURN node, rNodeT, nodeT, rootNode, rRootNodeT, rootNodeT, score

让我们注意这一部分:

代码语言:javascript
运行
复制
WITH DISTINCT node, rNodeT, nodeT, rootNode, rRootNodeT, rootNodeT, score 
SKIP $page LIMIT $size
WITH COLLECT({n: node, rNt: rNodeT, nT: nodeT, rN: rootNode, rRNT: rRootNodeT, rNet: rootNodeT, score: score}) AS data
WITH data, reduce(map = {}, record IN data | apoc.map.setEntry(map, record.n.name, true)) AS map
UNWIND data AS rec
WITH rec.n AS node, rec.rNt AS rNodeT, rec.nT AS nodeT, rec.rN AS rootNode, rec.rRNT AS rRootNodeT, rec.rNet AS rootNodeT, rec.score AS score, map WHERE apoc.map.get(map, rootNode.name, null) IS NULL
RETURN node, rNodeT, nodeT, rootNode, rRootNodeT, rootNodeT, score

在这里,在应用SKIPLIMIT之后,我们将数据集限制在所需的数量上。然后我们收集一个列表中的数据,基本上是一个地图列表。然后使用reduce函数填充一个映射,以节点的name属性作为键,其值为真。然后,我们展开上面创建的列表,并过滤记录,其中rootNode name存在于地图中。最后,返回过滤后的记录。

试试看,没有测试过。并根据用例定位SKIPLIMIT

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72941468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档