簡體   English   中英

如何在 Cypher Neo4j 中獲取不包含(相關)具有特定屬性的節點的所有節點

[英]How do I get all nodes that do not contain (relate) nodes with certain property in Cypher Neo4j

我有一個案例,我需要找到不包含(相關)所有必需節點的節點。

我的業務邏輯如下:

* A Trajectory contains several Points.
* A Trajectory is complete when it has at least:
  * ONE Point START
  * ONE Point MIDDLE
  * ONE Point FINISH

在下面的例子中,我有 4 條軌跡

http://console.neo4j.org/?id=1fjeyl

一個軌跡是完整的,其他三個是不完整的。

如何找到不包含所有必需點的所有軌跡?

有幾種方法可以做到這一點。

使用此模型,一種方法是您可以收集每個軌跡的節點並使用列表謂詞僅包含缺少任何所需位置的軌跡:

MATCH (t:Trajectory)-[:CONTAINS]->(p)
WITH t, collect(DISTINCT p.pos) as pointPositions
WHERE size(pointPositions) < 3 OR any(required in ['START', 'END', 'MIDDLE'] WHERE NOT required IN pointPositions)
RETURN t

請注意,如果您重構模型,使得點的位置由關系點指示,例如:

(:Trajectory)-[:HAS_START]->(:Point)
(:Trajectory)-[:HAS_END]->(:Point)
(:Trajectory)-[:HAS_MIDDLE]->(:Point)

然后你的查詢會更簡單一些,效率也會提高(當你有很多軌跡,一些有很多連接的節點時,這將顯示最大的收益)。

MATCH (t:Trajectory)
WHERE NOT (t)-[:HAS_START]->() OR NOT (t)-[:HAS_END]->() OR NOT (t)-[:HAS_MIDDLE]->()
RETURN t

通過這種建模和這種查詢,我們甚至不必從軌跡節點擴展到我們的答案,因為節點知道與其連接的關系(按類型和/或方向)及其計數。 然后很容易確定某些關系類型是否存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM