我对图形数据库和 Neo4j 总体来说还很陌生,但尝试使用这种方法解决问题。
我有两个数据集,一个具有
addresses
和 DOC_ID
,其中许多地址通过 is_in
关系与文档相关。每个 DOC_ID
中可以有多个地址。
第二个数据集具有主页
owners
和 DOC_ID
,其中 owners
与每个文档 ID 具有 is_in
关系。
数据集 1 如下所示。
address DOC_ID
1 123 Rock Rd 0134
2. 456 John Drive 2157
3. 789 York St. 9871
4. 927 Farm Ct. 9871
...
数据集 2 也类似:
owner DOC_ID
1 John D. 0134
2. Sarah Cote 2157
3. Jack Ma 9871
...
我用来加载这些数据的查询:
# Dataset 1 with addresses
LOAD CSV WITH HEADERS FROM 'file:///addresses.csv' AS row
WITH row WHERE row.address IS NOT NULL
MERGE (l:location {address: row.address, doc_id:row.DOC_ID})
MERGE (d:doc {doc_id:row.DOC_ID})
MERGE (l)-[r:is_in]->(d)
# Dataset 2 with home owners
LOAD CSV WITH HEADERS FROM 'file:///owners.csv' AS row
WITH row WHERE row.owner IS NOT NULL
MERGE (n:home_owner {name: row.owner, doc_id:row.DOC_ID})
MERGE (d:doc {doc_id:row.DOC_ID})
MERGE (n)-[r:is_in]->(d)
地址数据集包含所有者的地址以及其他不相关的地址。此外,相同的所有者可能会出现在不同的名称下,但我知道他们应该具有相同的地址。我最终想做的是揭露
owner
以不同名称运营的实体。
我可以推理某些事情,例如与所有者的地址相比,地址在数据集中出现的次数相对较少,而所有者的地址应该出现在与该所有者相关的大多数文档中。所以我在下面写了这个查询,这将有助于整理一些所有者地址。但我从这个查询中得到 0 个结果。
MATCH(n:home_owner-[f:is_in]->(d:doc)<-[r:is_in]-(l:location)
WITH l, n, count(r) as rct
WHERE rct > 20
RETURN l, n
我想知道这是我的查询有问题,还是我的逻辑不正确。或者neo4j中有没有更好的方法来解决这个问题?任何帮助/见解将不胜感激。
第二行:WITH l, n, count(r) as rct 是问题所在。当您进行聚合时,它将在分组中包含 l 和 n(类似于 SQL group by)。因此,您没有获得正确的 rct 计数,因为每个位置和所有者在分组中都被计为 1。这是您问题的正确查询。
MATCH (n:home_owner)-[r:is_in]->(:doc)<-[:is_in]-(:location)
//find the homeowners with more than 20 address
WITH n, count(r) as rct WHERE rct > 20
//find the location of those homeowners
MATCH (n)-[:is_in]->(:doc)<-[:is_in]-(l:location)
RETURN n, l
其次,您的加载脚本存在拼写错误。我现在改正了。
old: MERGE (d:doc {DOC_ID})
correct: MERGE (d:doc {doc_id:row.DOC_ID})
old: MERGE (n)-[r:is_in]->(b)
correct: MERGE (n)-[r:is_in]->(d)