在我的Cypher查询中,我返回2列:
RETURN node.name, rootNode.name
这是列的值:
如果该列的值存在于任何一个Neo4j列值中,如何从node.name
列中删除使用rooNode.name
Cypher的所有记录?
更新
这是我的整个查询:
@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")
例如,我有以下结果集:
"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"
。因此,我需要收到以下信息:
"ecmascript-harmony" null
"ecmascript-2017" null
"ecmascript-next" null
"ecmascript-2016" null
"ecmascript-5" null
发布于 2022-07-12 06:10:27
这不是小事一桩,但这应该是可行的:
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
让我们注意这一部分:
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
在这里,在应用SKIP
和LIMIT
之后,我们将数据集限制在所需的数量上。然后我们收集一个列表中的数据,基本上是一个地图列表。然后使用reduce
函数填充一个映射,以节点的name
属性作为键,其值为真。然后,我们展开上面创建的列表,并过滤记录,其中rootNode
name
存在于地图中。最后,返回过滤后的记录。
试试看,没有测试过。并根据用例定位SKIP
和LIMIT
。
https://stackoverflow.com/questions/72941468
复制相似问题