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

ercv8c1e  于 2022-10-01  发布在  其他
关注(0)|答案(1)|浏览(193)

总的来说,我对图形数据库和neo4j非常陌生,但我正在尝试使用这种方法来解决问题。

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

第二数据集具有主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 中有更好的方法来解决这个问题?任何帮助/见解都将不胜感激。

vltsax25

vltsax251#

第二行:使用l,n,count(R)作为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)

相关问题