Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
neo4j中基于时间/日期的搜索_Neo4j_Cypher_Graph Databases - Fatal编程技术网

neo4j中基于时间/日期的搜索

neo4j中基于时间/日期的搜索,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,在玩neo4j时,出现了几个问题。目前有两种: 在搜索从节点X到节点Y的特定路径(RegEx?/Wildcard?)时,如何限制关系/边?例如,所有边都有两个时间属性,“开始”和“结束”。我想找到发生在凌晨2点到凌晨3点之间的节点之间的路径 如何跟踪时间路径?假设一辆汽车从“a”行驶到“B”。这条路线花了一个小时,即从早上5点到早上6点。下一段,从“B”到“C”也花了一个小时,但从早上7点到早上8点,因为司机休息了一个小时。如何以只允许逻辑有效(时间)路径的方式查询neo4j。例如,这应该是有

在玩neo4j时,出现了几个问题。目前有两种:

  • 在搜索从节点X到节点Y的特定路径(RegEx?/Wildcard?)时,如何限制关系/边?例如,所有边都有两个时间属性,“开始”和“结束”。我想找到发生在凌晨2点到凌晨3点之间的节点之间的路径
  • 如何跟踪时间路径?假设一辆汽车从“a”行驶到“B”。这条路线花了一个小时,即从早上5点到早上6点。下一段,从“B”到“C”也花了一个小时,但从早上7点到早上8点,因为司机休息了一个小时。如何以只允许逻辑有效(时间)路径的方式查询neo4j。例如,这应该是有效的:
(布拉格)-[:DISTANCE{begin:'5am',end:'6am'}]>(Brno),(Brno)-[:DISTANCE{begin:'7am',end:'9am'}]>(Liberec)

鉴于本条无效:

(布拉格)-[:DISTANCE{begin:'5am',end:'6am'}]>(Brno),(Brno)-[:DISTANCE{begin:'4am',end:'6am'}]>(Liberec)

另一个例子是下图:

CREATE (a:BoxingMachine {title: 'A'})
CREATE (b:BoxingMachine {title: 'B'})
CREATE (c:BoxingMachine {title: 'C'})
CREATE (d:BoxingMachine {title: 'D'})
CREATE ((a)-[:FORWARDED {start_time:  '9:00 am'}]->(b))
CREATE ((a)-[:FORWARDED {start_time:  '7:00 am'}]->(c))
CREATE ((c)-[:FORWARDED {start_time:  '8:00 am'}]->(b))
CREATE ((a)-[:FORWARDED {start_time: '11:00 am'}]->(d))
CREATE ((d)-[:FORWARDED {start_time: '10:00 am'}]->(b))
我正在查找从节点“A”到节点“B”的路径。忽略“开始时间”约束,我们在该图中有3条可能的路径:

  • 'A'-->'B'
  • 'A'-->'C'-->'B'
  • 'A'-->'D'-->'B'

在考虑约束“StaseTimeTimes”的情况下,剩下两条路径:

  • 'A'-->'B'
  • 'A'-->'C'-->'B'
因为路径
'A'-->'D'-->'B'
无效。在这种情况下,时间顺序是错误的。Cooworker“A”在上午11点向Cooworker“D”发送一个包,但Cooworker在一小时前将此特定包转发给了Cooworker“B”。巫婆是不可能的


PS:是否有一个工具可以生成具有ASCII art resp边的节点。对于控制台?:)

首先,我建议您使用数字时间值而不是字符串。这将使密码更简单、更有效。而且,实际上,路径可以跨越多天,因此只提供一天中的某个时间将导致错误的结果。例如,您可能希望使用。在我的回答中,我假设时间是数字

此查询应仅返回从A到B的有效路径:

MATCH p=(a:BoxingMachine{title: 'A'})-[:FORWARDED*]->(b:BoxingMachine{title: 'B'})
WITH p, RELATIONSHIPS(p) AS rels
WHERE REDUCE(s = true, i IN RANGE(1, SIZE(rels)-1) |
  CASE WHEN (rels[i]).start_time > (rels[i-1]).start_time
  THEN s
  ELSE false END)
RETURN p;
REDUCE
子句负责检查候选路径中的开始时间是否合理

您可以使用此数据检查结果(使用简单的数字时间值,但也可以使用历元时间):


@伊夫克尼维尔:还有什么你需要知道的吗?非常感谢,你的回答足以理解在这种特殊情况下如何遍历图表<代码>减少和<代码>相关性是我正在寻找的缺失部分。请记住对你的问题最有效的答案。
CREATE (a:BoxingMachine {title: 'A'}) 
CREATE (b:BoxingMachine {title: 'B'}) 
CREATE (c:BoxingMachine {title: 'C'}) 
CREATE (d:BoxingMachine {title: 'D'}) 
CREATE ((a)-[:FORWARDED {start_time:  9}]->(b)) 
CREATE ((a)-[:FORWARDED {start_time:  7}]->(c)) 
CREATE ((c)-[:FORWARDED {start_time:  8}]->(b)) 
CREATE ((a)-[:FORWARDED {start_time: 11}]->(d)) 
CREATE ((d)-[:FORWARDED {start_time: 10}]->(b))