neo4j删除链表

时间:2017-12-30 00:59:49

标签: database neo4j cypher graph-databases cypher-3.1

我有一个属于用户的帖子列表。这些帖子的结构是属于给定用户的链接列表。

我在保留数据结构的同时删除了给定节点。

以下是结构说明。

enter image description here

在我的列表尝试中,我已经编写了下面的查询,但它不起作用,因为MATCH不会在子查询中返回任何内容。

我考虑过在子查询中使用OPTIONAL MATCH,但这导致异常。

MATCH(node:Post)
WHERE ID(node) = 2749
WITH node
MATCH(user:User)-[:OWNS]->(node)-[:PREV]->(nextNode:Post)
CREATE(user)-[:OWNS]->(nextNode)
WITH node
MATCH(prevNode:Post)-[:PREV]->(node)-[:PREV]->(nextNode:Post)
CREATE(prevNode)-[:PREV]->(nextNode)
WITH node
DETACH DELETE node

我假设如果子查询中的模式失败,则将跳过子查询的其余部分,并且仍将执行下一个子查询。但似乎整个事情都没有被执行。

我们如何在不停止执行的情况下执行子查询中的内容。

IF pattern matches
THEN 
   CREATE EDGE 
IF pattern matches
THEN
   Do something else

解决方案

stdob--的答案是最接近正确的解决方案,但它无法删除列表末尾的节点并抛出异常,因为它不会检查第二个节点中是否存在nextNode FOREACH声明。

需要调整才能工作:

MATCH(node:Post) WHERE ID(node) = 2813

OPTIONAL MATCH (user:User)-[:OWNS]->(node)
OPTIONAL MATCH (node)-[:PREV]->(nextNode:Post)
OPTIONAL MATCH (prevNode:Post)-[:PREV]->(node)

FOREACH (ith in CASE 
    WHEN user IS NOT NULL AND nextNode IS NOT NULL 
    THEN [1] 
    ELSE [] 
    END | CREATE (user)-[:OWNS]->(nextNode) 
)

FOREACH (ith in CASE WHEN 
    prevNode IS NOT NULL AND nextNode IS NOT NULL 
    THEN [1] ELSE [] 
    END | CREATE (prevNode)-[:PREV]->(nextNode)
)

DETACH DELETE node

2 个答案:

答案 0 :(得分:2)

您可以使用OPTIONAL MATCHFOREACHCASE的组合:

MATCH(node:Post) WHERE ID(node) = 2749

OPTIONAL MATCH (user:User)-[:OWNS]->(node)
OPTIONAL MATCH (node)-[:PREV]->(nextNode:Post)
OPTIONAL MATCH (prevNode:Post)-[:PREV]->(node)

FOREACH (ith in CASE WHEN 
                     NOT user IS NULL AND 
                     NOT nextNode IS NULL 
                THEN [1] ELSE [] END |
    CREATE (user)-[:OWNS]->(nextNode) 
)

FOREACH (ith in CASE WHEN 
                     NOT prevNode IS NULL AND
                     NOT nextNode IS NULL
                THEN [1] ELSE [] END |
    CREATE (prevNode)-[:PREV]->(nextNode)
)

DETACH DELETE node

更新:您也可以使用apoc.libraryconditional query executionapoc.do.when程序。

答案 1 :(得分:1)

我使用以下查询重新创建了您的数据集:

WITH

正如您所提到的,使用CREATE会导致异常,  类似的东西:

  

预计在prevNode上找到一个节点,但什么都没找到(NO_VALUE)

但是,您可以通过先执行OPTIONAL MATCH,然后使用IS NOT NULL子句传递值并仅运行MATCH (user:User)-[:OWNS]->(node)-[:PREV]->(nextNode:Post) WHERE node.number = 1 CREATE (user)-[:OWNS]->(nextNode) WITH node, nextNode OPTIONAL MATCH (prevNode:Post)-[:PREV]->(node) DETACH DELETE node WITH prevNode, nextNode WHERE prevNode IS NOT NULL CREATE (prevNode)-[:PREV]->(nextNode) (如果由{引入的变量)来解决此问题。 {1}}条款def truecase(doc): truecased_sents = [] # list of truecased sentences tagged_sent = token.tag_([word.lower() for token in doc]) normalized_sent = [w.capitalize() if t in ["NN","NNS"] else w for (w,t) in tagged_sent] normalized_sent[0] = normalized_sent[0].capitalize() string = re.sub(" (?=[\.,'!?:;])", "", ' '.join(normalized_sent)) return string

  tagged_sent = token.tag_([word.lower() for token in doc])
NameError: global name 'token' is not defined