Neo4j Cypher查询 - 将2个不同变量的元素收集到单个列表中

时间:2017-05-21 07:57:14

标签: neo4j cypher

我有以下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)

请帮助扩展我的查询,以便将chchildCh收集到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

但是这个查询没有删除所需的特征节点,我的测试失败了。我在上次查询时做错了什么?

4 个答案:

答案 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>