如何 return 只有一个给定关系的节点
How to return nodes that have only one given relationship
我有代表文档的节点和代表实体的节点。实体可以在文档中引用,如果是这样,它们将通过这样的关系链接在一起:
(doc)<-[:IS_REFERENCED_IN]-(entity)
同一个实体可以被多个文档引用,一个文档可以引用多个实体。
我想删除给定文档中引用的每个实体仅。
我想到了两种不同的方法来做到这一点。
第一个使用 java 来制作一个 foreach,基本上是这样的:
List<Entity> entities = MATCH (d:Document {id:0})<-[:IS_REFERENCED_IN]-(e:Entity) return e
for (Entity entity : entities){
MATCH (e:Entity)-[r:IS_REFERENCED_IN]->(d:Document) WITH *, count(r) as nb_document_linked WHERE nb_document_linked = 1 DELETE e
}
此方法可行,但我不想使用 foreach 或 java 代码来实现。我想在一个密码查询中完成。
第二个只使用一个密码查询但不起作用。是这样的:
MATCH (d:Document {id:0})<-[:IS_REFERENCED_IN]-(e:Entity)-[r:IS_REFERENCED_IN]->(d:Document) WITH *, count(r) as nb_document_linked WHERE nb_document_linked = 1 DELETE e
这里的问题是 nb_document_linked 不是每个实体唯一的,它是所有实体的唯一变量,这意味着它会计算每个实体的每个关系,这是我不想要的.
那么我怎样才能在我的密码查询中创建一种 foreach 使其工作?
抱歉我的英语不好,我希望问题清楚,如果您需要任何信息,请问我。
您可以这样做:
MATCH (d:Document{key:1})<-[:IS_REFERENCED_IN]-(e:Entity)
WITH e
MATCH (d:Document)<-[:IS_REFERENCED_IN]-(e)
WITH COUNT (d) AS countD, e
WHERE countD=1
DETACH DELETE e
您可以在处理此示例数据时看到:
MERGE (a:Document {key: 1})
MERGE (b:Document {key: 2})
MERGE (c:Document {key: 3})
MERGE (d:Entity{key: 4})
MERGE (e:Entity{key: 5})
MERGE (f:Entity{key: 6})
MERGE (g:Entity{key: 7})
MERGE (h:Entity{key: 8})
MERGE (i:Entity{key: 9})
MERGE (j:Entity{key: 10})
MERGE (k:Entity{key: 11})
MERGE (l:Entity{key: 12})
MERGE (m:Entity{key: 13})
MERGE (d)-[:IS_REFERENCED_IN]-(a)
MERGE (e)-[:IS_REFERENCED_IN]-(a)
MERGE (f)-[:IS_REFERENCED_IN]-(a)
MERGE (g)-[:IS_REFERENCED_IN]-(a)
MERGE (d)-[:IS_REFERENCED_IN]-(b)
MERGE (e)-[:IS_REFERENCED_IN]-(b)
MERGE (f)-[:IS_REFERENCED_IN]-(c)
MERGE (g)-[:IS_REFERENCED_IN]-(c)
MERGE (j)-[:IS_REFERENCED_IN]-(a)
MERGE (h)-[:IS_REFERENCED_IN]-(a)
MERGE (i)-[:IS_REFERENCED_IN]-(a)
MERGE (g)-[:IS_REFERENCED_IN]-(c)
MERGE (k)-[:IS_REFERENCED_IN]-(c)
MERGE (l)-[:IS_REFERENCED_IN]-(c)
MERGE (m)-[:IS_REFERENCED_IN]-(c)
它删除了 3 个实体。
第一个 MATCH
查找附加到您的输入文档的实体,第二个 MATCH
查找每个实体所连接的文档数。
我有代表文档的节点和代表实体的节点。实体可以在文档中引用,如果是这样,它们将通过这样的关系链接在一起:
(doc)<-[:IS_REFERENCED_IN]-(entity)
同一个实体可以被多个文档引用,一个文档可以引用多个实体。
我想删除给定文档中引用的每个实体仅。
我想到了两种不同的方法来做到这一点。 第一个使用 java 来制作一个 foreach,基本上是这样的:
List<Entity> entities = MATCH (d:Document {id:0})<-[:IS_REFERENCED_IN]-(e:Entity) return e
for (Entity entity : entities){
MATCH (e:Entity)-[r:IS_REFERENCED_IN]->(d:Document) WITH *, count(r) as nb_document_linked WHERE nb_document_linked = 1 DELETE e
}
此方法可行,但我不想使用 foreach 或 java 代码来实现。我想在一个密码查询中完成。 第二个只使用一个密码查询但不起作用。是这样的:
MATCH (d:Document {id:0})<-[:IS_REFERENCED_IN]-(e:Entity)-[r:IS_REFERENCED_IN]->(d:Document) WITH *, count(r) as nb_document_linked WHERE nb_document_linked = 1 DELETE e
这里的问题是 nb_document_linked 不是每个实体唯一的,它是所有实体的唯一变量,这意味着它会计算每个实体的每个关系,这是我不想要的.
那么我怎样才能在我的密码查询中创建一种 foreach 使其工作?
抱歉我的英语不好,我希望问题清楚,如果您需要任何信息,请问我。
您可以这样做:
MATCH (d:Document{key:1})<-[:IS_REFERENCED_IN]-(e:Entity)
WITH e
MATCH (d:Document)<-[:IS_REFERENCED_IN]-(e)
WITH COUNT (d) AS countD, e
WHERE countD=1
DETACH DELETE e
您可以在处理此示例数据时看到:
MERGE (a:Document {key: 1})
MERGE (b:Document {key: 2})
MERGE (c:Document {key: 3})
MERGE (d:Entity{key: 4})
MERGE (e:Entity{key: 5})
MERGE (f:Entity{key: 6})
MERGE (g:Entity{key: 7})
MERGE (h:Entity{key: 8})
MERGE (i:Entity{key: 9})
MERGE (j:Entity{key: 10})
MERGE (k:Entity{key: 11})
MERGE (l:Entity{key: 12})
MERGE (m:Entity{key: 13})
MERGE (d)-[:IS_REFERENCED_IN]-(a)
MERGE (e)-[:IS_REFERENCED_IN]-(a)
MERGE (f)-[:IS_REFERENCED_IN]-(a)
MERGE (g)-[:IS_REFERENCED_IN]-(a)
MERGE (d)-[:IS_REFERENCED_IN]-(b)
MERGE (e)-[:IS_REFERENCED_IN]-(b)
MERGE (f)-[:IS_REFERENCED_IN]-(c)
MERGE (g)-[:IS_REFERENCED_IN]-(c)
MERGE (j)-[:IS_REFERENCED_IN]-(a)
MERGE (h)-[:IS_REFERENCED_IN]-(a)
MERGE (i)-[:IS_REFERENCED_IN]-(a)
MERGE (g)-[:IS_REFERENCED_IN]-(c)
MERGE (k)-[:IS_REFERENCED_IN]-(c)
MERGE (l)-[:IS_REFERENCED_IN]-(c)
MERGE (m)-[:IS_REFERENCED_IN]-(c)
它删除了 3 个实体。
第一个 MATCH
查找附加到您的输入文档的实体,第二个 MATCH
查找每个实体所连接的文档数。