如果我有一个neo4j数据库,我想查询以获取一个特定的脱节子图中的所有节点。 (在py2neo或cypher中)
如果我有节点组,则每个组中的节点按该组内的关系连接,但不在组之间连接。我可以查询一个节点并获取该节点组中的所有节点吗?
答案 0 :(得分:1)
如果添加了图表或一些示例数据,可能会有所帮助。但是,如果我正确理解您的数据模型,那么您将节点的“组”定义为通过某种关系连接的所有节点?因此,要获取“group1”节点的所有成员(让我们将其定义为通过group1关系连接的所有节点)而不是连接到group2的任何节点,您可以使用如下查询:
MATCH (a:Person)-[:GROUP1]-(b:Person)
WHERE NOT exists((a)-[:GROUP2]-())
RETURN a
您还可以使用Node labels来定义节点组。
答案 1 :(得分:1)
[增订]
如果“节点组”是指“不相交的子图”,下面是如何获取包含特定节点(例如{{1}的不相交子图(具有任何类型的关系)中的所有节点节点):
Neo
此查询使用MATCH (n { name: "Neo" })
OPTIONAL MATCH p=(n)-[*]-(m)
RETURN REDUCE(s = [n], x IN COLLECT(NODES(p)) |
REDUCE(t = s, y IN x | CASE WHEN y IN t THEN t ELSE t + y END )) AS nodes;
来查找与OPTIONAL MATCH
节点“相关”的节点,这样如果该节点没有关系,则查询仍然可以返回结果。
两个(嵌套的)Neo
子句确保返回的集合只有不同的节点。
外部REDUCE
子句使用REDUCE
节点初始化结果集合,因为它必须始终位于不相交的子图中,即使没有其他节点。
n
这个更简单的查询(返回节点行)使用MATCH p=(n { name: "Neo" })-[r*0..]-(m)
WITH NODES(p) AS nodes
UNWIND nodes AS node
RETURN DISTINCT node
来允许0长度路径(即[r*0..]
不需要任何关系 - n
可以是与m
相同。它使用n
将UNWIND
个节点集合转换为行,然后使用nodes
来消除重复项。
下面的替代解决方案(返回节点行)也应该有效,除了当前存在一个错误(that I just reported)导致在查询展开DISTINCT
后遗忘所有标识符(例如,如果NULL
无法找到匹配项,则会发生这种情况。由于此错误,如果OPTIONAL MATCH
节点没有关系,则下面的查询当前不返回任何结果。因此,您必须使用上述查询,直到修复错误。
Neo