如何在Cypher中表达以下内容
"返回所有节点,其中至少有一个类型A的传入边缘和否传出边缘"。
最好的问候
答案 0 :(得分:6)
您可以使用模式从结果子集中排除节点,如下所示:
MATCH ()-[:A]->(n) WHERE NOT (n)-->() RETURN n
答案 1 :(得分:0)
尝试
MATCH (n)
WHERE ()-[:A]->n AND NOT n-->()
RETURN n
或
MATCH ()-[:A]->(n)
WHERE NOT n-->()
RETURN DISTINCT n
修改强>
模式表达式既可用于模式匹配,也可用作过滤的谓词。如果在MATCH
子句中使用,则回答模式的路径将包含在结果中。如果用于过滤,则在WHERE
子句中,模式用作先前已匹配的路径的限制条件。结果是有限的,未扩展到包括过滤条件。当模式用作过滤的谓词时,该谓词的否定也是可用作过滤条件的谓词。没有路径可以回答模式的否定(如果存在这样的事情),那么在MATCH
子句中不能使用模式的否定。短语
返回所有节点,其中至少有一个类型A的传入边缘,没有传出边
涉及节点n
上的两种模式,即any incoming relationship [:A] on n
和any outgoing relationship on n
。第二个必须被解释为谓词过滤条件的模式,因为它涉及否定not any outgoing relationship on n
。但是,第一个可以解释为与n
匹配的模式,或者解释为另一个模式谓词过滤条件。
这两种解释产生了上面的两个密码查询。第一个查询匹配所有节点,并使用两种模式过滤结果。第二个匹配n
上的传入关系以及n
,并使用第二个模式过滤结果。
第一个查询将在过滤发生前仅匹配每个节点一次。因此,它将为每个符合条件的节点返回一个结果项。对于每个路径,第二个查询将匹配模式any incoming relationship [:A] on n
,即n
上的每个传入关系一次。因此,它可能在结果中多次包含一个节点,因此DISTINCT
关键字可以删除双精度数。
如果感兴趣的项目恰好是节点,那么在WHERE
子句中使用两种模式作为谓词在我看来是正确的解释。它也更有效,因为它需要在[:A]
上只找到零或一个传入的n
来解析谓词。如果传入的关系也是有意义的,那么第二个查询的某个版本是正确的选择。人们需要绑定关系并对它做一些有用的事情,比如返回它。
以下是在' fresh'上执行的两个查询的执行计划。 neo4j console
First query:
----
Filter
|
+AllNodes
+----------+------+--------+-------------+------------------------------------------------------------------------------------------------------------------------------+
| Operator | Rows | DbHits | Identifiers | Other |
+----------+------+--------+-------------+------------------------------------------------------------------------------------------------------------------------------+
| Filter | 0 | 0 | | (nonEmpty(PathExpression((17)-[ UNNAMED18:A]->(n), true)) AND NOT(nonEmpty(PathExpression((n)-[ UNNAMED36]->(40), true)))) |
| AllNodes | 6 | 7 | n, n | |
+----------+------+--------+-------------+------------------------------------------------------------------------------------------------------------------------------+
Second query:
----
Distinct
|
+Filter
|
+TraversalMatcher
+------------------+------+--------+-------------+--------------------------------------------------------------+
| Operator | Rows | DbHits | Identifiers | Other |
+------------------+------+--------+-------------+--------------------------------------------------------------+
| Distinct | 0 | 0 | | |
| Filter | 0 | 0 | | NOT(nonEmpty(PathExpression((n)-[ UNNAMED30]->(34), true))) |
| TraversalMatcher | 0 | 13 | | n, UNNAMED8, n |
+------------------+------+--------+-------------+--------------------------------------------------------------+