Spring Data Neo4j通过一些ID数组查找节点

时间:2020-01-30 19:06:01

标签: neo4j cypher

我正在尝试编写一个查询,用于按其他3个关系节点搜索节点:

@Query("MATCH " +
        "(n:DTTOVAR)-[cnorr:LIKE_CONSIGNOR]->(consignor:COMPANY), " +
        "(n:DTTOVAR)-[prodr:LIKE_PRODUCER]->(producer:COMPANY), " +
        "(n:DTTOVAR)-[cneer:LIKE_CONSIGNEE]->(consignee:COMPANY), " +
        "WHERE " +
        "id(consignor) in $0 AND id(producer) IN $1 AND id(consignee) IN $2 " +
        "RETURN n, cnorr, prodr, cneer, consignor, producer, consignee")
List<DTTovar> getAllByConsignorsProducersConsigneesPC(Long[] cnorsIds, Long[] producersIds, Long[] cneesIds);

但是!!!我需要cnorsIds,producersIds或cneesIds为null,然后从所有人查询或搜索中排除此条件。该怎么做?

4 个答案:

答案 0 :(得分:0)

如果此查询逻辑的ID列表为MATCH,则基本上会忽略null项:

OPTIONAL MATCH (n:DTTOVAR)-[cnorr:LIKE_CONSIGNOR]->(consignor:COMPANY)
WHERE $0 IS NOT NULL AND id(consignor) in $0
OPTIONAL MATCH (n)-[prodr:LIKE_PRODUCER]->(producer:COMPANY)
WHERE $1 IS NOT NULL AND id(producer) IN $1
OPTIONAL MATCH (n)-[cneer:LIKE_CONSIGNEE]->(consignee:COMPANY)
WHERE $2 IS NOT NULL AND id(consignee) IN $2
RETURN n, cnorr, prodr, cneer, consignor, producer, consignee

在我的neo4j版本上使用PROFILE,我发现IS NOT NULL测试是在执行相应的OPTIONAL MATCH项之前进行的,因此应该高效(最高)。

但是,您仍将获得不被忽略的术语结果的笛卡尔积。尚不清楚您是否可以接受。

答案 1 :(得分:0)

非常感谢,cybersam 我已经比较了我和您的瓦里安: 是我的: 配置文件匹配(n:DTTOVAR)-[cnorr:LIKE_CONSIGNOR]->(发货人:COMPANY),(n)-[prodr:LIKE_PRODUCER]->(生产者:COMPANY),(n)-[cneer:LIKE_CONSIGNEE]->(收货人:COMPANY),(n)-[编码器:CLASSIFIED_IN]->(代码:CUSTOMS_CODE) 如果情况为假[7065]为NULL,则为FALSE,然后为[7065]中的id(consignor),否则为true AND case null如果为FALSE,则为NULL,然后为null,返回id(producer),否则为true 如果FALSE然后在[5928,28769,7067]中id(收货人)为假,则AND情况[5928,28769,7067]为NULL AND case null如果为FALSE,则为NULL,然后为null的id(code),否则为true RETURN N,CNORR,发货人,PRODR,生产者,CNEER,收货人,编码器,代码

72490总数据库命中数在79毫秒内。

您的: 配置文件可选匹配(n:DTTOVAR)-[cnorr:LIKE_CONSIGNOR]->(consignor:COMPANY)在[7065]中不为空且id(consignor)为[7065] 可选匹配(n)-[prodr:LIKE_PRODUCER]->(producer:COMPANY)WHERE null不为null且id(producer)为null 可选匹配(n)-[cneer:LIKE_CONSIGNEE]->(收货人:COMPANY)在[5928、28769、7067]中不为空且ID [收货人]在[5928、28769、7067]中 可选匹配(n)-[编码器:CLASSIFIED_IN]->(代码:CUSTOMS_CODE),其中null为非null,且id(code)为null RETURN N,CNORR,发货人,PRODR,生产者,CNEER,收货人,编码器,代码

在42毫秒内总共716次db点击

但是(n:DTTOVAR)个节点的计数不同(变体中有152个节点,而我的中有105个。

我试图理解它。 enter image description here

enter image description here

答案 2 :(得分:0)

另一张结果图片:(您的变体中有一些不需要的节点)

enter image description here

enter image description here

答案 3 :(得分:0)

@Query("OPTIONAL MATCH (n:DTTOVAR)-[cnorr:LIKE_CONSIGNOR]->(consignor:COMPANY) WHERE $0 IS NOT NULL AND id(consignor) IN $0 " +
 "OPTIONAL MATCH (n)-[prodr:LIKE_PRODUCER]->(producer:COMPANY) WHERE $1 IS NOT NULL AND id(producer) IN $1 " +
 "OPTIONAL MATCH (n)-[cneer:LIKE_CONSIGNEE]->(consignee:COMPANY) WHERE $2 IS NOT NULL AND id(consignee) IN $2 " +
 "OPTIONAL MATCH (n)-[coder:CLASSIFIED_IN]->(code:CUSTOMS_CODE) WHERE $3 IS NOT NULL AND id(consignee) IN $3 " +
 "WITH n MATCH (n:DTTOVAR)-[cnorr:LIKE_CONSIGNOR]->(consignor:COMPANY), " +
 "(n)-[prodr:LIKE_PRODUCER]->(producer:COMPANY), " +
 "(n)-[cneer:LIKE_CONSIGNEE]->(consignee:COMPANY), " +
 "(n)-[coder:CLASSIFIED_IN]->(code:CUSTOMS_CODE), " +
 "(n)-[e:REGISTERED_AT]->(d:H_DAY)-[r:DAY_OF]->(m:H_MONTH)-[t:MONTH_OF]->(y:H_YEAR) " +
 "WHERE case $0 IS NULL when FALSE then id(consignor) in $0 else true end " +
 "AND case $1 IS NULL when FALSE then id(producer) in $1 else true end " +
 "AND case $2 IS NULL when FALSE then id(consignee) in $2 else true end " +
 "AND case $3 IS NULL when FALSE then id(code) in $3 else true end " +
 "RETURN n, cnorr, consignor, prodr, producer, cneer, consignee, coder, code, e,d,r,m,t,y")
List<DTTovar> getAllByConsignorsNNAndProducersAndConsigneesAndCustomsCode(Long[] cnorsId, Long[] producersId, Long[] cneesId, Long[] codesId);