使用Cypher添加与现有节点的关系不起作用

时间:2017-04-11 13:03:14

标签: neo4j cypher relationships

我正在使用Neo4J图形数据库1.1.5网络版本处理巴拿马数据集。我在数据库中确定了摩尔多瓦前总理Ion Sturza,并希望制作他相关网络的地图。我使用以下代码使用Cypher进行查询(创建变量'IonSturza'):

MATCH (IonSturza {name: "Ion Sturza"}) RETURN IonSturza

我发现实体'CONSTANTIN LUTSENKO'与'Quade ..'和'Kinbo ...'等实体的链接方式不同,其名称用小字母表示this图片。因此,我希望在大写锁定和未加盖的版本之间映射关系“SAME_COMPANY_AS”。我根据@StefanArmbruster的this回答尝试了以下代码:

MATCH (a:Officer {name :"Constantin Lutsenko"}),(b:Officer{name : 
"CONSTANTIN LUTSENKO"})
where (a:Officer{name :"Constantin Lutsenko"})-[:SHAREHOLDER_OF]-> 
(b:Entity{id:'284429'})
CREATE (a)-[:SAME_COMPANY_AS]->(b)

我使用'where'语句来指定uncapped版本,而不是索引,而是只链接到id为'284429'的实体。 但是,我的代码显示了笛卡尔积产品错误消息:

  
    

此查询在断开连接的模式之间构建笛卡尔积。如果查询的一部分包含多个断开连接的模式,这将在所有这些部分之间构建笛卡尔积。这可能会产生大量数据并减慢查询处理速度。虽然偶尔有意,但通常可以重新制定避免使用此交叉产品的查询,可能通过在不同部分之间添加关系或使用OPTIONAL MATCH(标识符为:(b))<<

  

当我执行时,没有变化,没有行!我在这里错过了什么?有人可以帮我在节点之间插入这种关系。提前谢谢!

2 个答案:

答案 0 :(得分:3)

只要您在两个或多个断开连接的模式上进行匹配,就会显示笛卡尔积产品警告。但是,在这种情况下,它很好,因为您通过可能唯一的名称来查找它们,您的结果应该是每个节点。

如果该模式的每个单独部分返回多个节点,那么您将拥有(a行)x(b行),这两个结果集之间是笛卡尔积。

因此,在这种特殊情况下,请不要注意警告。

至于为什么您没有看到更改,请注意您为图表的不同部分重复使用变量:您将变量b用于大写版本的官员,并为你的WHERE中的实体。没有与两者都匹配的节点。

相反,为每个变量使用不同的变量,并在匹配中包含:实体。此外,一旦匹配节点并将它们绑定到变量,您可以在查询中稍后重用变量名称,而不必重复其标签或属性。

试试这个:

MATCH (a:Officer {name :"Constantin Lutsenko"})-[:SHAREHOLDER_OF]-> 
(:Entity{id:'284429'}),(b:Officer{name : "CONSTANTIN LUTSENKO"})
CREATE (a)-[:SAME_COMPANY_AS]->(b)

虽然我不太确定你要做什么......是:公司的主管?这种关系类型看起来并不合适。

答案 1 :(得分:0)

我尝试了@InverseFalcon的答案,并且由于它,通过将属性标识符从'id'修改为'name'并使用'a'和'b'的属性,通过以下代码创建了4个关系:

MATCH (a:Officer {name :"Constantin Lutsenko"})-[:SHAREHOLDER_OF]-> 
(:Entity{name:'KINBOROUGH PORTFOLIO LTD.'}),(b:Officer{name : "CONSTANTIN 
LUTSENKO"})-[:SHAREHOLDER_OF]->(:Entity{name:'Chandler Group Holdings Ltd'})
CREATE (a)-[:SAME_NAME_AS]->(b)

非常感谢@InverseFalcon!