我有以下Cypher查询部分:
MATCH (ch:Characteristic) WHERE id(ch) = {characteristicId} WITH ch OPTIONAL MATCH (ch)<-[:SET_ON]-(v:Value)...
首先,我要(ch:Characteristic)
寻找characteristicId
,然后在我的查询的其余部分为此变量应用所需的逻辑。
我的Characteristic
也可以拥有(或不拥有)子Characteristic
个节点,例如:
(ch:Characteristic)-[:CONTAINS]->(childCh)
请帮助扩展我的查询,以便将ch
和childCh
收集到Characteristic
列表中,这样我就可以在我的其余查询中应用所需的这个列表中所有Characteristic
的逻辑。
更新 - 可能的解决方案#2
这是我目前的工作查询:
MATCH (chparent:Characteristic)
WHERE id(chparent) = {characteristicId}
OPTIONAL MATCH (chparent)-[:CONTAINS*]->(chchild:Characteristic)
WITH chparent, collect(distinct(chchild)) as childs
WITH childs + chparent as nodes
UNWIND nodes as ch
OPTIONAL MATCH (ch)<-[:SET_ON]-(v:Value)-[:SET_FOR]->(Decision)
OPTIONAL MATCH (v)-[:CONTAINS]->(vE) OPTIONAL MATCH (vE)-[:CONTAINS]->(vEE)
OPTIONAL MATCH (ch)-[:CONTAINS]->(cho:CharacteristicOption)
OPTIONAL MATCH (cho)-[:CONTAINS]->(choE) OPTIONAL MATCH (ch)-[:CONTAINS]->(chE)
DETACH DELETE choE, cho, ch, vEE, vE, v, chE
这是为了简化上述查询:
MATCH (ch:Characteristic)
WHERE (:Characteristic {id: {characteristicId}})-[:CONTAINS*]->(ch)
OPTIONAL MATCH (ch)<-[:SET_ON]-(v:Value)-[:SET_FOR]->(Decision)
OPTIONAL MATCH (v)-[:CONTAINS]->(vE)
OPTIONAL MATCH (vE)-[:CONTAINS]->(vEE)
OPTIONAL MATCH (ch)-[:CONTAINS]->(cho:CharacteristicOption)
OPTIONAL MATCH (cho)-[:CONTAINS]->(choE)
OPTIONAL MATCH (ch)-[:CONTAINS]->(chE)
DETACH DELETE choE, cho, ch, vEE, vE, v, chE
但是这个查询没有删除所需的特征节点,我的测试失败了。我在上次查询时做错了什么?
答案 0 :(得分:2)
您可以尝试使用apoc:
ArrayList<Item> itemList = new ArrayList<>();
...
Collections.sort(itemList, new Comparator<Item>() {
@Override
public int compare(Item item, Item t1) {
String s1 = item.getTitle();
String s2 = t1.getTitle();
return s1.compareToIgnoreCase(s2);
}
});
使用纯密码,您可以尝试这样的事情:
MATCH (chparent:Characteristic {characteristicId: <someid>})
OPTIONAL MATCH (chparent)-[:CONTAINS]->(chchild:Characteristic)
WITH apoc.coll.union(chparent,chchild) as distinctList
...
不确定您是否需要收集中的不同内容,但我添加了以便您知道可以执行此操作以过滤掉重复项。
答案 1 :(得分:1)
实际上,您可以使用0..1
的可变长度关系匹配来轻松完成此操作,因为它可以让您匹配根:特征节点及其任何子节点。
MATCH (chparent:Characteristic)-[:CONTAINS*0..1]->(ch:Characteristic)
WHERE id(chparent) = {characteristicId}
// ch contains both the parent and children, no need for a list
...
答案 2 :(得分:1)
更简化的查询。
MATCH (c:Characteristics) WHERE (:Characteristics {id: 123})-[:CONTAINS*0..1]->(c) return c;
匹配所有特征,包括根节点(可选)具有来自使用id 123指定的节点的CONTAINS类型的传入关系。
答案 3 :(得分:0)
我假设所有特征的孩子都有标签特征。我做的另一个假设是,你需要由你定义的 characteristicId ,而不是neo4J定义的内部id。 id(ch)获取内部ID而不是用户定义的ID。你可能想传递像我在这里给出的characteristicId变量。
MATCH (chparent:Characteristic {characteristicId: <someid>})
WITH chparent
OPTIONAL MATCH (chparent)-[:CONTAINS]->(chchild:Characteristic)
WITH chchild
<your operation>