我对图形数据库和neo4j很陌生,但我试图使用这种方法解决问题。
我有两个数据集,一个是addresses
和DOC_ID
,其中许多地址通过is_in
关系与文档相关。每个CCD_ 4中可以有许多地址。
第二个数据集具有主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计数,因为位置和所有者中的每个在分组中都被计算为一个。这是对您问题的正确查询。
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)