我有一个大小为260GB的庞大数据库,它存储了大量的交易信息。它有Agent,Customer,Phone,ID_Card作为节点。关系如下: Agent_Send,Customer_Send,Customer_at_Agent,Customer_used_Phone,Customer_used_ID。
单个代理连接到许多客户。因此在查询路径时命中代理节点是不可行的。以下是我的询问:
match p=((ph: Phone {Phone_ID : "3851308.0"})-[r:Customer_Send
| Customer_used_ID | Customer_used_Phone *1..5]-(n2))
with nodes(p) as ns
return extract (node in ns | Labels(node) ) as Labels
我从一个电话号码开始,并尝试提取一个大客户"网络。我故意不接触" Customer_at_Agent"上述网络化查询中的关系,因为就性能而言,它不是最佳的。
因此,我们的想法是提取所有"客户"从路径标记节点并将其与[Customer_at_Agent]关系匹配。
例如:
match p=((ph: Phone {Phone_ID : "3851308.0"})-[r:Customer_Send
| Customer_used_ID | Customer_used_Phone *1..5]-(n2))
with nodes(p) as ns
return extract (node in ns | Labels(node) ) as Labels
of "type customer as c "
optional match (c)-[r1:Customer_at_Agent]-(n3)
return distinct p,r1
我还是neo4j和cypher的新手,我无法找到一个只能提取"客户"来自路径的节点并在可选匹配中使用它。
提前致谢。
答案 0 :(得分:1)
使用过滤器表示法而不是提取,您可以删除任何未标记为正确的节点。请尝试使用此查询:
MATCH p = (ph:Phone {Phone_ID : "3851308.0"}) - [:Customer_Send|:Customer_used_ID|:Customer_used_Phone*1..5] - ()
WITH ph, [node IN NODES(p) WHERE node:Customer] AS customer_nodes
UNWIND customer_nodes AS c_node
OPTIONAL MATCH (c_node) - [r1:Customer_at_Agent] - ()
RETURN ph, COLLECT(DISTINCT r1)
因此第二行获取电话号码和生成的路径,并为您提供客户标签为customer_nodes
的节点列表。然后,您可以展开此列表,以便在路径匹配中使用单个节点。第4行执行您的可选匹配并找到您感兴趣的r1
,然后第5行将返回您开始时的电话号码节点以及您在客户上找到的所有r1
关系的集合节点连接到该电话号码。
更新:我添加了一些修改来清理你的第一个查询行。如果您不打算使用别名(例如第一行中的r
或n2
),则不要首先分配它们;它们会影响性能并导致混淆。如果您实际上没有任何限制,那么空节点和关系就完全没了问题。您也不需要括号来标记路径;它们被用作Cypher的ASCII艺术的核心部分来表示节点,所以我发现它们更容易混淆而不是有用。