Neo4j 如何将查询中的所有节点精确匹配到另一个查询中
我的图形数据库中有两种节点:Neo4j 如何将查询中的所有节点精确匹配到另一个查询中,neo4j,cypher,Neo4j,Cypher,我的图形数据库中有两种节点:(规则)和(约束),还有一种关系(规则)->[:VALIDATED\u IF]->(约束),它有两个属性{id,type} 所以我的数据库看起来像这样: (rule1)-[:VALIDATED_IF{id1,type1}]->(constraint1) 我需要的是找出在关系中是否有两个不同的(规则)具有完全相同的(约束),并且具有相同的{id,type}。 我该怎么做 我试过这样的方法: MATCH (r1:Rule)-[p1:VALIDATED_IF]-&g
(规则)
和(约束)
,还有一种关系(规则)->[:VALIDATED\u IF]->(约束)
,它有两个属性{id,type}
所以我的数据库看起来像这样:
(rule1)-[:VALIDATED_IF{id1,type1}]->(constraint1)
我需要的是找出在关系中是否有两个不同的(规则)
具有完全相同的(约束)
,并且具有相同的{id,type}
。我该怎么做 我试过这样的方法:
MATCH (r1:Rule)-[p1:VALIDATED_IF]->(c:Constraint)<-[p2:VALIDATED_IF]-(r2:Rule)
WHERE r1.ruleName <> r2.ruleName
AND p1.id = p2.id
AND p2.type = p2.type
RETURN r1.ruleName, r2.ruleName, c.condition
MATCH(r1:Rule)-[p1:VALIDATED\u IF]->(c:Constraint)我们可以聚合每个约束的:Rule节点、rel id和rel type,当每个约束有2个以上的:Rule节点时,这也会起作用:
MATCH (rule:Rule)-[rel:VALIDATED_IF]->(c:Constraint)
WITH c, rel.id as relId, rel.type as relType, collect(rule) as rules
WHERE size(rules) > 1
RETURN c.condition as condition, [r in rules | r.ruleName] as rules
在Cypher中,当您聚合时,非聚合变量成为分组键,因此每行都有约束、rel id和rel类型,以及所有具有相同约束、rel id和rel类型的规则
编辑
好的,听起来您想要获取共享相同约束集合的规则集合。这对你有用吗
MATCH (rule:Rule)-[rel:VALIDATED_IF]->(c:Constraint)
WITH rule, rel.id as relId, rel.type as relType, c
ORDER BY id(c)
WITH rule, relId, relType, collect(c) as constraints
WITH constraints, collect(rule) as rules
WHERE size(rules) > 1
RETURN [c in constraints | c.condition] as conditions, [r in rules | r.ruleName] as rules
好的,我通过改进解决了这个问题:
匹配(r1:规则)-[v1:已验证的\u IF]->(:约束)(c1:约束),
(r2)-[:已验证的_IF]->(c2:约束)
具有
r1,r2,
计数(不同的c1)为c1Count,计数(不同的c2)为c2Count
MATCH(r1)-(v1:VALIDATED_IF]->(c:Constraint)到底是什么,但给我提供了具有相同约束之一的规则?这意味着它返回具有一个共同约束的规则,而不是所有约束都不完全是我想要的,它返回与每个约束相关的所有规则。我需要的是与完全相同的约束组相关的所有规则
MATCH (r1:Rule)-[v1:VALIDATED_IF]->(:Constraint)<-[v2:VALIDATED_IF]-(r2:Rule)
WHERE
v1.id=v2.id AND v1.type = v2.type
MATCH
(r1)-[:VALIDATED_IF]->(c1:Constraint),
(r2)-[:VALIDATED_IF]->(c2:Constraint)
WITH
r1, r2,
COUNT(DISTINCT c1) AS c1Count, COUNT(DISTINCT c2) AS c2Count
MATCH (r1)-[v1:VALIDATED_IF]->(c:Constraint)<-[v2:VALIDATED_IF]-(r2)
WITH
r1, r2,
c1Count, c2Count, COUNT(c) AS commonConstraintsCount,
COLLECT(c.condition) AS cond // (5)\n" +
WHERE
ID(r1) < ID(r2) AND
commonConstraintsCount = c1Count AND
commonConstraintsCount = c2Count AND
c1Count = c2Count
RETURN r1.ruleName, r2.ruleName, cond
ORDER BY r1.ruleName, r2.ruleName