Cypher查询通过关系显示相同的实体



我对图形数据库和neo4j很陌生,但我试图使用这种方法解决问题。

我有两个数据集,一个是addressesDOC_ID,其中许多地址通过is_in关系与文档相关。每个CCD_ 4中可以有许多地址。

第二个数据集具有主ownersDOC_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计数,因为位置和所有者中的每个在分组中都被计算为一个。这是对您问题的正确查询。

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

其次,加载脚本时会出现拼写错误。我现在纠正了它们。

具有地址的数据集1
old: MERGE (d:doc {DOC_ID})
correct: MERGE (d:doc {doc_id:row.DOC_ID})
拥有房屋所有者的数据集2
old: MERGE (n)-[r:is_in]->(b)
correct: MERGE (n)-[r:is_in]->(d)

最新更新