Gremlin:Return 在查询中创建了新边而不保存它们(相当于 APOC vRelationship)
Gremlin: Return new edges created in a query without saving them (equivalent to APOC vRelationship)
我有一个包含两种类型节点的图表:人物和房屋。在这个图中,人可以卖房子(SELLS
关系),而房子是由人买的(IS_BOUGHT_BY
关系)。这可以表示为下图:
(Person_1)-[:SELLS]->(House_1)-[:IS_BOUGHT_BY]->(Person_2)
可以通过 运行:
在 Neo4j 中创建此图的基本示例
CREATE(Person_1: Person {name:'Person 1'})
CREATE(House_1: House {name:'House 1', deal: 10238})
CREATE(Person_2: Person {name:'Person 2'})
CREATE
(Person_1)-[:SELLS]->(House_1),
(House_1)-[:IS_BOUGHT_BY]->(Person_2)
或者可以通过执行以下命令在 Gremlin 中创建:
g.
addV('Person').property('name', 'Person 1').as('p1').
addV('House').property('name', 'House 1').property('deal', 10238).as('h1').
addV('Person').property('name', 'Person 1').as('p2').
addE('SELLS').from('p1').to('h1').
addE('IS_BOUGHT_BY').from('h1').to('p2')
我想查询 returns 这些 Person 节点与一条名为 SELLS_HOUSE_TO
的假边相连,而不将这种关系保存在数据库中。此外,此 SELLS_HOUSE_TO
关系必须具有交易 属性 人 1 出售并由人 2 购买的房屋的交易 ID。换句话说,我希望查询的输出遵循下图:
(Person_1)-[:SELLS_HOUSE_TO {deal: house_1_deal}]->(Person_2)
其中id_deal
是House_1
节点的交易属性,通过SELLS
和[连接Person_1
和Person_2
=17=] 关系。
使用 APOC 库提供的 vRelationship
函数可以在 Neo4j 中轻松完成此查询:
MATCH (p1: Person)-[r1:SELLS]->(h1: House)-[r2:BUYS]->(p2: Person)
CALL apoc.create.vRelationship(p1, 'SELLS_HOUSE_TO', {deal: h1.deal}, p2) YIELD rel
RETURN p1, rel, p2
是否可以在 Gremlin 中执行类似的操作,而无需在某些步骤中将边存储在数据库中?
目前,除了可能使用 in-line 代码 (closure/lambda) 之外,Gremlin 无法将虚拟边缘注入查询结果。这可能是一个很好的功能请求,可以在 this location.
作为 Apache Tinkerpop 的 Jira 票证打开
作为一个短期解决方案,我认为你能做的最好的事情就是为可视化的需要创建边,也许给他们一个独特的 属性 键和值,比如 "virtual":true
并在不再需要时删除这些边。
我有一个包含两种类型节点的图表:人物和房屋。在这个图中,人可以卖房子(SELLS
关系),而房子是由人买的(IS_BOUGHT_BY
关系)。这可以表示为下图:
(Person_1)-[:SELLS]->(House_1)-[:IS_BOUGHT_BY]->(Person_2)
可以通过 运行:
在 Neo4j 中创建此图的基本示例CREATE(Person_1: Person {name:'Person 1'})
CREATE(House_1: House {name:'House 1', deal: 10238})
CREATE(Person_2: Person {name:'Person 2'})
CREATE
(Person_1)-[:SELLS]->(House_1),
(House_1)-[:IS_BOUGHT_BY]->(Person_2)
或者可以通过执行以下命令在 Gremlin 中创建:
g.
addV('Person').property('name', 'Person 1').as('p1').
addV('House').property('name', 'House 1').property('deal', 10238).as('h1').
addV('Person').property('name', 'Person 1').as('p2').
addE('SELLS').from('p1').to('h1').
addE('IS_BOUGHT_BY').from('h1').to('p2')
我想查询 returns 这些 Person 节点与一条名为 SELLS_HOUSE_TO
的假边相连,而不将这种关系保存在数据库中。此外,此 SELLS_HOUSE_TO
关系必须具有交易 属性 人 1 出售并由人 2 购买的房屋的交易 ID。换句话说,我希望查询的输出遵循下图:
(Person_1)-[:SELLS_HOUSE_TO {deal: house_1_deal}]->(Person_2)
其中id_deal
是House_1
节点的交易属性,通过SELLS
和[连接Person_1
和Person_2
=17=] 关系。
使用 APOC 库提供的 vRelationship
函数可以在 Neo4j 中轻松完成此查询:
MATCH (p1: Person)-[r1:SELLS]->(h1: House)-[r2:BUYS]->(p2: Person)
CALL apoc.create.vRelationship(p1, 'SELLS_HOUSE_TO', {deal: h1.deal}, p2) YIELD rel
RETURN p1, rel, p2
是否可以在 Gremlin 中执行类似的操作,而无需在某些步骤中将边存储在数据库中?
目前,除了可能使用 in-line 代码 (closure/lambda) 之外,Gremlin 无法将虚拟边缘注入查询结果。这可能是一个很好的功能请求,可以在 this location.
作为 Apache Tinkerpop 的 Jira 票证打开作为一个短期解决方案,我认为你能做的最好的事情就是为可视化的需要创建边,也许给他们一个独特的 属性 键和值,比如 "virtual":true
并在不再需要时删除这些边。